From e3c09d7f0d67645b97da64b29109c52bc735fbdd Mon Sep 17 00:00:00 2001 From: roxwize Date: Wed, 13 Nov 2024 22:51:08 -0500 Subject: [PATCH] this is the initial commit for my AWESOME website Signed-off-by: roxwize --- .env.example | 2 + .gitignore | 2 + LICENSE | 674 +++++++ README.md | 4 + db/schema.ts | 54 + drizzle.config.ts | 11 + drizzle/0000_aromatic_night_nurse.sql | 34 + drizzle/0001_famous_silver_surfer.sql | 14 + drizzle/0002_amusing_ultimatum.sql | 2 + drizzle/0003_secret_blacklash.sql | 6 + drizzle/0004_freezing_warpath.sql | 1 + drizzle/0005_magical_swarm.sql | 18 + drizzle/meta/0000_snapshot.json | 159 ++ drizzle/meta/0001_snapshot.json | 205 ++ drizzle/meta/0002_snapshot.json | 205 ++ drizzle/meta/0003_snapshot.json | 206 ++ drizzle/meta/0004_snapshot.json | 212 ++ drizzle/meta/0005_snapshot.json | 279 +++ drizzle/meta/_journal.json | 48 + main.ts | 179 ++ package.json | 39 + pnpm-lock.yaml | 2600 +++++++++++++++++++++++++ routes/login.ts | 124 ++ routes/users.ts | 153 ++ routes/util.ts | 48 + static/css/dashboard.css | 62 + static/css/main.css | 176 ++ static/fonts/gohufont-14.ttf | Bin 0 -> 30680 bytes static/fonts/gohufont-14.woff | Bin 0 -> 8028 bytes static/fonts/josefin.ttf | Bin 0 -> 117720 bytes static/fonts/josefin.woff | Bin 0 -> 56376 bytes static/img/logo.png | Bin 0 -> 460 bytes static/img/logo.svg | 1 + static/img/logotransition.png | Bin 0 -> 153 bytes static/moods.txt | 1 + tsconfig.json | 9 + views/dashboard.pug | 56 + views/index.pug | 30 + views/login.pug | 8 + views/register.pug | 12 + views/site.pug | 46 + views/user.pug | 30 + 42 files changed, 5710 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 db/schema.ts create mode 100644 drizzle.config.ts create mode 100644 drizzle/0000_aromatic_night_nurse.sql create mode 100644 drizzle/0001_famous_silver_surfer.sql create mode 100644 drizzle/0002_amusing_ultimatum.sql create mode 100644 drizzle/0003_secret_blacklash.sql create mode 100644 drizzle/0004_freezing_warpath.sql create mode 100644 drizzle/0005_magical_swarm.sql create mode 100644 drizzle/meta/0000_snapshot.json create mode 100644 drizzle/meta/0001_snapshot.json create mode 100644 drizzle/meta/0002_snapshot.json create mode 100644 drizzle/meta/0003_snapshot.json create mode 100644 drizzle/meta/0004_snapshot.json create mode 100644 drizzle/meta/0005_snapshot.json create mode 100644 drizzle/meta/_journal.json create mode 100644 main.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 routes/login.ts create mode 100644 routes/users.ts create mode 100644 routes/util.ts create mode 100644 static/css/dashboard.css create mode 100644 static/css/main.css create mode 100644 static/fonts/gohufont-14.ttf create mode 100644 static/fonts/gohufont-14.woff create mode 100644 static/fonts/josefin.ttf create mode 100644 static/fonts/josefin.woff create mode 100644 static/img/logo.png create mode 100644 static/img/logo.svg create mode 100644 static/img/logotransition.png create mode 100644 static/moods.txt create mode 100644 tsconfig.json create mode 100644 views/dashboard.pug create mode 100644 views/index.pug create mode 100644 views/login.pug create mode 100644 views/register.pug create mode 100644 views/site.pug create mode 100644 views/user.pug diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..edfd346 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +DATABASE_URL= +COOKIE_SECRET= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..713d500 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +.env diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4979026 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 2024 roxwize + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) 2024 roxwize + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e9d90b8 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# MiPilin +This website lets you check on how your friends are doing, which is a very good and noble thing and something you should feel proud of yourself for even considering. Also you can let YOUR friends know how YOU'RE doing. I guess. + +MiPilin **MiPilin** diff --git a/db/schema.ts b/db/schema.ts new file mode 100644 index 0000000..4266e0f --- /dev/null +++ b/db/schema.ts @@ -0,0 +1,54 @@ +import { + boolean, + integer, + pgTable, + primaryKey, + timestamp, + varchar +} from "drizzle-orm/pg-core"; + +export const users = pgTable("users", { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + email: varchar().unique().notNull(), //! make this required on signup + name: varchar({ length: 26 }).unique().notNull(), + pass: varchar({ length: 255 }).notNull(), + registered: timestamp().notNull(), + moderator: boolean().default(false).notNull(), + banned: boolean().default(false).notNull() //! Not actually functional, banned users can still login +}); + +export const updates = pgTable("updates", { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + user: integer() + .references(() => users.id, { onDelete: "cascade" }) + .notNull(), + mood: integer().default(0).notNull(), + description: varchar({ length: 512 }).default("").notNull(), + date: timestamp().notNull() +}); + +export const profiles = pgTable("profiles", { + user: integer() + .references(() => users.id, { onDelete: "cascade" }) + .primaryKey() + .notNull(), + bio: varchar({ length: 1024 }).default("").notNull(), + website: varchar().default("").notNull() +}); + +export const follows = pgTable( + "follows", + { + userId: integer("user_id").references(() => users.id, { + onDelete: "cascade" + }), + followerId: integer("follower_id").references(() => users.id, { + onDelete: "cascade" + }) + }, + (table) => { + return { + pk: primaryKey({ columns: [table.userId, table.followerId] }) + }; + } +); diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..836ef1c --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,11 @@ +import "dotenv/config"; +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + out: "./drizzle", + schema: "./db/schema.ts", + dialect: "postgresql", + dbCredentials: { + url: process.env.DATABASE_URL + } +}); diff --git a/drizzle/0000_aromatic_night_nurse.sql b/drizzle/0000_aromatic_night_nurse.sql new file mode 100644 index 0000000..f47ce38 --- /dev/null +++ b/drizzle/0000_aromatic_night_nurse.sql @@ -0,0 +1,34 @@ +CREATE TABLE IF NOT EXISTS "updates" ( + "id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "updates_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), + "user" integer NOT NULL, + "mood" integer DEFAULT 0, + "description" varchar(2048) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "users" ( + "id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "users_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), + "name" varchar(26) NOT NULL, + "pass" varchar(255) NOT NULL, + "registered" timestamp NOT NULL, + "bio" varchar(2048) DEFAULT '', + "moderator" boolean DEFAULT false, + "banned" boolean DEFAULT false, + CONSTRAINT "users_name_unique" UNIQUE("name") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "updates" ADD CONSTRAINT "updates_user_users_id_fk" FOREIGN KEY ("user") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; + +CREATE TABLE "session" ( + "sid" varchar NOT NULL COLLATE "default", + "sess" json NOT NULL, + "expire" timestamp(6) NOT NULL +) +WITH (OIDS=FALSE); + +ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE; + +CREATE INDEX "IDX_session_expire" ON "session" ("expire"); diff --git a/drizzle/0001_famous_silver_surfer.sql b/drizzle/0001_famous_silver_surfer.sql new file mode 100644 index 0000000..cdb2ad5 --- /dev/null +++ b/drizzle/0001_famous_silver_surfer.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS "profiles" ( + "user" integer PRIMARY KEY NOT NULL, + "bio" varchar(2048) DEFAULT '' +); +--> statement-breakpoint +ALTER TABLE "users" ADD COLUMN "email" varchar NOT NULL;--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "profiles" ADD CONSTRAINT "profiles_user_users_id_fk" FOREIGN KEY ("user") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +ALTER TABLE "users" DROP COLUMN IF EXISTS "bio";--> statement-breakpoint +ALTER TABLE "users" ADD CONSTRAINT "users_email_unique" UNIQUE("email"); \ No newline at end of file diff --git a/drizzle/0002_amusing_ultimatum.sql b/drizzle/0002_amusing_ultimatum.sql new file mode 100644 index 0000000..a17bcbb --- /dev/null +++ b/drizzle/0002_amusing_ultimatum.sql @@ -0,0 +1,2 @@ +ALTER TABLE "profiles" ALTER COLUMN "bio" SET DATA TYPE varchar(1024);--> statement-breakpoint +ALTER TABLE "updates" ALTER COLUMN "description" SET DATA TYPE varchar(512); \ No newline at end of file diff --git a/drizzle/0003_secret_blacklash.sql b/drizzle/0003_secret_blacklash.sql new file mode 100644 index 0000000..f482ba2 --- /dev/null +++ b/drizzle/0003_secret_blacklash.sql @@ -0,0 +1,6 @@ +ALTER TABLE "profiles" ALTER COLUMN "bio" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "updates" ALTER COLUMN "mood" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "updates" ALTER COLUMN "description" SET DEFAULT '';--> statement-breakpoint +ALTER TABLE "updates" ALTER COLUMN "description" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "moderator" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "banned" SET NOT NULL; \ No newline at end of file diff --git a/drizzle/0004_freezing_warpath.sql b/drizzle/0004_freezing_warpath.sql new file mode 100644 index 0000000..f40df4b --- /dev/null +++ b/drizzle/0004_freezing_warpath.sql @@ -0,0 +1 @@ +ALTER TABLE "updates" ADD COLUMN "date" timestamp NOT NULL; \ No newline at end of file diff --git a/drizzle/0005_magical_swarm.sql b/drizzle/0005_magical_swarm.sql new file mode 100644 index 0000000..d3ee7ca --- /dev/null +++ b/drizzle/0005_magical_swarm.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS "follows" ( + "user_id" integer, + "follower_id" integer, + CONSTRAINT "follows_user_id_follower_id_pk" PRIMARY KEY("user_id","follower_id") +); +--> statement-breakpoint +ALTER TABLE "profiles" ADD COLUMN "website" varchar DEFAULT '' NOT NULL;--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "follows" ADD CONSTRAINT "follows_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "follows" ADD CONSTRAINT "follows_follower_id_users_id_fk" FOREIGN KEY ("follower_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..4e9cc78 --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,159 @@ +{ + "id": "7a6c6c4b-2c0a-424e-bf1a-142ab30f959d", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.updates": { + "name": "updates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "updates_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user": { + "name": "user", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mood": { + "name": "mood", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "description": { + "name": "description", + "type": "varchar(2048)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "updates_user_users_id_fk": { + "name": "updates_user_users_id_fk", + "tableFrom": "updates", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(26)", + "primaryKey": false, + "notNull": true + }, + "pass": { + "name": "pass", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "registered": { + "name": "registered", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "bio": { + "name": "bio", + "type": "varchar(2048)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "moderator": { + "name": "moderator", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_name_unique": { + "name": "users_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json new file mode 100644 index 0000000..6934f46 --- /dev/null +++ b/drizzle/meta/0001_snapshot.json @@ -0,0 +1,205 @@ +{ + "id": "e5a39ed0-96c3-43cf-9478-d038f2bc8bed", + "prevId": "7a6c6c4b-2c0a-424e-bf1a-142ab30f959d", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.profiles": { + "name": "profiles", + "schema": "", + "columns": { + "user": { + "name": "user", + "type": "integer", + "primaryKey": true, + "notNull": true + }, + "bio": { + "name": "bio", + "type": "varchar(2048)", + "primaryKey": false, + "notNull": false, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "profiles_user_users_id_fk": { + "name": "profiles_user_users_id_fk", + "tableFrom": "profiles", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.updates": { + "name": "updates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "updates_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user": { + "name": "user", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mood": { + "name": "mood", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "description": { + "name": "description", + "type": "varchar(2048)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "updates_user_users_id_fk": { + "name": "updates_user_users_id_fk", + "tableFrom": "updates", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(26)", + "primaryKey": false, + "notNull": true + }, + "pass": { + "name": "pass", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "registered": { + "name": "registered", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "moderator": { + "name": "moderator", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "users_name_unique": { + "name": "users_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json new file mode 100644 index 0000000..023da4f --- /dev/null +++ b/drizzle/meta/0002_snapshot.json @@ -0,0 +1,205 @@ +{ + "id": "330409e0-4bc1-408b-bc9d-58f0e35d5ab4", + "prevId": "e5a39ed0-96c3-43cf-9478-d038f2bc8bed", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.profiles": { + "name": "profiles", + "schema": "", + "columns": { + "user": { + "name": "user", + "type": "integer", + "primaryKey": true, + "notNull": true + }, + "bio": { + "name": "bio", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "profiles_user_users_id_fk": { + "name": "profiles_user_users_id_fk", + "tableFrom": "profiles", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.updates": { + "name": "updates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "updates_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user": { + "name": "user", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mood": { + "name": "mood", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "description": { + "name": "description", + "type": "varchar(512)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "updates_user_users_id_fk": { + "name": "updates_user_users_id_fk", + "tableFrom": "updates", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(26)", + "primaryKey": false, + "notNull": true + }, + "pass": { + "name": "pass", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "registered": { + "name": "registered", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "moderator": { + "name": "moderator", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "users_name_unique": { + "name": "users_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0003_snapshot.json b/drizzle/meta/0003_snapshot.json new file mode 100644 index 0000000..72a586c --- /dev/null +++ b/drizzle/meta/0003_snapshot.json @@ -0,0 +1,206 @@ +{ + "id": "76340b3d-907a-4a46-a13e-dff2c4bd98d4", + "prevId": "330409e0-4bc1-408b-bc9d-58f0e35d5ab4", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.profiles": { + "name": "profiles", + "schema": "", + "columns": { + "user": { + "name": "user", + "type": "integer", + "primaryKey": true, + "notNull": true + }, + "bio": { + "name": "bio", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "profiles_user_users_id_fk": { + "name": "profiles_user_users_id_fk", + "tableFrom": "profiles", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.updates": { + "name": "updates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "updates_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user": { + "name": "user", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mood": { + "name": "mood", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "description": { + "name": "description", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "updates_user_users_id_fk": { + "name": "updates_user_users_id_fk", + "tableFrom": "updates", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(26)", + "primaryKey": false, + "notNull": true + }, + "pass": { + "name": "pass", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "registered": { + "name": "registered", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "moderator": { + "name": "moderator", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "users_name_unique": { + "name": "users_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0004_snapshot.json b/drizzle/meta/0004_snapshot.json new file mode 100644 index 0000000..1e89794 --- /dev/null +++ b/drizzle/meta/0004_snapshot.json @@ -0,0 +1,212 @@ +{ + "id": "fded46bd-99e1-4cc3-9e18-e4d1f15c4bcb", + "prevId": "76340b3d-907a-4a46-a13e-dff2c4bd98d4", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.profiles": { + "name": "profiles", + "schema": "", + "columns": { + "user": { + "name": "user", + "type": "integer", + "primaryKey": true, + "notNull": true + }, + "bio": { + "name": "bio", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "profiles_user_users_id_fk": { + "name": "profiles_user_users_id_fk", + "tableFrom": "profiles", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.updates": { + "name": "updates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "updates_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user": { + "name": "user", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mood": { + "name": "mood", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "description": { + "name": "description", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "date": { + "name": "date", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "updates_user_users_id_fk": { + "name": "updates_user_users_id_fk", + "tableFrom": "updates", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(26)", + "primaryKey": false, + "notNull": true + }, + "pass": { + "name": "pass", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "registered": { + "name": "registered", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "moderator": { + "name": "moderator", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "users_name_unique": { + "name": "users_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0005_snapshot.json b/drizzle/meta/0005_snapshot.json new file mode 100644 index 0000000..1e08deb --- /dev/null +++ b/drizzle/meta/0005_snapshot.json @@ -0,0 +1,279 @@ +{ + "id": "f8ae31ec-68e9-4857-93b2-abd7f834e580", + "prevId": "fded46bd-99e1-4cc3-9e18-e4d1f15c4bcb", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.follows": { + "name": "follows", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "follower_id": { + "name": "follower_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "follows_user_id_users_id_fk": { + "name": "follows_user_id_users_id_fk", + "tableFrom": "follows", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "follows_follower_id_users_id_fk": { + "name": "follows_follower_id_users_id_fk", + "tableFrom": "follows", + "tableTo": "users", + "columnsFrom": [ + "follower_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "follows_user_id_follower_id_pk": { + "name": "follows_user_id_follower_id_pk", + "columns": [ + "user_id", + "follower_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.profiles": { + "name": "profiles", + "schema": "", + "columns": { + "user": { + "name": "user", + "type": "integer", + "primaryKey": true, + "notNull": true + }, + "bio": { + "name": "bio", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "website": { + "name": "website", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "profiles_user_users_id_fk": { + "name": "profiles_user_users_id_fk", + "tableFrom": "profiles", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.updates": { + "name": "updates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "updates_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user": { + "name": "user", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mood": { + "name": "mood", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "description": { + "name": "description", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "date": { + "name": "date", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "updates_user_users_id_fk": { + "name": "updates_user_users_id_fk", + "tableFrom": "updates", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(26)", + "primaryKey": false, + "notNull": true + }, + "pass": { + "name": "pass", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "registered": { + "name": "registered", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "moderator": { + "name": "moderator", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "users_name_unique": { + "name": "users_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 0000000..eeda2ed --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,48 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1731272572767, + "tag": "0000_aromatic_night_nurse", + "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1731312604109, + "tag": "0001_famous_silver_surfer", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1731313744748, + "tag": "0002_amusing_ultimatum", + "breakpoints": true + }, + { + "idx": 3, + "version": "7", + "when": 1731357649095, + "tag": "0003_secret_blacklash", + "breakpoints": true + }, + { + "idx": 4, + "version": "7", + "when": 1731358040516, + "tag": "0004_freezing_warpath", + "breakpoints": true + }, + { + "idx": 5, + "version": "7", + "when": 1731393095652, + "tag": "0005_magical_swarm", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/main.ts b/main.ts new file mode 100644 index 0000000..be0773a --- /dev/null +++ b/main.ts @@ -0,0 +1,179 @@ +//! TODO: There is like no error checking in queries at all +import type { Response, Request } from "express"; + +import "dotenv/config"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime.js"; + +import express from "express"; +import bodyParser from "body-parser"; +import session from "express-session"; +import connectPgSimple from "connect-pg-simple"; +import flash from "connect-flash"; + +import { drizzle } from "drizzle-orm/node-postgres"; +import { follows, profiles, updates, users } from "./db/schema.js"; +import { and, desc, eq } from "drizzle-orm"; + +// routes +import loginRoutes from "./routes/login.js"; +import userRoutes from "./routes/users.js"; +import { getMoods, render } from "./routes/util.js"; + +const db = drizzle(process.env.DATABASE_URL!); + +//! TODO: Make sure SQL queries arent being repeated too much +(async () => { + const { moods, moodsSorted } = await getMoods(); + + // setup dayjs + dayjs.extend(relativeTime); + + // setup express app + const app = express(); + app.set("view engine", "pug"); + app.use(express.static("static")); + app.use(bodyParser.urlencoded({ extended: false })); + app.use( + session({ + store: new (connectPgSimple(session))(), + secret: process.env.COOKIE_SECRET, + resave: false, + cookie: { maxAge: 7 * 24 * 60 * 60 * 1000 } + }) + ); + app.use(flash()); + + app.get("/", async (req, res) => { + const upd = db + .selectDistinctOn([updates.user], { + date: updates.date, + user: users.name + }) + .from(updates) + .innerJoin(users, eq(updates.user, users.id)) + .orderBy(updates.user, desc(updates.date)) + .limit(25) + .as("upd"); + const recentUpdates = await db.select().from(upd).orderBy(desc(upd.date)); + + render(db, "index", "Home", res, req, { + users: (await db.select().from(users)).length, + recentUpdates + }); + }); + + await userRoutes(app, db); + + //! -- TEMP DASHBOARD START -- + app.get("/dashboard", async (req, res) => { + if (!req.session["loggedIn"]) { + res.redirect("/login"); + return; + } + const user = ( + await db + .select({ + name: users.name, + bio: profiles.bio, + website: profiles.website //! validate this + }) + .from(users) + .where(eq(users.name, req.session["user"])) + .leftJoin(profiles, eq(users.id, profiles.user)) + )[0]; + + const now = dayjs(); + const moodHistory = ( + await db + .select({ mood: updates.mood, date: updates.date }) + .from(updates) + .where(eq(updates.user, req.session["uid"])) + .orderBy(desc(updates.date)) + .limit(10) + ).map((e) => { + return { mood: moods[e.mood], date: now.to(dayjs(e.date)) }; + }); + + const recentUpdates = ( + await db + .select({ + user: users.name, + mood: updates.mood, + desc: updates.description, + date: updates.date + }) + .from(updates) + .innerJoin( + follows, + and( + eq(follows.userId, updates.user), + eq(follows.followerId, req.session["uid"]) + ) + ) + .leftJoin(users, eq(updates.user, users.id)) + .orderBy(desc(updates.date)) + .limit(25) + ).map((e) => { + return { + user: e.user, + mood: moods[e.mood], + desc: e.desc, + date: dayjs().to(dayjs(e.date)) + }; + }); + + render(db, "dashboard", "Dashboard", res, req, { + user, + moods, + moodsSorted, + moodHistory, + recentUpdates, + feed: [] + }); + }); + app.post("/update", async (req, res) => { + if (!req.session["loggedIn"]) { + res.redirect("/login"); + return; + } + const moodIndex = moods.indexOf(req.body.mood.trim()); + if (moodIndex === -1) { + req.flash( + "error", + "That mood doesn't exist in the database, WTF are you trying to do??" + ); + res.redirect("/dashboard"); + return; + } + if (req.body.desc.length > 512) { + req.flash( + "error", + "Mood description can't be longer than 512 characters" + ); + res.redirect("/dashboard"); + } + + await db + .insert(updates) + // @ts-expect-error + .values({ + user: req.session["uid"], + mood: moodIndex, + description: req.body.desc, + date: new Date(Date.now()) + }); + req.flash("success", "Mood updated!"); + res.redirect("/dashboard"); + }); + //! -- TEMP DASHBOARD END -- + + //! TEMP Also not sanitized like at all + //! Also make sure user isnt logged in before doing this + loginRoutes(app, db); + //! TEMP done + + app.listen(1337, () => { + console.log("Listening on http://127.0.0.1:1337/"); + }); +})(); diff --git a/package.json b/package.json new file mode 100644 index 0000000..61782c1 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "frontend", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "main.ts", + "scripts": { + "start": "tsx main.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.1.1", + "body-parser": "^1.20.3", + "connect-flash": "^0.1.1", + "connect-pg-simple": "^10.0.0", + "dayjs": "^1.11.13", + "dotenv": "^16.4.5", + "drizzle-orm": "^0.36.1", + "express": "^4.21.1", + "express-session": "^1.18.1", + "pg": "^8.13.1", + "pug": "^3.0.3", + "typescript": "^5.6.3" + }, + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/body-parser": "^1.19.5", + "@types/connect-flash": "^0.0.40", + "@types/connect-pg-simple": "^7.0.3", + "@types/express": "^5.0.0", + "@types/express-session": "^1.18.0", + "@types/pg": "^8.11.10", + "@types/pug": "^2.0.10", + "drizzle-kit": "^0.28.0", + "tsx": "4.19.2" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..2c0ac55 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2600 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + bcrypt: + specifier: ^5.1.1 + version: 5.1.1 + body-parser: + specifier: ^1.20.3 + version: 1.20.3 + connect-flash: + specifier: ^0.1.1 + version: 0.1.1 + connect-pg-simple: + specifier: ^10.0.0 + version: 10.0.0 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + drizzle-orm: + specifier: ^0.36.1 + version: 0.36.1(@types/pg@8.11.10)(pg@8.13.1) + express: + specifier: ^4.21.1 + version: 4.21.1 + express-session: + specifier: ^1.18.1 + version: 1.18.1 + pg: + specifier: ^8.13.1 + version: 8.13.1 + pug: + specifier: ^3.0.3 + version: 3.0.3 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + devDependencies: + '@types/bcrypt': + specifier: ^5.0.2 + version: 5.0.2 + '@types/body-parser': + specifier: ^1.19.5 + version: 1.19.5 + '@types/connect-flash': + specifier: ^0.0.40 + version: 0.0.40 + '@types/connect-pg-simple': + specifier: ^7.0.3 + version: 7.0.3 + '@types/express': + specifier: ^5.0.0 + version: 5.0.0 + '@types/express-session': + specifier: ^1.18.0 + version: 1.18.0 + '@types/pg': + specifier: ^8.11.10 + version: 8.11.10 + '@types/pug': + specifier: ^2.0.10 + version: 2.0.10 + drizzle-kit: + specifier: ^0.28.0 + version: 0.28.0 + tsx: + specifier: 4.19.2 + version: 4.19.2 + +packages: + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@types/bcrypt@5.0.2': + resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect-flash@0.0.40': + resolution: {integrity: sha512-vqGDzZ85Kyu/tKdDwXP6JCz4i2Xp3o4bYHSCXbF7XiL1HohogtGXG5pgbgypVbdO3DYqCOHIiZhp2Gh5fP2dDw==} + + '@types/connect-pg-simple@7.0.3': + resolution: {integrity: sha512-NGCy9WBlW2bw+J/QlLnFZ9WjoGs6tMo3LAut6mY4kK+XHzue//lpNVpAvYRpIwM969vBRAM2Re0izUvV6kt+NA==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/express-serve-static-core@5.0.1': + resolution: {integrity: sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==} + + '@types/express-session@1.18.0': + resolution: {integrity: sha512-27JdDRgor6PoYlURY+Y5kCakqp5ulC0kmf7y+QwaY+hv9jEFuQOThgkjyA53RP3jmKuBsH5GR6qEfFmvb8mwOA==} + + '@types/express@5.0.0': + resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node@22.8.7': + resolution: {integrity: sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==} + + '@types/pg@8.11.10': + resolution: {integrity: sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==} + + '@types/pug@2.0.10': + resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} + + '@types/qs@6.9.16': + resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assert-never@1.3.0: + resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} + + babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcrypt@5.1.1: + resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} + engines: {node: '>= 10.0.0'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + connect-flash@0.1.1: + resolution: {integrity: sha512-2rcfELQt/ZMP+SM/pG8PyhJRaLKp+6Hk2IUBNkEit09X+vwn3QsAL3ZbYtxUn7NVPzbMTSLRDhqe0B/eh30RYA==} + engines: {node: '>= 0.4.0'} + + connect-pg-simple@10.0.0: + resolution: {integrity: sha512-pBGVazlqiMrackzCr0eKhn4LO5trJXsOX0nQoey9wCOayh80MYtThCbq8eoLsjpiWgiok/h+1/uti9/2/Una8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=22.0.0} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + drizzle-kit@0.28.0: + resolution: {integrity: sha512-KqI+CS2Ga9GYIrXpxpCDUJJrH/AT/k4UY0Pb4oRgQEGkgN1EdCnqp664cXgwPWjDr5RBtTsjZipw8+8C//K63A==} + hasBin: true + + drizzle-orm@0.36.1: + resolution: {integrity: sha512-F4hbimnMEhyWzDowQB4xEuVJJWXLHZYD7FYwvo8RImY+N7pStGqsbfmT95jDbec1s4qKmQbiuxEDZY90LRrfIw==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + express-session@1.18.1: + resolution: {integrity: sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==} + engines: {node: '>= 0.8.0'} + + express@4.21.1: + resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} + engines: {node: '>= 0.10.0'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + + jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.7.0: + resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + pg-pool@3.7.0: + resolution: {integrity: sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.7.0: + resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.13.1: + resolution: {integrity: sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + + pug-code-gen@3.0.3: + resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} + + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + + pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + + pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + + pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + + pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + + pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + + pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + + pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + + pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + + pug@3.0.3: + resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + random-bytes@1.0.0: + resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} + engines: {node: '>= 0.8'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + uid-safe@2.1.5: + resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} + engines: {node: '>= 0.8'} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + +snapshots: + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@drizzle-team/brocli@0.10.2': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.8.1 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@types/bcrypt@5.0.2': + dependencies: + '@types/node': 22.8.7 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.8.7 + + '@types/connect-flash@0.0.40': + dependencies: + '@types/express': 5.0.0 + + '@types/connect-pg-simple@7.0.3': + dependencies: + '@types/express': 5.0.0 + '@types/express-session': 1.18.0 + '@types/pg': 8.11.10 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.8.7 + + '@types/express-serve-static-core@5.0.1': + dependencies: + '@types/node': 22.8.7 + '@types/qs': 6.9.16 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express-session@1.18.0': + dependencies: + '@types/express': 5.0.0 + + '@types/express@5.0.0': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 5.0.1 + '@types/qs': 6.9.16 + '@types/serve-static': 1.15.7 + + '@types/http-errors@2.0.4': {} + + '@types/mime@1.3.5': {} + + '@types/node@22.8.7': + dependencies: + undici-types: 6.19.8 + + '@types/pg@8.11.10': + dependencies: + '@types/node': 22.8.7 + pg-protocol: 1.7.0 + pg-types: 4.0.2 + + '@types/pug@2.0.10': {} + + '@types/qs@6.9.16': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.8.7 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.8.7 + '@types/send': 0.17.4 + + abbrev@1.1.1: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn@7.4.1: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + ansi-regex@5.0.1: {} + + aproba@2.0.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + array-flatten@1.1.1: {} + + asap@2.0.6: {} + + assert-never@1.3.0: {} + + babel-walk@3.0.0-canary-5: + dependencies: + '@babel/types': 7.26.0 + + balanced-match@1.0.2: {} + + bcrypt@5.1.1: + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + node-addon-api: 5.1.0 + transitivePeerDependencies: + - encoding + - supports-color + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + buffer-from@1.1.2: {} + + bytes@3.1.2: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + character-parser@2.2.0: + dependencies: + is-regex: 1.1.4 + + chownr@2.0.0: {} + + color-support@1.1.3: {} + + concat-map@0.0.1: {} + + connect-flash@0.1.1: {} + + connect-pg-simple@10.0.0: + dependencies: + pg: 8.13.1 + transitivePeerDependencies: + - pg-native + + console-control-strings@1.1.0: {} + + constantinople@4.0.1: + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie-signature@1.0.7: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + dayjs@1.11.13: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + delegates@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-libc@2.0.3: {} + + doctypes@1.1.0: {} + + dotenv@16.4.5: {} + + drizzle-kit@0.28.0: + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.36.1(@types/pg@8.11.10)(pg@8.13.1): + optionalDependencies: + '@types/pg': 8.11.10 + pg: 8.13.1 + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.3.7 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escape-html@1.0.3: {} + + etag@1.8.1: {} + + express-session@1.18.1: + dependencies: + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + on-headers: 1.0.2 + parseurl: 1.3.3 + safe-buffer: 5.2.1 + uid-safe: 2.1.5 + transitivePeerDependencies: + - supports-color + + express@4.21.1: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.10 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gauge@3.0.2: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + has-unicode@2.0.1: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-expression@4.0.0: + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + + is-fullwidth-code-point@3.0.0: {} + + is-promise@2.2.2: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + js-stringify@1.0.2: {} + + jstransformer@1.0.0: + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + methods@1.1.2: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + negotiator@0.6.3: {} + + node-addon-api@5.1.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.2: {} + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + parseurl@1.3.3: {} + + path-is-absolute@1.0.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.10: {} + + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.7.0: {} + + pg-int8@1.0.1: {} + + pg-numeric@1.0.2: {} + + pg-pool@3.7.0(pg@8.13.1): + dependencies: + pg: 8.13.1 + + pg-protocol@1.7.0: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg-types@4.0.2: + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + pg@8.13.1: + dependencies: + pg-connection-string: 2.7.0 + pg-pool: 3.7.0(pg@8.13.1) + pg-protocol: 1.7.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + postgres-array@2.0.0: {} + + postgres-array@3.0.2: {} + + postgres-bytea@1.0.0: {} + + postgres-bytea@3.0.0: + dependencies: + obuf: 1.1.2 + + postgres-date@1.0.7: {} + + postgres-date@2.1.0: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + postgres-interval@3.0.0: {} + + postgres-range@1.1.4: {} + + promise@7.3.1: + dependencies: + asap: 2.0.6 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pug-attrs@3.0.0: + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + + pug-code-gen@3.0.3: + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + + pug-error@2.1.0: {} + + pug-filters@4.0.0: + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.8 + + pug-lexer@5.0.1: + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + + pug-linker@4.0.0: + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + + pug-load@3.0.0: + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + + pug-parser@6.0.0: + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + + pug-runtime@3.0.1: {} + + pug-strip-comments@2.0.0: + dependencies: + pug-error: 2.1.0 + + pug-walk@2.0.0: {} + + pug@3.0.3: + dependencies: + pug-code-gen: 3.0.3 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + random-bytes@1.0.0: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + split2@4.2.0: {} + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + supports-preserve-symlinks-flag@1.0.0: {} + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + toidentifier@1.0.1: {} + + token-stream@1.0.0: {} + + tr46@0.0.3: {} + + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typescript@5.6.3: {} + + uid-safe@2.1.5: + dependencies: + random-bytes: 1.0.0 + + undici-types@6.19.8: {} + + unpipe@1.0.0: {} + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + vary@1.1.2: {} + + void-elements@3.1.0: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + with@7.0.2: + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + assert-never: 1.3.0 + babel-walk: 3.0.0-canary-5 + + wrappy@1.0.2: {} + + xtend@4.0.2: {} + + yallist@4.0.0: {} diff --git a/routes/login.ts b/routes/login.ts new file mode 100644 index 0000000..7e9c9fe --- /dev/null +++ b/routes/login.ts @@ -0,0 +1,124 @@ +import { Express } from "express"; +import bcrypt from "bcrypt"; +import { render } from "./util.js"; +import { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { profiles, users } from "../db/schema.js"; +import { eq } from "drizzle-orm"; + +export default function(app: Express, db: NodePgDatabase) { + app.get("/register", (req, res) => { + if (req.session["loggedIn"]) { + res.redirect("/"); + return; + } + render(db, "register", "Sign up", res, req); + }); + app.post("/register", async (req, res) => { + if (req.session["loggedIn"]) { + res.redirect("/"); + return; + } + if (req.body.name.length < 3) { + req.flash("error", "Username can't be shorter than 3 characters"); + res.redirect("/register"); + return; + } + if (req.body.name.length > 26) { + req.flash("error", "Username can't be longer than 26 characters"); + res.redirect("/register"); + return; + } + if (!req.body.name.match(/[A-Z0-9_-]/i)) { + req.flash( + "error", + "Username can only contain letters, numbers, underscores, hyphens, and periods!!" + ); + res.redirect("/register"); + return; + } + if (!req.body.email || !req.body.pass) { + req.flash("error", "Email or password not provided"); + res.redirect("/register"); + return; + } + + if ( + (await db.select().from(users).where(eq(users.name, req.body.name))) + .length > 0 + ) { + req.flash("error", "That username is taken MORON"); + res.redirect("/register"); + return; + } + //! ew + if ( + (await db.select().from(users).where(eq(users.email, req.body.email))) + .length > 0 + ) { + req.flash("error", "A user with that email already exists"); + res.redirect("/register"); + return; + } + + const hash = await bcrypt.hash(req.body.pass, 10); + const { uid } = ( + await db + .insert(users) + .values({ + name: req.body.name, + email: req.body.email, //! Not actually validating this like at all??? + pass: hash, + registered: new Date(Date.now()) + }) + .returning({ uid: users.id }) + )[0]; + await db.insert(profiles).values({ user: uid }); + + req.session["loggedIn"] = true; + req.session["user"] = req.body.name; + req.session["uid"] = uid; + req.flash( + "success", + "Welcome to mipilin. After two weeks in development, hopefully it will have been worth the wait. Please let me know what you think after you have had a chance to use the website. I can be reached at gaben@roxwize.xyz, and my favorite mood is hormonal. Thanks, and have fun!" + ); + res.redirect("/"); + }); + + app.get("/login", async (req, res) => { + if (req.session["loggedIn"]) { + res.redirect("/"); + return; + } + render(db, "login", "Log in", res, req); + }); + app.post("/login", async (req, res) => { + if (req.session["loggedIn"]) { + res.redirect("/"); + return; + } + const user = ( + await db.select().from(users).where(eq(users.name, req.body.name)) + )[0]; + if (!user) { + req.flash("error", "The username or password is invalid! I'm sorry! :("); + res.redirect("/login"); + return; + } + if (await bcrypt.compare(req.body.pass, user.pass)) { + req.session["loggedIn"] = true; + req.session["user"] = user.name; + req.session["uid"] = user.id; + req.flash("success", "You're logged in! Welcome back!!"); + res.redirect("/dashboard"); + } else { + req.flash("error", "The username or password is invalid! I'm sorry! :("); + res.redirect("/login"); + } + }); + app.get("/logout", (req, res) => { + req.session["loggedIn"] = false; + delete req.session["user"]; + req.flash("info", "Good bye!"); + res.redirect("/"); + }); +} diff --git a/routes/users.ts b/routes/users.ts new file mode 100644 index 0000000..14baa4e --- /dev/null +++ b/routes/users.ts @@ -0,0 +1,153 @@ +import { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { Express } from "express"; +import { follows, profiles, updates, users } from "../db/schema.js"; +import { and, desc, eq } from "drizzle-orm"; +import { getMoods, render } from "./util.js"; +import { PgColumn } from "drizzle-orm/pg-core"; + +export default async function (app: Express, db: NodePgDatabase) { + const { moods } = await getMoods(); + app.get("/users/:user", async (req, res) => { + const isSelf = req.params.user === req.session["user"]; + + const user = ( + await db + .select({ + id: users.id, + name: users.name, + bio: profiles.bio, + website: profiles.website + }) + .from(users) + .where(eq(users.name, req.params.user)) + .leftJoin(profiles, eq(profiles.user, users.id)) + )[0]; + if (!user) { + req.flash("error", `User ${req.params.user} does not exist`); + res.redirect("/"); + return; + } + + // follows + const isFollowing = !!( + await db + .select() + .from(follows) + .where( + and( + eq(follows.followerId, req.session["uid"]), + eq(follows.userId, user.id) + ) + ) + .limit(1) + )[0]; + + // mood + let moodSelection: { [k: string]: PgColumn } = { + desc: updates.description, + date: updates.date + }; + if (!isSelf) moodSelection.mood = updates.mood; + const userMood: { [k: string]: string | number | Date } = ( + await db + .select(moodSelection) + .from(updates) + .where(eq(updates.user, user.id)) + .orderBy(desc(updates.date)) + .limit(1) + )[0]; + + if (!isSelf) { + userMood.mood = moods[userMood.mood as number]; + } + + render(db, "user", `${req.params.user}'s Profile`, res, req, { + user, + isSelf, + userMood, + isFollowing + }); + }); + app.post("/users/:user/edit", async (req, res) => { + if (!req.session["loggedIn"]) { + res.redirect("/login"); + return; + } + const { uname, mod } = ( + await db + .select({ uname: users.name, mod: users.moderator }) + .from(users) + .where(eq(users.name, req.params.user)) + )[0]; + if ((uname || "") !== req.session["user"] && !mod) { + res.redirect("back"); + return; + } + + await db //! no sanitization here either BROOOOOOO + .update(profiles) + .set({ + // @ts-expect-error + bio: req.body.bio, + website: req.body.website + }) + .where(eq(profiles.user, req.session["uid"])); + req.flash("success", "Profile updated!"); + res.redirect("/dashboard"); + }); + app.post("/users/:user/follow", async (req, res) => { + if (!req.session["loggedIn"]) { + res.redirect("/login"); + return; + } + if (req.session["user"] === req.params.user) { + req.flash("error", "Can't Follow Yourself Dummy"); + res.redirect(`/users/${req.params.user}`); + return; + } + + const { uid } = ( + await db + .select({ uid: users.id }) + .from(users) + .where(eq(users.name, req.params.user)) + )[0]; + if (!uid) { + req.flash( + "error", + "It looks like you're trying to follow a user that doesn't exist anymore." + ); + res.redirect("/"); + return; + } + const isFollowing = !!( + await db + .select() + .from(follows) + .where( + and( + eq(follows.followerId, req.session["uid"]), + eq(follows.userId, uid) + ) + ) + .limit(1) + )[0]; + if (isFollowing) { + // unfollow + await db + .delete(follows) + .where( + and( + eq(follows.followerId, req.session["uid"]), + eq(follows.userId, uid) + ) + ); + } else { + await db.insert(follows).values({ + userId: uid, + followerId: req.session["uid"] + }); + } + res.redirect(`/users/${req.params.user}`); + }); +} diff --git a/routes/util.ts b/routes/util.ts new file mode 100644 index 0000000..a986951 --- /dev/null +++ b/routes/util.ts @@ -0,0 +1,48 @@ +import { NodePgDatabase } from "drizzle-orm/node-postgres"; +import type { Request, Response } from "express"; +import { updates } from "../db/schema.js"; +import { desc, eq } from "drizzle-orm"; +import fs from "node:fs/promises"; + +let moods: string[], moodsSorted: string[]; +export async function getMoods() { + if (!moods) + moods = (await fs.readFile("./static/moods.txt")) + .toString("utf-8") + .split(";"); + if (!moodsSorted) moodsSorted = Array.from(moods).sort(); + return { moods, moodsSorted }; +} + +export async function render( + db: NodePgDatabase, + page: string, + title: string, + res: Response, + req: Request, + stuff?: Object +) { + //? maybe you should cache this and save the current mood to the session until it's changed + const { moods } = await getMoods(); + let currentMood: string; + if (req.session["loggedIn"]) { + const update = ( + await db + .select({ mood: updates.mood }) + .from(updates) + .where(eq(updates.user, req.session["uid"])) + .orderBy(desc(updates.date)) + .limit(1) + )[0]; + currentMood = moods[update?.mood]; + } + + const o = { + title, + session: req.session, + flashes: req.flash(), + moods, + currentMood + }; + res.render(page, { ...o, ...stuff }); +} diff --git a/static/css/dashboard.css b/static/css/dashboard.css new file mode 100644 index 0000000..0b930de --- /dev/null +++ b/static/css/dashboard.css @@ -0,0 +1,62 @@ +form * { + display: block; + margin: 4px 0; +} +form *:first-child { + margin-top: 0; +} +form *:last-child { + margin-bottom: 0; +} + +.feed-update { + background-color: #d5d4bb; + height: fit-content; + word-wrap: break-word; +} +.feed-update div:first-child { + display: flex; + justify-content: space-between; +} +.feed-update div:last-child { + text-align: right; + color: #3f3f38; + font-style: italic; +} + +#dashboard-update-form * { + width: 50%; + min-width: 128px; +} + +#dashboard-profile * { + width: 100%; +} + +#dashboard-mood-history { + margin: 0; + list-style-type: none; + padding-inline-start: 0; +} +#dashboard-mood-history li { + display: flex; + justify-content: space-between; +} + +@media screen and (min-width: 900px) { + #dashboard-feed { + display: flex; + flex-wrap: wrap; + gap: 12px; + } + .feed-update { + padding: 4px; + width: 280px; + } +} +@media screen and (max-width: 900px) { + .feed-update { + border-bottom: 1px solid #afa870; + padding: 8px; + } +} diff --git a/static/css/main.css b/static/css/main.css new file mode 100644 index 0000000..92ae046 --- /dev/null +++ b/static/css/main.css @@ -0,0 +1,176 @@ +* { + box-sizing: border-box; +} + +body { + display: flex; + align-items: center; + justify-content: center; + margin: 0; + background-color: #21211d; + width: 100vw; + height: 100vh; + font-family: "Gohufont 14", sans-serif; + font-size: 14px; +} + +main { + background-color: #faf8da; + width: 95%; + height: 95%; +} + +a { + color: #4630df; +} + +h1, +h2, +h3 { + margin: 0; +} + +header { + display: flex; + flex-direction: row; + justify-content: space-between; + background-color: #e0d665; + background-image: linear-gradient(to bottom, #f6ef98, #c7c07d); + padding: 16px; + width: 100%; + overflow: hidden; +} + +#header-logo { + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.5)); + height: 40px; +} + +header nav { + display: flex; + align-items: center; + gap: 2em; +} + +header nav a { + text-decoration: none; + text-shadow: 0 0px 4px rgba(0, 0, 0, 0.8); + color: #faf8da; + font-size: 24px; + font-weight: bold; +} +header nav a:visited { + color: #faf8da; +} +header nav a:hover { + text-decoration: underline; +} + +summary { + cursor: pointer; +} + +#ticker { + position: relative; + border: 1px solid #25251d; + background-color: #454542; + height: 1.5em; + color: #faf8da; +} +#ticker > div { + display: flex; + float: left; + align-items: center; + justify-content: center; + border-right: 1px solid #25251d; + background-color: #3b3b33; + padding: 0 4px; + min-width: 255px; + height: 100%; + text-align: center; +} +#ticker div a { + color: #faf8da; +} +#ticker #ticker-marquee { + width: auto; + height: 100%; + display: flex; + align-items: center; +} + +#page { + height: calc(100% - 1.5em - 76px); + overflow-y: auto; +} + +#sidebar { + padding: 1em; + float: left; + width: 256px; + height: 100%; + margin-right: 24px; + border-right: 1px solid #afa870; +} + +#content { + padding: 1em; +} + +#content > *:nth-child(2) { + margin-top: 0; + margin-inline-start: 0; +} +#content > *:last-child { + margin-bottom: 0; + margin-inline-end: 0; +} + +#flashes div { + margin-bottom: 8px; + padding: 8px; + border-width: 1px; + border-style: solid; +} +#flashes div:first-child { + margin-top: 0; +} +.flash-error { + background-color: #e06583; + border-color: #911533; +} +.flash-info { + background-color: #8ca3f2; + border-color: #6371a1; +} +.flash-success { + background-color: #8cf2a6; + border-color: #3da758; +} + +button, +textarea, +select, +input { + border: 1px solid #757462; + background-color: white; + padding: 4px; + font-family: inherit; +} +button:focus, +textarea:focus, +select:focus, +input:focus { + outline: 0; + border: 1px solid #000000; +} +button, +select { + cursor: pointer; +} + +@font-face { + font-family: "Gohufont 14"; + src: url("/fonts/gohufont-14.ttf") format("truetype"), + url("/fonts/gohufont-14.woff") format("woff"); +} diff --git a/static/fonts/gohufont-14.ttf b/static/fonts/gohufont-14.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cd46c2cbb86ab017bc160e77c0ba387a393297ab GIT binary patch literal 30680 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 BC};ox literal 0 HcmV?d00001 diff --git a/static/fonts/gohufont-14.woff b/static/fonts/gohufont-14.woff new file mode 100644 index 0000000000000000000000000000000000000000..dedb0efa07092d1fccd17fc4b5fd67a79a2ca3d9 GIT binary patch literal 8028 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 Qhv$e(y%;CvM1)uPFV-|a!vFvP literal 0 HcmV?d00001 diff --git a/static/fonts/josefin.ttf b/static/fonts/josefin.ttf new file mode 100644 index 0000000000000000000000000000000000000000..00ea1e7d28e3bc88480b96ef14cb351b118546bf GIT binary patch literal 117720 zcmeFa2YePq{`fz$`;_#a5FiO5RFRS%nvf3CJBWw`h!jJ>Pz6+^C?HsJwo~*_v3E~V z5z)i0oLxlZ6f9UkMG-`VJiqsRcJmMv@AUrn{r`UV`nsEW@9fO%?9|WHXQQ-IDgk&@ zVXxA%^7AHtd!JHv73$Bu1`QmlTDBLWzdgQywl@${cJHNXH_b8P=83X@M-p<@F_{4txbYb zp-Zc#PpBByX~uQLC4>anGOc3X4C`F=81Bd5KE1kPTIEOE5}#438UFcu&zL@Q){FhI_)J{Ez9tvIjh?xm7w4P|;kKRjI}*zZ#`{=B~kE?v4G| z0iROd%L41`%DlsV=0;g(xF%YKJguIV$HVUSk53#P^<27YGrry3?FZ%!&+1mF3XPq4 zgQbeoUfta8%;@e1lx=@*jNjUwJjh)CkvacRV11yGcbKO)w?5oDhsSE6CMquvue3&C z)YrM{u_{}A?7ET5TBQPoDxDm4jsXJ)l$l`tWI6HhY}cjfN|QqbX1=wFOS-ZpTrs>& zs|3;_Z0@AVvv?mxiZ^Z)w@RC^bFZVdjqXKsF`5wR_NZ9xhnJ(`G^IsdfSA+ zHTRk@5DQ+S{U#I=X2)Hq35)A4T++@lj}$j1=9X@R3&)LCwlz}jltq|ToOx33q3$WY zi~9;xJ5(~^H>Y`u+NLkok4R}UDX7%aW@=e8wIW@uPFGhnS8H0TyV|G?C#%1AQaf_g zPhGX@rbAEBaXocvv3i0B#G_A^?q2g*?dP|BvF3}ve7W|^oA#{R^T6Iazq;?M4PQU- z^~2vhzVF%Z{bf854%PiwcR27<;7H)8wzRFiy0_)C{8oq+YK2+hR)qbneb5fGBkV{! z%8vHLcw#+qo_KG9H_@BqZRGpGm+WioYvOC_YvWJxr~1?U&HU;9<{`~PGD2E}vX38C@7%6jKsY7TYVfckHRLec}eh4U8KUKP;hB!ia=XiQgqgC7zae zdg7R*{YhseotZQ)X?&xJjn8ge)p%Ot>L%@)%xH2>)0s_Yr5s5)H)Ve6c^NU8X+3)M z%o^F>%|snA#gcr8dah7Zp~+fPq&lLKQ8C8e>S&eW%C?$W9muuCt6rR1 zjo{P>r%`Y;r&i=1V!>QFxoLW7Kpw#L~wF$n!snsi-TJ7Z2 z>Jv__cB{|eSDaey=hQlc3aqK*2uCV&JZzx}r*5TN!M3_B?4&bcp3a9|bQd^O4}~K& z;nbt`>99gqz{#4*tEcH{aIszjm+KXRcJR43}@x&whK(}M}ZG+uGL{=`bQ zT9P&0$&g{z0_zg%YU^g}Uh7Hg9c!2MmGz_TwG-`DcAi~k54S7rbL{i%74}v3P4>O^ z+jFI7t><3P} zXM5**S9|~Lea!o;_igV^?_TdApT`&DOZRp5jq=U(UEsUKca85B-z&cF{T_dezmI=} zf4slif4=`x|Be3p{G0r*`nUVP^dAoKg~WxVg|rLl8qz0ZbjZ|@`5`Mqt`505&+^}U~SA^XVc5m3@;VL{LJUP4t6{}nLb>Z8>zYISRp(7$9 zk|VlD^o|%7F)pGiVqwJch$|!3M%)weSj3AF+af-XI20KYnH6l-$lhlofMT9RTR}f>a?iJsB@yui&_!&P}HWVm!q~u$3>?_pA_9Wx>xjw z=!wxYqtB0C9la*{uIR_3UyR-s{c-d+(LcrbW8z{`V`^f~i&+(OO>A^*)7as$OJgsO zy*~D~*au^uj6E1v6xToQw7AN+*>QKqJrehH+$(Wg<35f1KHiFtjZcs76yG(zJbp<0 z*!U^&v*Is^e$&x0uO>S(mt!ZM@flbeDI;ZJ{O;sc1DrIfT-6?OR{3GS_l>MnzYGi8T)K;mPsohiirH)Ch zN?nk;GWELDTT>rM-Je>Q7Mhlt);+Cv+R(H!)6Py?mUdm*ZD|jtZA^PH?d`M=)4ohQ z&@8c8db5+8YxZ`ty7c_?$?1#J?@NC!{b=)u=4H(YG-9)-76hZe7-TK3 zc5U<87PcMUwyN!H_q?#}`nE?-8hp~allHW0-)=;^@$IVHUD@t~lVeZre)7bVuRHnu z_A%}Iv|rtRef#&@f7|}Y4pAMNcIe+>L5E8_JksHX4%<8I?-4hl^thwe4*nv zojP|K(rIF+g`F<%^h9Q2=2e;ZW_8M1nzc4NF?&|_bJ<_yG|Fk2lb_Q&XI##`Ia_kx z&e@UkNzUG!A94b@{@m!?M!Ds=19H#FU6^})?gP2c!-MzaXw4t)Q^rtb*!-`2`mhTv2dC!JP#U7d&0CrC`=X*L%y?4U%eoS|B zzQnnizTal`I_g$>Xs@g1)T8tZAC>cJb-UV*?)S&)PwLN{=DBrhALniA%?9U>>ezV$ zt-vk8(}d{f=gaEY+0br-T3>%^pW5+@^B(1#Th(tp-*;VpsyDpBgtb#l|Od?m&Gj=Qef1Q(KsShX6za&p+w< z^DX`JZwb}!J>OPaIC)Bk5vy-drYli@eyxt3uef11;s5d%=TGX`>DYcPZoYC;owR4% zV7ey9otmah&UoEer|PD<34MOQs#RC1BkD`KEw`wL81dXhui#=jK$f~&-HF+QsMYFu z^(>>7DCzNkgULj97Uu8Y{`FGxNGlJk= ze7%)(vAR&o{LOUdUQtUK-!QIM>vRfld4-gDU&oR%pQuO3$2%w+N$M_jJzY6Q$8`Pn z;>-W!ahR^=KE|4>=yk22CO)IS*9mkz52!`z3tmh_^u?y5CL{TIm?Wq)Ol3q=_ra6u z!UVOvvAVvox-d;GNi(CPRq5)|bai=iGe)|*xw@{Ux}l}IxRtu8mAbUGx~;XkqqTbQ zB(=GNdZD9wJyX4zsrD48ySl1px~ijHb&C?U?R0e>Z<68D$BRB$zUS6G-|fBQ>xcJk z-1pi3{xU3jmtoP4L;pCmli|>(hd-4e&%wGwfd>P<80L5w=J+k^X9FEGz=>gKV}>Y)cN{+eHmTz8}v>30lh`Pr9abq^nR0Q%H(`TjMl)f(g z_Vhc`?@fOw{gLzy=}$IKYM#-&b%rk^IwOw0NRy1TjFU5ZXN=3JZ1wU_7V|Uah*aq+ zQ*~8q-H@%-_v>c~*>3%%-mec^?daFnhwOPmw#`OZshu?C$gj3EAW68ykcymXI|LhHN4sQ-OdrQPXy7=GB;PiBQAqwiumK zb#Dmk~7oQUXl_@qvgyc)%C%1aw{a(NB)(||sr z>-5uBEb%Y{&Ik(`+|N&uh(0wH2u6a z0%>W6wO^_IW-!Z8Hcn?Sd~Iunt&9vunE@(e!^w;e8Iqa-DP{g8tFeCB^5_rrlX@2= z>tlVuYGNfYUQDDuyk&Xyn^uxFijkzH@6-2N0~w^o>qo62`d)pbep~-lKcpYle`ChT zQlY9b(*=zf>Zhv$=8HNolQl@4s`{$_s+Brh%~#XZblQSB+DO$qX?bp?pY)Vkr6T*;r8-Tw)@{@neUcihPgZB>cIr%K z;wp4URjISoB%Q0y(m6U?P1bp8sUEDVbvLzG4^%7lNOc)AxK}WLdAUAAU8TpXYjvf% zMo&~%>j~;F`fPQho~mxpQ`CBWq57*nU)`dot4H)A^&sub!}q}_mUt~7( zWqp-;NnfcJ>QmL-dJc1nZD~DESL1XC<_xFm0#!(FXPF*?wEIXkr9W~pGuF|x%?b2h za@0}Pg&tBr`UOLDs+z5f)e=2O)#@|VpY%9&n?6T9q|Z}-)@LDys?=Ovs#fR`YMw4r z&*{spq1Iq)kTu*Ijf6bi8fi7RGMH~@Yn^1Zw$ho#XlJ#tT3D^n9u`fK6zM?CZweDtLK^s+)|YrXX6^QqjO>Em^$r`nOeT&6m# zvgko&)9dL(Z+I~Mgn_z=I#-vg1-iGIp-)jYx~H0{3)L)Lq|VVj)Oos(x`3JRMY_Mb zP!B-f_f>c3nd&Y*o4(dub)P<0-LK~(Jr<~Y^*r^AzLehmYWhrz zs$y0(@%>(f6pb!RS363IhNY`#ONPLE`WB5&S6B8Q*e_iz95S$fx|+x`MY`%YY)Id9 zY7+978fN^oNhvQW7e!9S{K7oqSIonI#XRg+%tL?0Jmgo*{l8-F`-M3Zi4p@R{2n7S zi5oIC7&pfzwxXhHmU?wU#mq|e;)Ds)W~faQtENm+kDXOhF+n|qwnE**T1l0g7U$oYBj zd|h9u`{{O!X4cdD96(>dv~y++K~qb@pw>5&j`e0{k~D<(wMPCWBab7PWVDd}*TXn{ zH4M>zRyJ&_uaRq9gQrvEX^T4P)7RlPO&XtItBBnz&qp+@FZ#uXmw|kC}9L;;sozti;oKhslX3l-7?*NX=@U z$$5t?cw*C5>`6)(-0SkYg3nX4&L#zlRJGWFaN zAC;7C8*M-UPFzig7Hf1i( zl}5Vfr5WY4qC|*ZjUZYf7Q1Wt2`+(@Y7auH2&6 z>09+}`bEN-F715_Nf+gT@D?TKamf>4fG5+XiIWl(cTH;-8*&G0OD^;%_k z&T{qCGS4ViZ>xMyhO759aN|`?=zBZ<_*A<6xvTf9K{oPA{0~tvcD?_hD$Sninun|Q zb`Mt{(Lf)m)2%euJWA#2FI|0%N@ld<_!+B0^vkZku}ar>IeIcSqCQ^qSc7ipQzht? zt{blkqyHxUFkcglBXe94dX{S*u43o|I&LEIXN;?lR_%1QtB;{19dY%s)Z^D(eH^8B zt*eixk5uF86X+uqy81+V<4LYQ2^k;e>Kma`l>6!Q%qvtief3#ftJD;vZy!u&vfgwS zchzdB*w1X>wu36hMHT(bf9-N8{!GK4-~L2@o|woJvw7}c`#%KNlWgtTYZdwo&pWycg)`ty=x?K`>mm^f9vrnmLAMK6XRKG z27QT6oHNPg8vLGt*-T2#O!QS;r(-$^`+=&QI6HpMRO#GJCq}c-4Mlery1A0xm6%N7 z>2$Z`RN~5%oQassMn4gK4fbR%sLsNlFuaG!ZFov$epL9YzMZ%Gejd^d88qBoK(g(Ruhb)zRb5LL#){lD_>pVi7^WwJgW zt5pdhpFyZinRIGrI&U`b&m>l+9GVsvL@iX*Hjdpc=11^tOs8+D3x0%e!+ zTzl2c>Uje7h?-;lPpF4gzP;_2iavjqwd6Ob#|djgm8SCP*Zo%2@i)0`rV5U8_XGYL z)r^_Ib<9-EmHjrEjkPgVRtPUX8xP&*FJ3 z4I0LO5AQmWYUrk+{(hBV{ppvA`PvMP-M>^b7%4VTRyUPxhoioBuGTBW1-+=Xs=dBI zwYO%dc!^6>!3m8)3mGQ@4)fA88C!K>-JqD2h%Sut^VDrzQOu;PdS%){Q^)1{J$@D-KiQsWy@h#7 zU_G-ZEv21WtXd#D)2Z_r)_Q3RqOCOIUaHz!C!_kR`Bo3r%*Z<<+gPPMXJWSh4gL5``W2QD-t)KF~&4<@nq8W9>%Q&O4~)u*?+Hw@~)Tk z7izE-s=`g4Sv%C(_8xV%eo76sxA4wQsxNul+R7xqo2cdbEY-%!AupQHtNW0C(7TdO zopoo`#j}TW+)BU9j1v{?ruhzS(#y|djFTBH+H}7_wAIWRlMUZ;x`8Mgc`?s z)iV7w={B3*{}Vj>_rUks#D6twJyERl+{6xrW#TWjnzIY>Y)c>QG~Q&PI09?L-nnT& ztCE|Rq`%orY}VO*jQU@Y6}d1S&JK=9-W$a_Lo_=wVs#v)GG5(B8BJh~tTih#0n$E^ zT@GznmHC2wGmXiWwyZ2QWu@aqc7CMkW;$Ir*BPw-w9qY?ooS_6k78EWY^iOh4l!qZ zvTjeAJz00uohVtEY76U9e`hA)RdtwnzNT}{CRSZQ{<3G3ekJ2U-Ho-iQ*;mAQx~#U zM6X*H>0;K}O4(Cdu6r@w%T}-J-t2!lRrk?-nVasf2e8^TP!D2_>n%NmHMwD|&W+G) zhhxO$FT}Ip7pML<~%-8Kj}(lswS~vwm?tOQ<-O~ zQk~V?tWs91cQo_!NUE*+99H^fvgS8i&(U-BJbkX7uNUZrtWI@dUGIE-fnKC9r1W-I zd-P&fnwIFLdYQh6+I@;%u6DEewp2}Ft?&}PO0U+Jva)lwzMQq4TKy;H*{@=z_-guy z*XV2YpPB!zX4ZTfvuJA==ajPw$&Wf@W~~=1lYh}#ucd^TwI*i7SZ#9V#BSGj=sS@o zcQK=UPJ?;32Px-$)Q_x_{*{%|N2q!0nZfHv9h;>eV=eS?>emKJTRqEzNfeA_tkv8gLUW+^oM#UE4&}E!uyF?y;3(J8P3z6BYTFjcWD?ao?o!HV2@eN zLb`m-THz7>4HA9@Yo6b-%C#TKGK#e`cE0F?$fqAzQ#-_(*I`y;k7)MN>j2ZBnq4Kf z<)NmGw!F^%64oQfsJ+Od4bFyoR*<9A8CJCV%!;vMtvD;5_2xwNwECO6LEXq|b0hZm z#4~f6$edLp<~?z+FO_@j#U{* z3TE9{2Z>X~Rw~kPtQyCPdLgsp5$p?mNX5`v-AP-siPh)l*f;hFYb=kdXW1wqvzltD z)q?ePznR;l4fx?_^P3&a45wO#^t{?^duJT+4XewKF?zdkMnGb*44Ws<6ge6Re3=rF9m&2;OIn{R8@Mm(tdi zAn&)cX8sTLo;AsuY)!GIT4!5T)-*7>nR6}9cdwc5HQT-B zI@hB5Yl(aBx-aVN-WQo`W_G6gd{O;X{J}iiUo@>^Le2DQf6??w)2l1b4lAmeQa!0+ z!t7a<{-QFuhL=p3QZr%pw6m%z=Y^F_oIa~!!i37|S>kh6Nv^MSLIoahshM6;Z<^;T zlj!)$#L@{(u^X!rHaj(fLD|RDPTpyu)f0-NbGAH2fD@uI5 z2fGQ7_*&zu+LNHjCEN(y}aBq4qMf{Brtl~e5LM{pdcuJ2hTMZN)!(*X^f z=JKO~>Pe2vE~V}h#lC^T;AWMTx=C5;2D{Wv(o#uM?47V=XG%fI%+7YxF{eHY+yYcm z<{dbBdQG)?2~W9^FRS;>byezSWLak9z{#^IE;X~KRaMM(B9on2<{#)LktuwX=J0_t zt14zrc1o2L$m|l|5GSHT8bmbD4P};uDl|F5fNXSw+6#!L-WED$S83%+7MtrmX&&?;UrWB4lOfgiQ+i?wM@F$>d{hd{ctyPe8haPU&cNM6kQW2}g;%AE_eY!9}q( zWvYLQ8g7B%wymx|-QxI|Xq?*dg>Z*$BiBl%{sw9DZRl&4E%9MDj z2&Ln`q>HcG$%E<&^E1|(=`$u*`l=f^&&{_hT}hK&;MAV1k`mwaU}TU9ZfcjhN$J!k z%-zCMD!D?G+$79)lRBq9m)yctQtq98thSZ92~y_fVX5n?)XnR%tjOuVtZkX){^@R- zIg+M0eEKgWO{tF^EHr1nng$Wgb3>UWp+eH+_+~muGxKMuoSoIhGs{SpSq&b~cT0R$ zv2S)TZSciSgR=T-fp_+?IF`97R_>-mS$&+{xR#Yi&i-W_vj}N@99@YrTO`VCN21Ji zf<5C zPL-P~4+c}Ec;$2vIhvVMToP(F`*buAo6KUTm}eF{MJlsc-jkhKklS=dWzCf76HR{t zAvjTL3H!7Vwm06T&l?*XP)SFZEPSsi|-u60we@h;=OUeKRU&^1N#;d4;vSj;q83XU>(vA@1Cqr@<20 zoSmKN$Y{bO_F1$GriA7=-3qP+p_2X+rcWCmDoJg0t{bPubtf~&E#o;^u76p@5#;Ll%Btyek2%hEGtY@YW=^(KByzHy zeos!e)6V8N)i^UJCojT{kmQwnQy@1{!KgX6!T2?FTHNp^yWveq!<+nuH$`$26^wmD zyIi@6J1!j>+Lt%D$;xVYmL!5n) zD$3m#Y4$3ay@0m3VYklNl{M9><+O^LvsK!(v!|WSsLEFm4!uiZcOk~cZl=+l)I-Om_hZzU%WLN7JMyU6&Q@fT? z-8@zf$1=Vy<=sD6b;SnpakSOP)}&~& zOHQlH<^FE#iqq%BtjFdv>)!F3V%CW6sz!sv&3JKhopn}JX3QPfOtPj$vs(<`{bJMJ zx}Ov_zFo?_R`-eNDC_pnG+uA3jn=g>uP2#Ujj^tX-YhQf6*qTTweI~{a(|kMQPdH9 zj*|Q9tvxX&9$J;l{qy=r(z?Fi;nOo#Qp`fJxl3$5wVIF;CQM51ALdPOD-+jGt*fGU zhFp#AGjw}HR-wDXs*D;NbtSrMtkp&*q1as(br7{1#jIr%v!78dQB6=` z{LtetY9DGR>UGox)H>9asHLcCR5~gKgMr1LHncm10l#>oBoHRA&;X6=Ug69A1lLQ`RN-TTo zqVhvuSKhGk_}?p(d<Z%I1j!Ndy|FPz z$S0`nqI((L)1q6C?jF?5A+>OM2)_^uAxA^Zu45H47Bx(CefX_=CU>nvh+hc4!w^2* za>(fXU;97szwLk7|Fj?f{P+jgpzsq?`uyjMj*$BaHyno|+^`>tG=hZOpCLMSBm1LJ z9^YZ#C%)}I!t0~l`5rK~zS~gv4p*TTi>?NpgxNO=-2gG`fiBnA5;j4_kSWT05VhCX zdOt#K6Wy!mo)z5&?_J)t+^zJ^hcmoq!7->IV%r-Xe!`9@{PiZtoyX8~7`4x{6K+Lq z5wp$c9uwVto^_t&=;xrS#CAM7(hCwdTjIw0jgMu7B1MnyJ04;WQ`_)|;5UC_V?@OPwobA!VI;oi4F9g`FS9jHdeBqQzmw zhYxHlGB&3N4h^3#wX3UhZ>=9b)iS#?_v`t-OT}h|u~GLT5+*96ds@$r*%?;H)5Ig> zzSGS*@HS@PzYO~loyh@{Q|R~=MOfHY-gTw%f!|#yJIvUyVldxUVHf1nZRW-2ha3uv)} z&?aN1$MXJ%Ly5oo7TX6xzejgOJsCPabUU`UxS`kTcJY<`3MHMK=a8e%^S(PA8@(X3 zqu$BW-|P9_lxSLYeLgAriMT!=zqf~)eXNt!lhF%9O?)TQf>3(VJxcC89XcP~bnDyD zsL(m+-lh(B7u&b>e1CSR**7|kCx(bw4Qc*7A+c!#ob=V|;YG%;NtEP4;$||wW`?%J zj5oPyK2h9EX4cy2Gpv&P?|Eh_ZfsRy?TXrmTdgiMHadouY^SkdMQcISR&Cty>pyn( zicZh>j0xF{?OGKUV#upilZpcjiGa;KFH6Wxrx&^#DTg(<<);6Rq zW}mz1!@i(J;+mXaC2nF#*US*lac-oNn^=3VbloiQ@0K`RBTt*}8AyH5XHb5^{5=Tm zK(V2IlB(tn)KA|wd1i*#vb=$`JtlGQw1#@fNB6%8niM8MzgHV|CN9x!9Og7$-LAJe}{knK&e>u%cRd8d>7? zIXdep&k?ndFkYa~WWCOm$5Ha!IHd+Uxz$2^9EZ&WvAK~aozyIF?yVQY>cUovwT>rGF&ur~?;&y^x((-$tovcRx{1>$Gx<&9ev}Vn`3#;5_efvberRB3u ztPJx(Cw@a4X?6!l&wxDVw+YH#jH*G6L6xH@8#eK=V^BoPqO4lmQ7@x5FzQ^VEYi%f zR-)#kka5;9uKbFJy(1nYN352pC=!d>!iufZAD~`EJ&Sr6wGMSDY90#tu1BGY86R|J zp|&Ib;J4;GbmR}?%%IakT#Pkv|{g{>f zFiHi#sgwJA^(HkyVp<~ipXtZ*tN5KAqe=Y)J#Nl4ZrFU`%&x&a^ljAd#whD=|-y)xnz8;ko%X^;qHfZHNL!{>Qkzdaj&Ib z$}eY4da~3m?q6lL#PRhM<4QFaQ_2~Bn)@ko{{;H=C`o14<{Ysxa>jXnD)&4grejPl zvP(s)>2iM;r74X046WwL{Yqoct^s~8=-zL0eYu!>t(J=E^ZHz$(=J{h_nY$V7Gg?ohH#A_1h>ik zUCMmGPJZpeJqNVe>0n%C;_9z*KZ>0rj$ggG*J_fOZp4*ix?D_`K<9T}{m_`tvr&T> zNm~A^@y+taFtS#@-M%E`Ep__X5%|m(ybtW?)7IDo-t3bR*qUo3n;e1nePMwQeIDno zyOMeJ?+zRoTpRcZ_jmeCxln<}ymf)iUgU;z1P*z> ztJnYhYM%YM*>AfqLGJwfN8ozGY|`n@!N{&-N8o|{smJb!OYQOZ$JxE>j7E)F;Pq3B z15bN*i+-JVXW$;Mk#FwNja>chM_|AA?SJJuurhz4grBrFZrL#=N8nlKTF(Gs3F>dm zUl`P{$)6f{w_9Q0;lZW$ZJ_KH^ci~*?{XO3Fmv@1~-H`vk{|IczpY!{l`n4yH zrE}mrZ-bZ^^FbRMJ{5SlPuswD?~C>66L_bmlXov2AD+N!@8*Wj{Zc=8)i2F{n@ONS z`T1>69PcXdg!lM3)q0H_mLt$mf06frdh_~g;O5-oz`G{TyA3gB)K_s6c-d>@TJQ+0 z2ya<`6WDyLt^^KrE37yFcdmhNe<^Q%vp*KQwwzzVr_d*B%#NoP^v+uG9ge2-%uZo% zRvBkAc9e}$>B@ZKvpK)eTE71Hk9qWZBXcO$dto7g{9#h0%_ z*e{n!AA2re+Q?=1TW8&m{ci*GPps@ zI`OoKC%rFvqO0K=wU(CTCgSNKp6j9cj$8z7`e@3SK?Fbp0mh36CaB_O(A?HCnF^%qa-JzB`0Gf_rl4&Ke6I+ zC3)y?5JOvH$b1H8tQ$jZF`trE>V{LRPc8m^XYUbZ+sc-gjW=iU%|)Ag?CXAYx4O<}6(r<7pF6`b|2@ok zGv`g?K6`ui)7e*c>d~oP@bq*%Sbyfc+2Ps_=R0Tn&FyR2kE%aUvf5;~i97ymxvBZ? zX7iiXq+Hki>c%fNzPV9yLU~+D^sCWNM^B6%6Fdj-4X(~nha)nWrOFIB6!L*{`Udzq z*6Zu9_KnP3F6OIIX?BtwWnIdiMvIzSUw>2G`rB0MZwkANPon0UZxp4I&ZU%W^SRy@ zQUY2^324P0@(HRnC4B|{TtW#bV^8Nz)Za(x*Pc!(eg(T-oYNR*e8LKu8Fx)*-fus9 zXU(U0YvfbBv-tW?0yUi-&g_&mrF))~i3OC2F6>@4pWnTJ@z_YUNJ{jDQlb~j=XaM- zCTjWq4!d*t($1ai&Amq7&FsOo{2Km#WP&Nt*UN`@*HG5iDb>q^OI2QHzTS|zoZqw< zlRK2kx>VmS`g`E3dZ(D|5;ydyu>F`V=$+YbZ}fYF`;7_XYE0P0x+ZW*`#$Oh;f=z- z2-gZ94Xj}0@G)t{9~W*AJ|WyF+!Uy7KS(_#d|LQ7;b!48!e@og37SJ0!0XZdz30mfK~fnDW0DKi%txo6U|>^_s8We>|6zcOnsYBYA!$a`~a z5&m81^aEZK{p-Rvgl`Jp5<2~@cSOHc_^xo9@I9f^pEF}jJ`E-`vkXdoApB6cQ%D>+ z$UhG9kK;4p=R)Gk@uiSha}a9|V$Jc5aG&ryA?d*Jy^vJqI4Jx<==8FG6#Zf0Pr@U@ zqeAH+s({gJF<=qT=q;fw^a#B|pDAOPC|f6?PVO5q1@J z6LuG#BJ3gTDJ&Eg35$g#LL+Y#zvD417xohN7M?2XBkU{eCmbLgC>$glER_C^9xnP3 z!jZz!!qbHn!fC?A!WF`m!b^m!gsX*@3NI60F1*4}c};oDdlm`ALEB?UdgMKe^e{(* z@>*=ZUa27E6}~2XT}XMwgz^e0uaNQzDX)<73MsFU@(L-hkn##CuaNQzDX)<73MsE} zr*M~$@`?%N6-szbsYOqzg_K%IsfBxllv?y(3BM8U6H;n1r_@49Eu_>!N-d<+LP{;9 z)Iv%vq|`!6Eu_>!N-d<+7Vj{{6>@=;T1csdlv+rsg_K%IsfCnU7%rsLqK_0(YSDKx zNv|`7|D@F7l2QvPwUAN^DYcMN3n{g*P*^0S)M7%Zg_K%IsfCnUNU4RCT1csdlv>zV zNU23nsf7cDgM^e?OenRGQVS`ykWvdNwa_WG(AAm z;Gj-$P$xL36CD4yB)KDZs2OAmH3L#JATGYtOKJwBX2AbOdA>wKzErqO zc#-g8;R@kO;U&UV!qvh{g_j907mBoZW%{{)lwTv$Igsfb$aD^5ItMbH1DQ^#F`)Y< zM5d!hrbA>pM5aTZ@P9-39V#(Jz7y-;-YfYZE5)pGn2;9r=?HCitY{FFUP zFA**kE)!lPyjZwGxKenDaFuYi@KWJr!pntM7zW?(5B$_MiC@vZ68PNet+oU{Z}}a+ z)HQrn_?qx_;Tys?g>MPp7QQ3gDtuSCP57R0yYPMC4>99|%7b?iB74ekA-@C~2fV z6aDAHFN9wT_Xzh2zY=~U+$a1_xL^3a@PP23@CV@`;g7<@!k>gkghz#S!hoSxLM^m} zw$LN=3VlM8u8groA0`YJMhGK?QNk|5uEK7@?!r@qJ%l}lg~B3Xv9Lr~Dl8M03wsHB z3r`jH5%v}K6Alm#6b=#&77h^(7mg5)6pj}DYDsrWuKLR&rN;ar`TxU`|F`s6{=3GP zj@+B~M@jh)my|#H2&WrK^s6oMf3~Ol%iaOs%oRzvMfi8&tHRfWuM3&U;CNHWOa=!t z8658jnaSW_CWC{S3=U>8IJOJl7w!-;lfl7E2FHiOox)whkAxo!-Ii4Jp9}w6Ms2@E z_Wf@dul@5r?k`Is>sWz3nG=uoQ#)Pi&b&3~r?NZlkMeq0>cdaMKSpW&OgfnPH#ktp z{2O}a-{278?--v24ma^If;pVoL;srWT`so&-dw{k%l#ko4(g9Sg_%*NwDuMLr%UvK z4po$B!(T7a#`fPU(K7Zw!Mua{hpOh7^oPX$zgE8g3&&XOIN|vB$|Bzh{-byBNAKW& zP?k#B{O3Je=1c$G^6Si_oqDobb!JwmV0C-e(LgrUMPVYo0t7%7YrMhjzvvBEfEyf8tSC`=MI z5+(~93r(nBR;huVk;_$@u$eGj*j$()>>=zaEEE@V?E|sBaBq~BE`)cj1Wc&qlEN3ann`UP1s#{im->Ur?601BrFz|2up?R!oi<%VJ~5C z;i*E}d2IU%88e}07638}0GS1V%mP4W0U)ygkX2g9E*v;o80>MzeW_Ps@+IGgHe4lK zExc5CnecMq6^5*mHX-Q}*z2lNKG1Q29Z99sH+vC3_eOp`oH_?7dzdfK82e4s*_+uL z>&RN;wjH(gi}25>t&gc5)Yi?c(`xk?PivJUY%Nrf|GLK4*4HDC4Q-)E=oR{eeqo3( zR2U`<7e)vpg;Bz2VT>?V7$=MuCI}OSNy0|LWMO0BE6N;BoGOgg?ZHbgiFlm3h##k# zR7zPKjQLCa7pmI8<0;GernV0JJ*8UgCnKTW^S4Dp88#E93!4iwggt~kg@wW*VX?48 zSS6e$tQJle&Jdm>tP#!>&JxZR&JoTP&J&(1oG)A;TqrzGc)sug;UeLM!o|WR!llAx z!sWsh!j;0+!dC(-`7LIB*?370p*$Soi^@v^xACoIlUmh!L*No!sGkr%Wk~v7LHcSn zL>MkyCOi$+uiA$wbC_QWn8SI8m>t^#5b?Dp$0E$HE*sj*{sw*>n;Ll69z@OuL)^K z(9@1U+7U=Q0%=De?Fif|q#Z#|I|6A(;C3PH2zuHPNIL>)Mhz|q1A5~6;e%@U;=*HKe9EHd?VJ@oO*2NmCg-@7Q)nlC^bZV)~p z+$iMBMT=YsN}9c39(HRed-=(YmPpWN$VE$N3q3-w&?oc@LxiEiFk!ebLKrEG5=IMS zgt5XnVZ1Owm?%sVHWDTa8w;Bd`n}Yey-7#pcgwqvlRgbo#>8VMvh9Ag9oc61lpzt# zCgxh5CrlA)VQ1+4m&0q3apu3bQ@$YO3sSxy4$tr8cJ`Q*x;#5JZ}iyhCeJ>FA;)RWQ^-4xhKe}H^U zc>Y&YWHCM|Bah8Rr7kiY4#yvpKiD9DIFLUa$R7^m562tAH-*R_4&)C9@`q!q@Ll0H z;d{dELgWv}4k7Y~1Np;&{NdOs+$H=-__6Ra;pajm4+oNm1IfdImdW{iIsyC)G+nsaBbOQmr!mq*`VANwv!KlWLXeC)Fy` zPpVa>pH!<%KdDywNwv!KlWLXeC)Fy`PpVa>pH!<%KdDxkep0P6{iIrD`bo9Q^pk3p z=_l1H(@&~Zrk_-+Oh2hsnSN5OGX11lW%^0A%Jh?JmFXwdD$`G@Ri>X*t4u$sR+)Yh z-v<<$eiFZ#6PkWftup3L>E(5(*-rAQB29p&$|pBB3A>3L>E(5(*-rAQB29p&$|pBB3A> z%D%{mCddWSc0pT6+l8LC3(|H$+ABzV1!=D!?G=m^(q5tOBJ3*cChRUeMc6~wQ&=c0 z5*7$glEF2;nE*v2oDI6_a95`$*GVPi@ z->gN#Wx|Vu7YkR2o0Y;#gsX(Bg_jC16J9R7!jQVyXpyOrNy02)2jN3d`U-q0lJth8 zHzd6w=?zJ5=oivgKu_93(jJobkhF)SJtXa6v@k{(D~uDy3loHi!X#lMVY0BXaN_@? z?fGtHj?aXDwCdC=iWc<>Qm-KO3R16Np^$ooo_YnTSCD!IsaKGC1$zmpSLmr%ka`8F zSCD!IsaKGC1*un%dIhOhka`8FSCD!IsaNoHVTEv-p_)U>wlC}uEt}y6;S<7*!cBpX ztS$U{_!Iue-P6Lq2{#L$5k4z?PWZg=74dtE@bAJ`g|7);7b4*~-V`F?Igs!i?+CXF z-xVU^Igs!i+lB87k?BjLxwKT0dD0HuId0RFd>Rw<{>80Xja zr6A8M7ZD}Z3-Z;Bz%wDGW}FKd=R(H0kZ~?#oC_J}LdLm}aV}(>3mNA^#<`GjE@Yew z8RtUAxsY)#WSk2b=R(H0kZ~?#oC_J}LdLm}aV~5UxIcvX-M}9BO2EwHNO{yD{7=p8 z%m}~9|1HZ9Qa}CG%=NxRzeuY`C1wkR)$otsPyVO(fzgIjcxb~RZ8)S2hqU34HXL>m zW(u=}Il^3FXW@Ti?P|~#G@OtBwVGyrNy!3%PL- z!Bn>hL*Z286W>$*qh&fwy8q{XyZJ}m`7P~J3(BIRWHYXSwvcfJdd3ydC-e&$S72h& z)qMZZ(8#3SG6%U^<{)>=9OQ19gWN6O3*61ukc=C~6_9ZSWLyCmS3t%UkZ}cMTmczZ zKvM^Inz}@5 z6L^Su-G})vh(GsLxxWOBWgcV?-_Py=ua)P_jD|5;9r%pZq&0!RV{Ux92pRBKwMhJ% z|BJBBI{tStfiL+loJ#_G`Tw7e%+ab?!q-ulFKjPtB^)H2Ba9LD5VnC9|0hye7h4|? zGjbw_j|jEkbH4G-8#V8#TUfe9Qr+Ijx-TmANUQEv>w}{i)|2+pLftryuWQPa_Ef92 z{=&YU`as_jv@iXIeWAKhFRHhUas3&OtUGTY~d}}F1 z!d<|-Jrjzx3^aW?MJ8&bxY$vtE4T1_HA8zzcozV!T)4-!)<*KG?(-ax}Oy^AHg@m zql4ztg68e0U9Sht7X{5r`JdfkL34l5d=y`m3OD9~QtR#p?>$X3atgX%7IZ(FZ&#gN zZ|=!-&D&UFPW()Hd!^pqJ}3BGp<2rq`fVc%?0(iJ%5|KP5xRL|^H^8K`+R;1x-rtP z>FIU1>fE|5dP?1rNd7l#-RVjC(YkkacHI_hQ$pR};_EghSnGXJzM~VZO?4S@CamJO zlzk&*2#b}+td*_i@}BQ`XS_<``(8?CCnYBEuDmoWF(Jxo(IPfJJ3lYCwWBdQqt(`g zsZG0dYTqxjW%vFk-M(&k--*NKU6FTMe)rKG`E2#jac%qLhWLFQ`($+}>DY)c+h5gWE3eC`8Fd?}fqepp_%Ef;GeS_UcvD74D=)W)m6M&+$j?hMq6k15xA_Iu zHoIW_;yyWNoD|mjw9K*vWAZwUTF^ghRO^$Y8%1^=e_`)_ODA-0njG7x zN#2>~^)8uzMqbk-6LWcwJ(JWnxtKapX`Li094VeEZY{`yMiDQlIz&^5)i>i*ANdol>I`wm@O{|@WHz!q}M#Hg*5 zPZi&wY|hoU)SaUz*Ilb`s2gZ)iZ=ytL%jR;wo>L!a#P-xw~Id_Hy!gq>N1hHj`?|n z)-fN<_sV=hf369d55?RLnt$t>w?Y05)=j0Jovl|Hd*obOyZ$-koccuMbN%z9O?>Rb z4W94MH|mU>J4;^`^#4!;`vD?H+ws4=Pp`KZIcLIa-apipb8|(`Iq@-a&aoe%9(Uzj z6OnU{eH+)_$hpP3X}!O8>!3N|){W}pBYEtkkHjbF-pD`4d<6e(+{i!2|Ei#QJ65Y- z3z{4G=eRFbokjjR?v4C&%t!IPJ|q9;BLDg}c<*WaFK<(`9QQMV?hDm?{x64=6a5|K zB$RdX`f}1@u3k|0XI)tLG~bPnuUj8qXTD!=>ePA2fVM^k*vH8L>PG_^kk=wF$2u<| ztDvCC;ALa8JG+9QahFq?^;&R7Zl_TT`*)b!`mRkUhsQ_xjhN`WM1(C^and2pV61)(Mbeb!&RNsW5;|@;B8Zn1FWIw z5UF>L`Ov_1roQq$6Q%wp?Y=Q@V~q$Lb?O7{uW9!iVfv+Q>Vxy#u)y?SKyQnu3E3#|HH(?&fa@#&`NNEvC`Xjexe2dR;rXHF%Om|BTZ8IPe`tN{k~a~bl=Z=c)#O5OFbv`%(yQ<=09HneN&$y z?)zHXg63@)6!2bBW4JXXV7`cxF7Gk53i+fPdD}Rl=RX70ZPp_t4th=8tT=tOiHM}0 z9m4-|pbpZClXT>5Y$G%3h@Go-zfd;&C0KPY^JiNx*R|E#j^tId6_Mf&w7{;#+v}@g!Gi?#%aM|4z>tpLGRKoqf#SM2Icg}zn;J5U#k=P zcl7OMDbdNzf<8*b8~Ettqixd7i7EMLQo!V+-79cN>`h8c55}yJmFc?)3G&)brcH@A z{n>cwQo21ax|jvhr*!*Yv@d;3OVVfYgf3ksnCtk?3AtnDm-SjWHb4K21?9aLjLFes z`_Pnhp0Gr$^TsXdUrvLQd&YuZt~lnVt#Ql;@qaLm zxi>u%$9$-IS$Z^%`+cst=}|ndn-J%LdZ)fb-m}I|mKtuJGb6WAZjYwn^JZk`*bh~I z)A2k%f;sIggW>$4f&FIbF}2gH^yqqfPih1E7x*>58M*DzU)S5)%Y*hKbO+tS_|N~) zY!S3K65NT`Fm+HQxDzjvS5COZoaaW-Q<)ijt~zK>yl68W`x>z)-qO}O{z|-q&zZix zV?Kgf?Dp+Rr?Z3R?Q}=JG*zEZxk2+X{es#SG&i-%37?qr{$u%Q(!Kt?BSg0Rl-N%(4ju;)JkyS?ycsW|vvY zXlZFm>7r1eVYKYM63BvV$CAF^bMBQaCvn>E`~Q_#s#S89=r-y+*(>@i}P34_hm2~S$&tfgGl=2f8q1vh3ch)SX^`D4 z!q|V{Z}E-fV@7c>Ihp};N6I#K3Upc;+P3HmrxZhvAU`} znfb`8a(mdu)J<%5>euXw)S2Q#N+p@Wgh-uDrRK?kF!g5`ueTOAwt36i zD%`1iv#oAIT+~OcX2J?Cs2i8mt`t$w`g_|VXt?nlr}NyVIn(U*ixcOGUT0-*1GW4^ zanoI?+rntMZccgX{tPvg0BbTeln_e(6E&DvUh40uW&e>F9FG4i_Id0?^Z{dLoTXos zJ31)S9GrO^VFlCpd)v$Mq6=EjcCKsfuXGgFca>iD_ZK`bAYvnrQNmuJp}nZ2y($kO zp46|fqyY3rmX42GOq9z3y$P>m{b-+p{AHBxR)b=-FrVJfrE@(Xdtg6P~jpQ70L?ZjT>Qf~d2!G?L(f8Xg^r zR4ZT($0>}%p7kxQ>0cHdtSO$^9BMqVwP~c;q<3}nm(?w8YFu0!?urHK7sg6g7K=9+ z^XE5LHbv~FKvj3`^pV=akk)PqdLr{%TY9J2jfJK0lA4)iZX2NF&~QuVdoniOH)3aYI76>rdLLyrEXV!cU5U$ox-ls zM5<>0_>$BE?6@=TSr&}?%<5oCTcmP&joVsOTpOI$OM+5p0ra1U&r1=$j5UObV;;sw zk}-%N{3C55yRaXjw8m4eoZEltk^*s^CV9Ok^1~Iqmo1Og9d|{4<)XQMV_;y3_p;A4rml-GZ*4sx?wr25vvYN;^NX1)qR|yI*;}d7{?p>| z)B4#v)IM*AbK#v5-LW8tMk=Q)fK)ypJj$b4QaN#_R6Z!2&$&}7C)-adA3`}rv!wEC z<#OWAH|1ziBj--(I@wmzeZ#`fx$eIZQ7()xTfUHq+zXcKlNT)2UxcS}P*g}NCofnk zufUp3iV9KrgNoX0c@LcbH?rlFHKF>jU8tOEz0CN3oO9pA^;|d}EzodG+fMqQf!k6NR#XHv)}kCiwn_SjEG1ksr+e$m9-(4qsU;=m&5xH zc6$_R8>gvM*#w={&TVuAdP-$0XoA|V%tE&mIh-|Fs596g8v|GX)baF3;^m-n#AN6} zhw$;?mgO~qZ}Ce);O0GvLDM?oLBC+=pV<_G$pMx0Dz zU`AK!Q*l$WPh@v`5ZHY`*{u|Rn+y|lybbQ}JT3FW6Wjul%89n6@*$?;v@Mkr?Mmgt ztd7&JR8IE0RKAGaffXJK0c$!$FGiz~vU~t993(IuQALY~y^xox-eUgn?KeCh@Sxcl z#?;T*cUV6R4q$@rU4VPZyJt~{1~=QntTA;kFQrR*Qe#fQ^xM>8#vV-drVi0)_#J#S ze~?F`=cAFzDe@cENUIa|I^*vdIks!yYo>Ms&@axXilV z29vSH-`?5P-QC&d*Q9zK`6idihA73jD3+El8d*fQlmbBzZ6A z79W*SqvnFjpxsv4Usqn4omum~&4=tfBp1lkXMDuq0^0XHU|H@nyFP5*W#i5GN2?ycry|MkSZ z!Oa-OqUOPDZ%`75rL33G&pvR7BhS4nT(0GdQh04wt; zi!R-5lCP`9;YCs@U}fv&QjLVwZ0$^I)CzKi+47ET{R-jgG+Aa+>m%9LD_8$5Q_7Or z(vjKN`ynLKGuW4)#&V%~5;eL#pvGKL9+qRe8c--6+eE>zNfg=;8;Oinim+_xfJ(&5yx%MIapU@H1;%)-C4 z%AXmP!YY@RiYTSo$L_<4c_95Q(RSH9>}Usm_KN?&I;;Rr2uD(35)YE6nHe^i(1XDy zc!oCwGm!JC+vUo=Llr6Exmk%-7m#OUUg_;ZGNn{b%rAzv)Y-fYx?@a z+QP`JQlo#cp(dX9SYk;-!;(b%Vt48RHS1Tq`Wxy8YAOd};r2X}x5p5y_eL5DqLs#q z8fQf)lF+&wSLB`PEztgX{skh{tm*9CwqOcs)zg66Yn0<+C!IKMW%M26NAfIQ-Zv!V9@^Dy5+bJ#t z?V0Q3>0Bzs69W~M^W)WX>om24>b{u!MsZh4Z;N#SppKDBTlHW=?O=VR8&3wCUBh+q z7`q7chP-fzK^SI1* zPu*aB-C(VYXY`5kFXAKpQkHRdr?<;gvQC@<3{bgR9CW_SOG5-pwse6a!&RePVn}s| z92qHdk*JmHBI1fQKL=%L{#*u!xpbicCLzsb98ThuB@MJJV5J*)RJc!W1@xNe+)50O zI0JHiq^>t+Wc!lV_10Lot$JQvu%f5DYA{x}08jPi-2I&RHZWL4+Hayyzv$6aE8uv- z36)t?o;sR2WH}OJao}?#9%!r%85Ekvp_A(Ljc1O;0*Sr|^hxbNU38$jX7Kz6^be?` zBTb+uN2tPWZ{D!}tgxy4(p!Hxv!buD$cFi>8?0+sPzA*z-hH<5ELppV#{&i=3!`tB7d95#2UQY%Q5&Rtq|zZ}hLV2A^%a$tA|oZ~tNg6Knz)Db)h)aq>0T|39=QvtMcjLc z>nmqQU)?W~zLMJ=m-N-&vij5=uM!-yslS?>f=8~Q41SsjHsa^tydC{XY78nk&{Q;sxNvAOEJ zx%FVn>VYUxjJ-7IjO3dO^af+#_qCD2raY$9C?<$#qpr3Ug12TtJp`}CTU6l>lv+$C zGtc~Sx)n(iNsyP75#*KW{p=@f9W;^P;L$}c5+fxZRZcJk!k1LfTa6hXsV6N%myIJ_#uNNh}jhG#3Sk-|4 z$@%~N&?WvN$f2S5c!(dLhK6Foa?Jd-khI8YB3CPGcMn2Nm^(6cT+1EIzN9JEj>K!U zreanV6nMZ?(cE5_+Q}?s2{AIG0$5CgZmAu#kE}2FJ&s++%_x75$`!xMmJg-Z@_gz7 z)Ve~1?~iO7&Ba3N0SOvBcX2H+%~x71hbgf(g$<=?JUdnp9w*%`*Pm~L=1zZs(ho%V zgL3J>lkcGPQ>b08P@hME z5v7CajX98)a>&(UjfL*epq&e|eV}#D-PI_46cLgPlocP`g+6zobc?t+TUz-CWa)(k z={anPs1c;PQtQa%@)Hke*1n=lF3uyu*#&God+!JWG74za8F2)SE zVeV}}azL!fLQ-}g;h`=)N4S>HZWz}wy9G46RQg@aF1XJFk;S7!>JFsIoq?w)E6%P= zUD3RlTHTJC2l)(2_YYnFDaJ>%dLd|4j&TsZCOqK?Oc&2`=g_Y_56)#@n#5g6>$l&2 zIpluRK#(j?&!T$(AFNnFQn!LIMJ=7l>5Q+5PDBz>1&mt{T02AWNx^QXv;KvG-{0tX z2cunk|LcE4b-G75m-n8bP3nsGfh+%3{1|;;RTlRzVk|*@<2LXM=8~6VeFmLpl@@B# zvxEycOjHh-_Q|aKjid9wiy$ko(S+ zFz89CurAAyF=%IR*cB)>L};MDW5`3>Z9W#PW%w`9gY#sAYJXvi$vQ| zP$N<}FJ1=F#wvb} ztm4cyvt$*&m9>hWBda)b)h=1Z@vK$+99gXL)kPOeR`J_eyY)G;iuqMo#hn?e_&M?B z>^&$2Mn-TtTqgGQoOr!_H3DgWH*~ag{U(mdjWk#Cb+Vl?&MbyAkdWCOp1@t9)wA` zmE71256vug7kf(b&8||PV@}^`gmNifC-Vf!{QW2#xZ~auFe({HpgHjAg13!#BF^YoCVO!zR zOhmz;Eu$F?N`i6{rd@s!K`=NgPAmg-^C(zsNn<@1ljOJ5%~yBF@>0)!3|cXt0q5hRB%;(GZ*+RvX2O91Oi1QrpyG0Rfv;4?2#U1)stkuAle;ZbVkEs#e*b>R`fl!DEE z8C`>A#sb_rm)fb^_gC<59P2uQ>%$)Mb-Rt0#!z0B zKTzi_X)LTQ@HD#(wz$(C@#RI_-gwyCpmlkTjy!85=np$|rn1UFh1;2Da@j2*Z(fl@ zt9M62!8)Hr_ke0_A{PnaaE$MLqKGgp=|Cjm zyz+UCu^FNI^2(mF#Ii3JvsT4LR^A?}>$2(_ z2Wp#+k6XZK6U~KU3RY&upo0%gJk=2H)a* zU7(?e=7YDzZKN{+rDWGq_Dw3Mhy|6yM(Q9NNh+n-gj70YqS=#5N#jr{sQGM?Z;RkL z(io(xWRFPq3^z%o8)*!3DOnUh;ugi^wy2e#<+MT;h15#L8nP&;_HOnG{2VIPh}A5} zEec+a6}eJ5G(MG28r{a6`zEgELa|$1b;SL-(CijF4!aJEVgf3$_K2&ndu5n!6f@W& z{Ve6+<|BibxqdB080C>x&LaKH@xt}9H2#q)($C8gVSEad;G{K{kk?0g-4XD~kp#j{ z^HnyKXtd>(8Rz?#N01C$@ZwIVN|oQ_lh-;tc{C!*z$U^zks)4cr3{!flcWnJh{@__ zIG=4NyAcp0Ug1$h9bv2z_}3He`;7Ow9=EaUQ#Y{lQx_18htgZc@1ULuKd6=gl_QP_ zE4o{Kr}K$R&UwOlulCeh#At584$HHdBek8~lDbLB#M6nY`Q2PjZQyh)h0OI4R~ey@9X<72Leo)T-4uRey= zpEq)7P?N)ctql993_Fz*>{JfezmZ_4Qi5G79WIo{&wGFHUV z=e1dF`%)HDT*YEAw-f(`7`Y_Ow025*r@z>+46`~4lmUqws8C|6z6a+wLU#Z@v}+w z!njWLX3{72q%6Xo6nM7^3>dOxp`up05A8oP=|1!;XjmDwPjF$k#dmYAW66)y9*aut zF|zm2o@l~v1&@gT6!kr@C?Zow#VOX38%~=XB_AE#=WrM)l134=BO>M$+hpJHP@BmF z>I9D1&2pbp#^I^Qqx5n_<2*Pe3YF}qY*2g-u@}r2Xkx-jk=K*R*?MlXkfX4vtSeI1 zSyt6&6%}TiQePG?47Y@JeYNp9;b!*J(ysEF&QNukZb|CP6ZHk<9%~>`Tv*jMv$eQ6 zj4@PVJ<<@?67hHf*$WhCnkt@98R;%B?=CB&_lP~*T#TOZzoa=NR!HRlrnIv{DlTpf zmmuga!pjiE>##D5??WB<;skVb0t*4~;C5AgosTpNiQcj$7;vtjm#lmDSK6 zL0+65!)m~rBtL2LE&}9a-LS5zMNKI(3b5!Kx>xmtLOrXxXRMkL4&$x&+-}CY&+VNl zeX0}7FY4&H5L*S7U)bJp(ei|Y&ADO4NjJ=4_&jOF4RZh;@zx*2>*XD1fURYN^K9|@ znnK@$9IIo!xfH1!p(Z_mtT~v6lSeCYQllQt6E^ibh8oo6kG%vQt1H6 zU{~5X?8FnDiqvx|*7+1;@248u@aGV#oOdsc+SeW-sj7#${T+*OcdL7_N^F)#q8UwJo(zZ8Wpk z@r{kkke(C~AwR%g7OxcYg$mvuxD^f&Y{~5Ek|P{Wuxz?%S>yB-=O;|V-<@Ys`<68{ z9-l}oZ*EvvU%#*+O7GglvZlGCXDlnXHJ*KXouaZjfi91a+v|s-(cyZmC(!~TjJ66x z{v$@K#wP-ZGzEW5eUQfj#?+;pY({lpKCCw6Sh)?)YN(++7{v_}S<%8{5!rbyjYZ`g zpS(~;?Q-y4pZG~`LLK77<*{&ARaI9w8ksh;ylHu3)A0#M-B7dv)U&7|I#idK6OZ-w z#^Q7SQZtY+nr4(&Kt@4mbeRo}^J{@Scoy{wqZlfNfiba`y3WqJmfqf$EKaWnPRjx5 zgaibbgje7q!kxOS;EaAcC;Z=(0f_k_l(S@Hko!H!R zLQ})?uGv?dbwatV`RtQQRn^lRE0&lN3#y}w;_<~%(mOK8LrdPp_0hA)+f)J5^Wbyd zl*^g(I-OOZ=FJSxzYtcib6KVMd-7(HV}uBmU%~UVpdG5Os7~<{8Q^ng&g!Pods?R_q+cB2{TczxmpTV1A zzdD($iN|0V-wSw4+2gP*HVeq?(K#b<|2YHDJDk86a>6d@D=yZdM5=?*@K3yPuR^8p z#l85#RH8TGb1~*?^x?ZN;qx}qRl3A%VvV)PqSPtzZVg%$T7|X9x-QTWummjhBWT5M zx*V_;wFNM2obI=sHH#mUZR>E`J>gO@QrvU>Oy|t&W{MwgN?o;S6I;6pW9wxiR?ydA zJkR1b+Ts47@Fk10^C%*6xXz9}=qPeH0}e;Pi7%`&`xU>yUG1Ri(~;leXLjITPOFqy zjJa}uw8IFZlw$Ue+3CC9Xw;8O*+dhbBP00I*9ceQ88R3Fm{Jo460el=ID7JC()6No$O~rJVy1x@+V@!{JwwVOq+YvW{pE*R&Qiit8}W3 zj9sNRsU7&cS7XElqvkwz0WO@&&PQcEzTJyI@yf(m3F$w6l`kk)X;qD9H)j9iCl%^c zsIwE_@E`Nn3u-u@&&=dm>CI%6vzVrl`my`!C*u3itu>fMGB^^_1|f(yH6*hFIOet^ zj|ggV(Ef5^b$+BC(aW+K^#;2>T-O>z>M3tpVL?TnnotRg`@Z=#)m}&8j3%tnDM}Qp z3TsPTSl(9LTJLh^msif&m@`);={9x`89u7%;%aM?<3$aRwKxxDZI{%TN%)K%T3b4}7-V)vwUxm#^HYLq9$rDXD zh9g`YKV~9ap;y~4Z9hnV#Pyx1Kf>#CY6-_iCh8ED_28)uECOzEa_*ks6%tFtVv91f zQ|O)s2;NuHsj$|8UI3}L(YHQ6E#z5<121Lg!dCsAlX+Ivf;M5GSE5`05) zDC&C3>CxGXY&O3`=W#YhoI#Jt7!Cx&MoU4!8WG=e*Oh&*tt+6{2fA9nUsmUKC<{88 zZ}YZQGM`x4=6$NF&Z&fD!*IUo8LR}ogCeD19#N&-Bf^{fOd>jF$y4XTA~9*hXY3~Q z?k+Of{dV-;6tM;JEutw{R1`Fcmi&M%GK%hhQxz-Jp!?}k_s+Vi+w6%%MD($;M8bAk zb)8ee&rV36&I-{#$#7bBg};mLyZPq(#IGIW_i+eY(x(fbNHs`lQ;_wO`)|4B{_i^! zOR0sM)63X&aT}ebN3xu(M?xL9>2I!?TcM52tgM_F(N@f@Va2CBdTmvH<>=ifoN)JO zWnSgAkDh`S&Oi(KQVWcb4;zUioI<}WUuvSNDyIqDDL0W{MNOcMld)Q7sqohf4V=vO zr*wbi@Sh?)&Tg5watfo5xHxR%Z)P7Am?sK$n!G-r*K2a4sMuyJE-tpa z?m0>s^?4rpd^OW&Nwq5CLWk(q70da~UN!&!*D2%UEaH6%xuZOCWJena=73-hN%!YM z%tHSaCdlq;N?#}Z4c1u%YgdHiJn-$i!u;esT9h0p1%3HHvph=Z|rOuRly|3)X0 zP<@oXJD+GFhSKv;R||@S%<*VS0ty6UI~| z;RgA2>0Az8)hV{xovmT2%VS_o>D#dbw^$^oge0A#H#>cvcq;bkXHFK&hh=gcW-p%p zJ=Svn7L*kvzJe~ElsyGRWK#2d7OgJ-%4WN9%Jt>g3Z*#h=xfZ;{%k}{&k|{^poV-n zvPBd4bI_7ga;l|NHt&!4($CLpV|!Cu94zk!{%$(<*=^z{Ney<-&|9+i80WZQ)Mwxf zi}maqJlE!;qDq+7I0Y0j9B|w9L=k; zl^e^fcAG_S*BeW1)ddCB_7Y>dC>99F|BKkOC3Ps}cLZ$aGGm#&rXau4uEQNAR)@n@ zV!SjEFDi-$g0Z5aSP+m-$NX#+Q@~jxBIq_+8RoJ%vN5UuV&}Bee#d{icX|f{6^2Y;$#Qrc{OzyX_;`i(ffpt-ALU_G4?I64Ps1R6?~*5GgioD6p9-1?DH z_CJm#j?a!kU@ZOX^bmB_F7Bn0rg3p~OUq`c*Tb2wnpfS~ zDXQnJN{G&e!dyROR!UE22QK7s zs#5n?dfXb;?{ItvtMk0ot^WEl7!GzV(txR-m6&|_Znewb7_k-QTbuHcK0GahB6N(gyHUDcZ86cPreG`@}D#`Y}6o z!B~)G&Q8J@u)h70)YYkTaT-oua%oF3Zel$`M?3-KL@CpEIx#T!!g9PBbhTu7?NcSC08tM zk{cK;EXxlC(g_p$yE_$^jc+gU21g-<_uzJ zILT-uo}~gW5c(w>aaiIgC~(*d3U(AY9Qg%yM*-Pg7Wih3i2SJ8UsH7NA{_Jl2lgW# zf8*;TKslft#vBhm=y>QM_M-Iv;CRC_P|HRUYg^L$2 ztT52WqVm+N?EUHbRi~c1s$S1OqIXei3{NWiMl54rQ~W$pQW8_C>dqzSm;E|5Tl3|Y z?qm{m&PJV5)S=9gO64lS+QQUXI0tYR`wjb-R0+^e#|e*naGI=&+rlbUtfYi2jW%iu zmCs`A^wjsoe(|eY<-XjW{fnn6K841*(1osD$}2WR5kegEPWnER>%I# z7GU)?=_y#4l1)wCBk{F#jtF1Asq=-+W}nO8b&6Kx80>{umg#qy^KAI(46+vr?O1bJ zULrdT^k73-qsy(M5JD*rVI+Up++Lt`AetavEk`UA zIGtV)pB3jJyTNySmPn#ILYX`@*wt07B(K9G32}v{1hY(kY+K#p#^UbdV)5fN&GlwRxST4IL$^-@Ww~oB8s~4tw`$b9+zkEoR}FYi9PJKEq)(m(;e+ ztF1e2X(MYoeobv{e_Ktl3AR1wydmae8^w1eN_5~XCq>vn#JlYd$5mH3?zo=ir@j>5 zO?9$sQWvvlQwwas$_we2u-A4c=T+Dr^zVh=I&O1_JICKwSjTtK><{8})1ROYd51ww z5N&#bjzKopl6voqGgz@D_2jwYPDkpB)a4HLebhGy&Fl-Tt_J_JD1b;neZB4&yJiVH z<-6iY@)I`Amg0M$(g~g$#*84g8=;dOkIW9gKCQ`M#(pGuJ(ohEjrM5E!>ZH{7Gvg| zMO_!0iW&l-(9h|D`tsNb$P2Fv&CBgP=Y2b#I z&dwH;B0;SLq#A-*aoZ%A=Ln1czrlU1as6M9iG_2<`&}9t;XSUI~ox+KoZXK$`va`|BN(u-HN)-SnuX2VJSmEn$RQ*m>sYJPq5$5zp$@+Wpi=+{An!eKHbcAn2UvGa-SW5gC_8=~REfk^ImB2sRF>ZY6L^jI9_fS&w)lX-?B`9povp{Z7o5+?a zi(5+Ql()q=<;~eKudH@SbHh+|@yx~$vhvE(85O?hjIxqbN_4&@)eUpYtA}F6J&mE` zX2zE^EIBoC%8YP-Y@@~yh?Q5&EH4aet(Jg0Fn!vzdY@763B}5)ddgLXV4||1w$$ym zS&VrsoG7fQ^P6;@;&@rx!dt5nVe?>XZ9HUGgpq7g2-gT_iMNUuA~RDjbRB*M12_G0 z!(^IlL`x$0+(qd;;<3YCnP1meUNvW$#qTp}ZKbY~uJV$O3RlE7k~pEatgQEh1br6w zoH)Jvtgf!Jy1UNmY&_#DqZ!jtGrLly*IEpEEcq_)j2QLTmG)w3zzH)Wk(nnnH7@Th zwYQ%+qxY=#_Op6>&TNCkjUb29CjJidTLf<{3VNhW_hhL`etO2Y#k}Cr0wjsUFnqv# zr24}y+6DMTS$j!Ids&3PhZ=*y#!!&nZMF80x6o@to+RJkt1Yvav3rW!%gWk|rFUzf zF&u6TNbj$@3i1lN7dS0;Qqe6bG<=bx*$ zUaGp(ni{^N$JQ<0!+!K5wvCzZy*KqOQ&@NJMmsI+Q{gS~a#%W&)tuED+^9j~LN;Qc zUs_znZg&_9>fP>Q*ZlnA;{1Z*;sUYOUF>wy6{j=oo?cuaT_7!cayk!tSji{ik+fvP@zx+k_%rnEN9C6&ktHZ9tNzKY9c^rXe7MU43xl)sJ zGPE3_$(nVC?^{!JV0r2-*H0WDeLli#nT>1>4&)KB7Xf<~ke=J-_+s+W(jrSNiQ{~w z#7HbE@8qb*Q5y{q1xz>xrwpHnbq=&3yjqN4JqhL0DC5uit)Y<377W=O+%xjCkMip4 z^YiQL^Qw-k!hcxO3vhRdXv8YgVSdJO7iRTr(SqL#Y0YAK5Bo?sSzL+Vi})JGTKxVQ z|2;oNUSB=#XZT$z!u&<8`6p883O3Hp62FJvL;S82Q0sK@BK#gqOLy&N72+-UJ;1Nu zjTL((VgY_HWi+NJ`z@?^+KDAhVZ}>EyqAo4+FK}%Ex3qy^_9`!bW@oyG?!gG_HH6dU$Q0ualuDR9|aJsQA!e9xxE%~_OPl95dOhA^ConYz%)H1ku}DprShSkju4j8N(p$M_52N1`mNcs-+$KJPY&^4y zg|&Wv4Q(q4Cd6CI`>IMiB9V^Lsy@nPcd%{3Rgi_5tVI}Ei|^`v9<^Jc@roDfom~|L z4YXiNSSmg$yrzion)24OrI{UM;vb|fVR(WQ_KlyNew=)APiFZ5*tIK@d_6_Vxzes` z>;k_9r|@ioZ#68i?h~ajHK_zPW>l&tTml{8htGkcCqP< z;@q4!7jD^t%rikHQf~Bi2`b?Rlyr)hLSx*Il7;wnJJGCI4w`+G=0KQ*vRd{TX!bPx zo}W_U_kTyTCxT|rkZ6|EXg&4`QXAkM?8)4%*Dn$^P#Gr{rX zH0ut@`vF~iKVVQ?=$q_!mNtTViDrk{H>^bz(c1`~zM0O@tcaZk1l<(WcMW@!tpoia z3PfiE=TaYoFLF5fU0BguEs9BC7(qtxcL4TPs>60+^${a1rBxjMkAyqHlSD;WlYi&&jwRyCjT`wD zX*MZ72K^kt;z^31C$PXp{Y%1(jY*6t+CmAo`!K%D&<5!s4~`Mhgd-PRWV+b3kzFNT zbS=B?2R|U}Z3G|81|RsrFFf=hX+&sTXk9K|WFszeld;rWURzdSt2CNtS!Y-bb?&-Y zVV&PsZF$OIDe`+ubZXNQ-LO()tcVnZU`J8=87WJ?Wh8;|MLleZ3emM5fhS}rTDI-V`ii}Et|51cFT z6qS4b30M|25SN_9UT1fRPf#g8wW&gQ0Z-FS3rkRbG1gO{T%>*LW$;8c0k=d)A_7+* zflKgGen#(zNVtx9WePf5u=ngbWRanTBPC3k)|J?lC-Lc-8Q!Va#YV78?`BS;pgx=Nhjw-f4W= zxY@YHIA$`Mer!5qHkkwFM)MEMA6sfI|6}>gvd^lu7Fg@7-PWh9&s*QNer-+KEVg^> z8hg+lwfEQ;+fTFKXaBAJANKd{I~{6Ao}<#y<`{6Sa9rZJ#qkTrvyL|%JDh^k?!44_ zqx0v^KRNff)UG^Ng{#%I#&x6XXRcql{_Og2;|yu9${!n+EeEc{#H z+l5~jCjFQDZ}xv$R8n+T(UV1gD|#!iGH_AgslfArw*y}X(s;}rvW~&N;L_k3!S%uK z1@903Hu!q*^U#dYqR^?K8$&+}y%>5gtP2;0acX#YIJ`Q1dH5&cWN~Zpyy6wb=NDg9 zytxD$ElTE=++Olv$)=KjmV8k%Ug|8JR@zm%r1Z?v4W&OUeYo@wrJGAXDLojmL`oym zBkxD{l&Q<|%6?F`y)0dBD=#Z=DZjmZtYW0%>WVum9;(<>vAN=tY5mhqnD(7%8>W4K z+WnQG%FfE+%2kyYS6)~7_sVxFw^gR9Tvd^(rm8tr%c{<7?VdVI-9>eOsxPcxS$|{w>-Br0^P{Vxe{Tpj%x$i7o< zO(Kv;B-SQwNsKoZHr6yQZv1iMrl$O+o~HAg)y=idcedDD5-kHQ8(Z#c`CZFPEg!Tl zZ2ep7N3CPiYp1WC{@v-fOuujX6K&463)_C#wxuoEZfOs;&uBjli}9{+|55ux?VCF6 z9cw%Gbza!{Mb|*r&$@oq_2;hf?(4hXo#CIcbjDLX`90_Myf(9c=9M#lGxP14U-jyG zi+WG%eWdsKK4o8V-;BOBeYf`gy6+#e@@Cb|dTiGI*{f&YH2b01ug%^)r)kdXbDy01 zul~E{MdmG-Z_(F!H&>!QuMhp5X<*fvXgqJ$f7p#*y zXpu&B6lnHJ^$i5gKc&ibhqayq`!`bUkvq}o@@wU34kWs+G0X5Y=aCy#HUMXfYG z6ZIb+<1Ho*?>`3{N(mc;ySMCAo3PP+7`zkM(7ws*oAtm(pd&qB!bV%=RM^m(czxp` zf+oSCiGOui>l3i6B-m{Z)ONqXYtJ4yto8)#AMWC9Ycv}G^m*8LL6qnB%k__jy}e0> zqt7?*X0?;)O_M{D`;+VgfxWdGcvv^NmNuu>he>7>I@9N;k7z5GzCpWMfxWVul}v6a zw~i(Wr;Qcu24qw6i6V)k(wJd48!jk$P>+0g4mKifV`S~u- z727>)ii+BW%28b?^x%WDXTSRD#TSour>{t_O|MCxGpYRHHSiZK4Is+RL`8=hGLg$gEKUHb~yF& z0}nhf`+^HrbVSTwy!z^^7sw-=BSSx5hQ3&%*C~?YhYpR6jRE9Cf=YRC94DZgocX|> zS(ReKxPTKilqzw(5A&i>X|#B$R9m+I=v@bxT4&4i`LN`6Lvc}6#ISGY)-8B__VK4% z1()^X9eZ}@5+kRde)@6K9S0R@9ItaE{cA8R&_51}&d|SB#*NIiI4z8g zt`oEy)}zWgq4XFK?O_bZ{k))IuSmTm9YJ9p5n6!9+Yf_oLR09& zLN!1#LQzz82tQueAv}+t4RU>pJQ}&aMlDGRQEl?z-uXMLgD@#UE)aH!^6hUQBVb{7vL284Ywq=HJJ&xhJ z30sG-@NZCiqDGLKo05{vHX3)^?98|iqf!NIG*R@7*+8n|$}RmuNS3>qdODe!)`>Qu z6x0mQtV8(4;q;t~X~c#hoi+VTwz`gn>9mcc^H~3}q_f3FlDDIOYRUW6AsA-sFaXG- zJHHb8@jWY#j+8a1Drh8Glj;XLrk-Pk4SdgZ{SZi#@S4lDqK)K{y8qbn=qrx>yZVnM zkAMrvqw)S@$s@asJS4*C!a6IVu?AGPwjg93A=22CCo?ojSA7x)17-i^LvHFzD zws(T}*6UV2A31gPmMyD=_EC1`nhs%u7z*tiWj}v!lmUoIG?U92DKp8J{p}g~qLX2e zc}%GwUQ~GWV@9U+jVe}FZK-FWOC;%jBtII30P$lz`0<7eKORZ-Mo_(0qIxA-ld1m5 z)@op0Zd}(Pyu426&a`$k&P^I=47=(xV>nu!0}5=^WgnQ3Sme0KShKP|6V@q=X2Cf+ zDwu$)`W6ge6hHRJvzI4hB~P9igW1K#K&E>A7+};ml80~@ch zjql&H+hP%PqvH5WFO8~=#~F+ztPGub@Ex zukii}=Tr7SFfhpw%o6CRn)0PVwRSW#9dT$Dq>8J@`17vJjG z+c?XotRuZpw(=@uj4nKp`&&4Ul)*ehB1u7?3OsF0fz^#5rZl7iOOB7_nGb#Q+18XZ ziD-%je!MuUX9``uFF(D1+W};ywru%o=iYhDcjs4I)~s35>S9~}@Z)Q) zx#maDd^TopS+WL!9+S=rgRZfa=hO83RW$NcZBgHt?dkGpT##!*nVbDy} zmSdcHIL4V6XH`_LosrcOu=5z_RXOoZh6DAc$Hx?3coE$mcloZcA0AE>gK#FI6lz-TGC$OE8G6@GhpxSQ{c7%^$%^g;MVlGo3 za%>(TIy~@0j?Ir8Q`eTF+Xu)tJ@ATDTX$IP99X32_JMb(_NELhnOJOQq!aZ&l3EuL z4(dp+6<_1+Yt?f5N5e28&yeScJnxtq!-zZ^dE_}E)ya62*GdwqqFf;HBnc^crwFh7 zlD^;_;!6SPRh}A$!X?p#p9Yi3WH6fC4!Fz*4(!>r%dAt4?b=GREYFl&2R$SSG-#!? zii}UPJ;@+FG=4~<5PbRe^uDk6>u_9PI~QuXg3f5RxJ&Aro0}VIYh%qP4p$c|-+lMp ze?0Td^oS$%<)&P@2U*x6I)JLtHi)|%320C&(n4}vQ4_4aK+tFU(M8c4)L z|N70n_ul*TTPb_lyfqmf%IKtJ5`OYL*i23+IYNqi4BCAMjv~pK{=gxl?x@nds;2mj zk8%fkOo=Xz+CKWKzC344|8G+L03(_5fq1x7&*gh$0p5|a0Lx`fb|ii7lG29n_(0E_ z^hBK<>E*(AW%_KCHQ%s=H=h?r9HC>Go}l-Lj540E9aN+;<-0BFBpz&w(TT=rwVZF#=QOE^N40juegKuhW;5$mN?2$6_wOGy zD-<@n-KK_2_(Si z5hf1=0`|}?EiL{1f6XN3QFiI2N0>ftGJW`bPiAzPR%gnv56YMg8r}W?y$a>&w(#lJ znrXTNzOf|iNhG;c!lBHZn=$7aMe^XD?R?Jnj0(Fqu*C8n94UJvqB->M8pq{l@Tots zr4<6`3L{_?IVvog0xX-sZYP_&f^78J?fek2`Q&`=}g^d14$;=R{+U z2ASJRF^v;?GBJ(SGNxC{n67u(?M^R(3PHcOARkKv-EO zn38R%FZcQ*J!hP8#)<_qyIP_(H8oX*8n-9;X};fUOnvz$Fx~Up1$O8gL_@z(I%W=x z!0)!*^~mFoKmP7cX3Hz|7v?+64#Rryp1s=DC$B#1tg{wPvwZdZ@1A(_w|{x_%L7(q z%FN<1G_%^zaESZ10Ps7dt>^L+_NN8duBq$f`w5@Tfeb#6hI6N%?5vUi(@))w#!q?U zuLGI9@wM{2+#t_OdosCa+rcr&v|S{8_Z~P%0p=t`^T7i|Jc0~CoRcSTpkqBd=Qf)BeWilp7$_skisMm(M#-G!f zN+ZRYQt8bO%wwL*YSbyOY~Q{6g$F!6hjx7a(MKPB`qh3xq0$#eljQ&PKUS5hZ@J{k!GLM5feJ{#nc);Igy$SXDTR$h4Fg{$UP6wElfX}DRatw`Q zHIt_3X+M^xz@f)xfz`EVvI)yGHk`~+)dmI0cxYgahLI8JoWx>IiRQVeUwpA+%vT*OQh!N&H;EmGJEr%|oH?_- zrL}YB=_fQ}#F{tW_y$&2D!w6LF9kQ|uxP*uamlO``H5p-rqGOI5!n^(Z1ZH9rIAJr zX(h6QX3AiE3Np`RFfv)Z0vR`2KhAlzsG!0|)!Nzytv0RQ&>^hX^c;G)%l#GBGYO$i z;Z@-iMJSZYP~`uq?L7djs;<59ea=1ip4)q!cBeO{Ffa@Z15BaA(5s*V1B!?u8f&6v z4i`;%|1V$i_a%AHMDtQi)I<}L7&WoQ*hR4*NE^xk1Jh^j%Z z+jpN`)?Ry+-&zY-5TO!$xzvX#nyF%w`XrxkG4vUYuqEUAoIR&pndJGVCZ6BVcRuLR zM5`0oz+0%6)cs}l98x3z5!b}188dlPVNYabH6qME1HYTVjt4t0?07>(BQ?IOtus0e zl_ATEWEy0PWn3|_m$A=^`;+<0<(_znmb6<_ z{JE7?V9pPT)N5KX(GFRykPMmT6-?uo$9?sfl2&TTPGC&CB>lfmdft3#A2Z^CzMkHJ zfxb&;&*=?nSb%^Z$jUO6PvUuC4O-p7zJ4$RMcfZ1xNmR}VhOeSK#AY49z68I@BjSr z>o5MaA^D)@Thpf@Ifv<+-~8r0(u#C9O$fGlS&@@NJm}=e3om^-pfmYDfD-ilKi-7% z(Fu$8p8M{bfZC%fx_3REiM%5zG{Gc~ER)Flay1R4PyoFi83iCqe(R+bD1rS0ucS(^ zWRj66^$DSxhf<-1+5)zjP-=`0DCTw(MHVJt+2l1w2)fRUbb~=~hKAsaO*oJ*@q&+ea7U$;jr-bBz9Jxk<>y!{)pxOE*uz4MP@+y)Z1A=-hLn zC*QtEmRd&NeOyTN(i^A^+-|_oTAA7!>8Yc=DoO6LSB0~qu|R62wqx`>oa&k4neCsY zdTtoMwI#msCx02e(f7vaz24?8XyyWV01nN=3`?E;qNiye> z_zgaoM2C?7IrKFFPwp4{dF66HvVJ@X1nuzNC4dFEH{i&gx)!&&1dKqs zlSw4d15NjM&$L=x7)?{M3nCHLmQy}^;lhP^e(SO{i%W^SI+;;Yv3Tp&t?QTh1CjA< zj>8Um%d(r~Q@vW+m37jt6qzhmv(p*Hy@(Ylc8-Nz2Q?(wPk!o=xC188j+_^&=WXk~2DeMNNxaHn+5Nc5d6&vUAhg4cBekwr%6$ zeEmR2M~B~#KYi_vmXeX}4m!3u_BA)R8S)R?R3%OJbI6 z;mm}!eoJb8P14w9YrofQ(yB!YA)Hccwg6Sni+D=AQ3v}uF$kGVGLc9mK@di~4EhMn zU?Gt{91e%g;`7dHEXg&7u+edoeNxjRlRGDS+Pa%=x@kjQMS)EVq;)2nq${D%nmnhz zzP_gFd>dW^#;nREn>TM>BS$Zd#g}>vRPH=kC-bGT+UN|TW>?3|9-l8O4OF6>T?e&n zTumP3vLGE4)=eZGL=BL%m`im`Jk`%gN@(SiBA;YAA%ls>-R@XSL6TZkJPfE>k_Ssn zNl7*;B_$yRnLz|u`DtpkU=Q>MKnW%;Zq(AF1er>210^sKKbAJAvXYD4{rx+4_Voq3 zBIWME_P)Mel3CucIVB;j610&>(ppeG4-{~B1NlC?x1d0M5t2I0qiVzjAOwY=6({wAawQ+H}?;OaP&Ou*n;7H407Oq&ew5d=J7QVD9#}>jdiMn#CmTvC(qoRHSe(OqyZprMpTaHK@ zi@uCDYWJJHiurMB&*eK^BduF2e6Z7Tr!%Xd?{>+zx-0>iq>8JeYH3RX3c*Ks9u z;YT^9V3D*Ni=_6sY6=pJgVUQ~>o;RjIbLT2JGYxOute&0JP>EuBbo4M9-N!6qcV2V zU9{k)9XpqYPWMD9-^OWY5dPn?9?3+;J)_8m2U%vrdRY&Z@7yc0qf3Exk)+a=TFkALnKMJ80C`Vz zm-hsM6UFUOLDR4SjRi6?+VD!xkVy_)rZ4IfEwicz*U-gKs?e+<%9ILNH+}L`|cHEUkB4k9Wrmcr% zL~J8dIWMmj@@&`zNUjDvZz9Q6eAcU%pCwDKSM0|aIwaS9bl613J&kqlSaGlQm-l+C zHWoX*AC|302`h2bV0;9pklZbex+W&7o*)X2hE8b>$!Ne=+xOnnPe1+FcUP^fEB=x^ zvnqOS$dwXjHq8;mnaNqyKgvdk);zsD3DIWyp+j8>R>Qc>R19OUl3CJSOiE;_1dx-8 zEdDTSupzZpetB)8>(B)IkCnv!YcKD~C|;wd{w#179fyEB&Xw+lTte9oQR$3U8?QBB z>$6QJ11fJNagixanh@3C;bMn>CkA6_BnsQ8FL%n4ZQv{$=2V({2m935-?eLgZLtd6 zC*i5ATd_L3WEwU-yRosh*kein@9bV!(wmb%eZ`6uv%FTrAaE`hdKS%>qo1crds!## zrGN`{pH*u^m8o>NPtzdyW}ub^$q`x|fq==x!ji~yq#N$gzChAs3Iz6RlF0z93&}~V zcQle8k|*?E+taf3_IvKR=f3;yxd(LeeSGxr;f4lPG&3{P%sl<)mtK15P@}~`M;vr{UoqFi>F={f|ytz&vsL4%0kPcWTq9X_8;@VBJZDgzy zX>(96zJ3$4aC}~4aZoP4bdzjbz*Q)&@_uQR=THwLR>JY$TWzb*S||GW81mm+^*KYs zfxy}|t5^T`R)2-in#*u_G35WnE+`z7QyVvd^NBpKN?JWRF2Y6i5SjqegW@w_X&^Ey z6cTD017tY~RzA-nOZf`VnM zR)TQqYXqJPpKotJed0*ULp&A*SUfbMXwh!w&G9L~?4fqq`Ma5l@!LQbrqtGqcvf+q zBW@&s(l9w^)B+WSZRu==o-ux3!(vQIvRT&P#u|4j&PUZek^G;slPqeM^^uXcTdM*w zg%;uAR>i-cB+bIZV~!lZL~Sd2mvU$`!Cg9X1xCv+Y+N)18TKQfR*lYD$&kdkMywW| z*^_$a@2@;lZX;WjTE*^CcJ+Z~*kr_YA8V};8VxN+68 z=-1g1t+x>DcA%@RL(1&H<+OpAcN^+?(wZA6KgrBx^(MVNAJDZ{ zg<6eZ6Mz71#{FC;7VE(V@(9OIX{=t?Kptx)-$0Xs0w_D&;Q6)n$&}q;^je^z4Lt)H zXfK@sIr^kXezMcT7g4iHVS&;D|Cu6U#SXFtgH|9(AG>8)Mgw_T0V_#MBXW{I&bk(Y z$i62iI#ys~*t)t&0*Q_J^eemrQG%3r6iB>d-_Sw~XBTdNwbFeaH?StLQDVPn^><5z}4xx=&0~7+zDz2DdU|9Mt6bRB$muza; zam#hrZri@|)?4nndCTtm?!6aC&b(=}*4?sa4?=JpMU$Ix^>lUuDPXSKv2_DrN~<=k zy=FPS&aM#nu)qE6*`uF)Dt&kC^J4;$GTKa$#y?$}z02W*Ic~&Fh~at!wL$Ns!@P16 z0ym1msWxqE*>&YAM4CMLD#Unp3+lR^Ti0BD6}BBca{1|Fo#l{+a!Nf)?4`Krh!{Dd zxG(^>Ix+889M_S%1u|FS-(&UV^iWIJ*4?tDYc!21F*DGZ10$7oR7UsCl~x4lF;E8@ zH|J%+AR2XGcj+48!zKku#W$s-1FVVK0HC|LP`*Yg95`>B%ko&2E6cKJ>rGfN@sF)| zu*r~2MLLP10$m?$$f*MMAhlNkTmPSYpv;bS- z%;hkdEuWchi}q7f+0~{q7|XmVLs@-gt`l}*7|y6k>}nHPYCpyr`;eJhb;9#xX=pTO z1UMGwWgi~XdfBHrR!?R#mG+zF$xVTVB5g%aVsjqtkeSGnXh!Rl%|_9L#-lxn zCW)?E71lFi&(vlEEP3)?YC&ve;7k-Ho6#e&IK}p&)n@4yvGD}HL{n|3XatDNX$reI%~Yy zNsX%=Es*+DEt|`1SNB1UNYA1c8gf+r|1yJl@?=So342i*`Hiyird*f59uz) z*&El8I8~Jfqu(ADr`SRvDqi4A2cNP6maSCtY6CoI8a1yo z84N}>PZBzVQ8$_^=(XNVm&sfSuo(;y0DJ0zPqW%xF1NvC)Z)`4Sq2Ij@$gxa)_S;b z6B@fccj`1fuP~(BtTy=YLTyJCTD|hCxJqMH@nkqNmEYL0tPyjsuc|65LKR$#**l|V z@=RFeSFE{aJ6`pTbL*`SR%@>y0!R8qd^1#`wu1)`9=;IK*@|6B zSjQ5s(mAW4P0X#D0uX;*Mn+CybAzkU835Qi;4G}$eCw^ZZmNYeS##*nvF=2aL;ss-$$zO^t+v5JDCRM^n(@<%Kw3p?C&6V#R-|Ya(JY|RF$mO|&IJvl>Cogf zgcR=4FsaiF-!frc(~snK*6r?(1h z>NKR7!H=Hu3Y%3d zkn;dcsSR)mJK;xzvRaTx1o|(9!)9}4rb`sHcttW{x0|&*7e|}`W3a^)2D`6lTJ!d; z+qQLfu4uXDhV?5qY@uG^`RTeLxVu8O{Ms#hT3U9kp8~Hi+}(%%`ayg9{P_<&cq7Es zc~iamcx1zd`I9ou!{^SOQ_fg3sGqq(q5v7~b&WLg5|a%=Kb7!N_>I=l5`#^gR`{rK z78r0EcSc%TIx@| z^CkL{HEy%RWpkvZqqu|vhC8S$NE%|$nSe5|3Qq1SDc~h4X=Mj7Fh~f0 z$Fn7ELzZJ?Z%?ZNQjde$!yxfoBiqBq;>igI<;lToWS)Gzv?kl7r&R#-98>8K9mRsN z!Y>mOch}%>r^5;aB@Y^DdS<2PU&`nTU&MXhKwf=R)r{8yy6Lb7O^+D zSB)mU7LK9)1(Phnp7gRwUbjkga`XKl$*{Bbn%(y-TMD?*);)V}z4HOsIeh##ZomEZ z?eoY^p)8p+yEZNd>||bn z9<~Vae%LGRL`^)-sx=0%2xoeRhn{$=-3EAkdKzL<63AH*RqC`_s&B+OjS1U9&taUH zgbJVv5K4`3YJ6c793W-5Wfd%qhq9Y^mV}4=e!X513lBn%3&sUSFsRr2aHZ-CifUHD zMt$cu_H4uguUx;Tv2M{_x2;=L8AQg5ZdXOwBr8S6mP?~=GOny_7p?mn zH!;h{KfUm=0L`*$lZ<8=eKPf_lWBw}NIIFaH?3OQMI8ev5QaUM#h~N%!AitpC!nr6 z1rx*_#$eE!uqzHHTvGza55s$fK&==sRV^*sm&~X{agO9Y_h?8G+>vY(On!e{Syxxn zw0`5p&0Dv_{KlO)ai+^Z{;eH!QcBcpn~)Nn)TU{Pn{*+mStmAR~Ujn$*VNxh}UZ8C2hy}ERj!1pZZOIqEr`sowDq04 zDb@4%nvo-URqJS~wX7M9mbe_uRjrj@)%TD(wTn~___#Q=ixcSqtVkE?%XBf;>YJUE z^Df#ZbKdKuGv6Yek!-u3ax2!BLE}0B!*P3Zvt8pH9Ji1!Az3-3l)WP9k9V3-j|^}+ zm3GzFX`trL?K^huX(W%3Z+lwCJ7znDeCmZza>$maa$WI4{8MM|Y8!KwQ^c+cWZOh{ z1tZd?@-qE8rPYzW5E?@y-OVR54a6nzFv@3n;e+sL>Mq{9Gc)wfTHKH<41d%txF5E7 zwIq$?O1+dyYix4zY`>ldLeN1CTL`Bx7%D3ah9sLb7)mFl8+@j1S=v{sy!zP1YjeWq z6EIQ|^!groM^#rB*T?B2ULr3ucTObl^ons3?H>6|k3|hyF{5IcN2Z3+=N^bSdhRb$ zBkOoF(S=l-N3OJyy&475j16{eK}M-Ml3{X26(nC!xQs?*c`_J~I7;hd)=z38|3$t* zp67Efexu>KOGfAzj|qzHvu45dQCD|DAmu5pD({C=>Q@t0X4(~zG&kLku)zSe!C>@h zF1fzB(Rgw1&DamVy{@iZQCBy60?9DqqS};w=R_-oT4Ojj*IkxaMz53#W57yz@X!f3 zq}fF!jpdgmjnVxKruupFNjc*Cl8PUN$+xu`XE%}&|3DEGum>qkvp z;;2nmo+jtCnku!i>9ybpFjTwU-aO<@03aGWXb2&zD3BdU3qx%;0+S5+G}B6Oyn%+f zVdp&ZF!>RV!MDk`6g-`PkYL>%)DYFO6@c3E$m7hM)C{t3uVcaDeHIL-vrk&-rW6EYo}=sTis*B zkq9IzX3JeoX`E2UAbltxt;3{f9XBpetT=SBb;`Ja2LsRVt2)gc3*`XEP#H6o8%}jV!VG3XisRKuhRoJN(h_o_g|kEc?_` zzy0$&M1 zC~m}E+$6_jifwap_TJ`$&&9v+hC{Ncb{}B<;ccaa(`bEW{{~gr3FOob}BTF)&$g|CcyK_ zq%UI}F{N|ey3R2*0=1|Sc)ihRif&~N;Yf|;iiVY!rAlX+0+r5B=(~~pClM6xyR=*b z`MIj%T|(cY{eOXX3*<=Eznk6t4#QM&kJKq;$ls3SjY)YhG$YYpz zG|r-Y6!wj$sRbi(CNs-zP=tE`f$IUR(w*hYQkg9{5J}!(P(>pOB=S&%qssojeD^!w z{Y$?xZ7s!0?Zd#I{F;*L0+4Z5Nw%iHV@UbHgE!4Eo_qF3KmO4(XLL0; zJt*ygRvNW7HEJnKs=hCdU>wpx6m_oz^A&nzD-!1@+qJHh<|q`2b}gdRXie1Sfft_w zw&GN{fr-p5ubo|KwPH~F@)Af_(sdDANb^8`J!|t~;Y)Y$XxyYGH-f?2ksLl0Z49`*aMc>4>6+FyPt zI561#(a#@#_~D)BAql-&MS>ug zAmG9d*n83(IxM%~Q0S3I3#jVe;V8BgNfPkl6@nQ?WgV{w4GatnCDlqjU|3~da~RD0 zp!f+ThcBJM)~%w%P+UYkB%-t+I_*+Fq<#U4M)p5Zo`8v~ z2*$+W{vp`=6)LR}ULmWIrVixUNXVJ!59pj6C^@EgsvMk(-g@+8;!rT?K%vCZ5KJtm zb2FhKPOs;Ny1Ir4nbX#G@{?CS#z_fiEigLQ*RR^TY*uY;?c_{-tfQ@M>(-@(rqHJ^ zzx?u{xT9=2jAmPFtbHKxe(N;k|8)y)l(toCfe2UQsOk+y183K&jDUEk_hrLN<*8VW z(5=-K9>u8-4t&_I^bA?5tE(+TA0j2uheN6L*d(pyCTTS%g`;s$Mv_x%44?-y{D}#q z^9jZhaa9b2;YV#2ogIW>*Ab;q5{-rf!@&T~uzwKeIGjk@jXYwF*r?5>@DF#N#-)6= zcQ~%K`6iv~rg`RKCVPG@$YJraSOl zwZU-35A}7lU-Ac6)MU85PG#q+RRz7F<1ZjL(CZh%hH0xLx{xJgRca=wePd}}PF{zs zfa30t&9ALtKd<0>dWmA?*$=W6`p15rYCT6o_jWDX9YPyvO?BhXZ5wT40gF|jX# zWy4`mUwQ~ZuknDtALR+U6M$fchx@y`x-G-; zXzuUp?Y?xummlppaSSBhb>y9Q-ud+Cxl4mR@18t+cJ6{0!`qzsQ>IKQ(32BF?hk(O zlb@bG4}ky6fBxfde)F5(KJ%AfKKf`+&u`!T@W_$RKYizK&prMFX|%GooF%OvWRiGX z<%VsWM;TP$H$#^$^{G@nJ)OP1A)f(Awn5LXT^yI$FcpHouI*<(doeBT*=K+8$3M17 zJ<8ZrS#wc39kDnLII_eef4=g%Yy0|1wE%}6$&o%G+stId9jD6HlR|+}I`=D*dp(eV zzXu&}tHdX#NIPCHjo4LEY%+)4?qo7tQDHHACQSm;G}lWC=o4wqupVT-LYger;{k}0 zVRXJm@*m{KeCee3SFAX5=KV(U40(nvpR_uqDa@X|{=QrA$ZrX#WuVX1>mPgU=Rco3 zIHw6!!of|~8Z=Qs^&J7yUb1S9^T0`-)%A9n=;JL1_pylo9hJp4I2j4wBAlVq? zopx;%`82|Gz@HVY5_v465jVaQU^ge4tt~g)*xl7}0e(i-sO1Ef(;B698EF#`a6(bg zMZi%bBdg97r=FtZP^gMia$USDigk0vx`=q!C5n7MorBZM~@wYkAX)5B+(lutsep#2}q5|*(HmI zhmpFF4w}S zEFTo5_CU>3m5&k+ulGm%5tTs&W=z3S@sm=0X27nw9%yvX({n2g92`pGAq zNjqZF?a9thq<-bBJq4+Lby})CQdtuJXld89Z-a`_CZh&58w#-~Ihblh0T_5|tKY+u zF5)@qoHo`~n-e&GJdh*RfcloS+TUsr>7CSDP|OX*(?USuT9HOlX@+Z*W{pH?3=1MX zf{@lM_!5BCjfI;#D18l?@b?Jfix`l58gd8d^;#v(A)wduQTX$)9{}C@;gM6ugW}gT z`ZbKZLPh_MuV^o}!_U6@#fzJp&!0Pcx*54sk+9XiVDa)*C`DnPzi{!AQ*9@Xp^Vs~ z6UUAorZ9-Jr;Z(oAXUMcGi_~63zjUq(B5{80U|a{?<}7_z1*o6zh-q}anq+x^_>6U zgD?Do(*K3{HI05f@0mI^o&G&bY%jLM&(aRacZx>Qe^ha4G5+@*oWEA1k z^abrjqleU&paO3wff5aRs)Sa8#OS*5Y-|9Z>+I=|g`-Ir7m*1cLVuFrM;>cSKy!CUblrj*5 z21)sm%>XJ26idhwFw8(Hu-Om<4xu**1)wsNOoXAUzzs~#xzlFGb%7W@q|uC0{)mW5 zWeAxoC}#kdQ0jbDt5&UAckQ-Yp>l36RVPlr^HyPLWvMkB8iu42j`+Jy9X)!~GZp^$ zDV`)yPzltWs5~7Fw;%lI)APf&dE01ika@N&rvftPxwcC&4u{yB={j9m>14X8r%7PTzbb1JD8n2xdnWx`Z>&~qI@XZ zE6u5%@FARUQ%Hr+6G^#mXgHp(FlgjY$XuZ+^$8q!SS*zEIXLhk-l%|7jzwf3;HTIw z7K=FB+TupUER#u6DLl#fwkLfnh_@7T;oL+V{gr6hAfV4^o>Zl8mknI zo=#d^0)r%)+xOnG8-X$^vgNC8#8l)2x`3&i)v!8pqmWvKF>lUr>gGHxt@)U3M%=C~ z(%HIOI$L5YY7ls4mNzR4U+F77-D08)ie&{bQby3xZi8&P$Zwn z&0LAN3!5E014{w3OmBZLq;<@U+Ex%`s?zFoh-464$Mrmy^mO7}4gPg-S{4_-<-d&5XW$(XC6DsdnKJ0$n6!F)9UQE4>; z0}3rY+Q^T?sZ>dU*#GvoS6+R!q@)V$v#O-z)mLBn+uxvQSUDB$zy7`;!||3h50cZe zoHVC0=~-nGjoS5kWcu~{2au|HfI?XC6IeXp{ScX8!A7_rEGLvNpv-D@^^_@9Z@>NO z^Upv3>f3KuO_@?%jUX;7_9_;2dn`Q11pE3xp(^=lGJlc0IPwWput>tm>R1DNjei6u z8qty!TdHwfCvJ(`pS7b;C8J_D4oH2n(p*_-uKV#yo%r?AU)D>1DY?{fu{Rh;fH){o z!DHn~EEYu?5sk?LzZjBVyX`q3O&CMMcMx6(2a1XY3hlkZw$!Wnh!K#gV;+QKG9Pf!^PW#A&PaI)^0r?q$+hojUsJ`_G z&Sd7#mv(gI4Wm%SsZUqo@ssVcCv#*Q+FLsOo#^Tgxs7~7%Qd^S37GA4pckFaqN5mU8u8N*#=w*UO7%s_TI>d2_3+Nk+1>id=*Rq8ld06rjb!0 z?$f0mKXLxtjM}oSG~yLB{&*Y`qdwa2A7@^o@j{E+)hm!Psf|*i1f@g?fcOXqdvOc@ zm;SDj`oG#%7QhWlm_t01p5h5hq&7>WG2}6bnEuKPQ;f;(G$Z>i1j!iE7kkQ<)#VyJyxXihr&ub@9pr z2UaeB|NZ6vQg!MD(#qerRn!G@b4cpy!>vQFK$HrhKU2LEUqE%B-yAJ6zVR_ig*?)D zqQFCphw&Mq4>4Y=jE0Dk%|SX8Rs|*wnH>Txbp0q&&ry{|g$2WiaXpB`RN%Ou-+Q%8tuk=t;(*NaZ z3%*u&SOFJBg#61j7iJtf6pPK7<8=PZwHNTvK~G^J`yu&nR$$m7&40Hv|5lv1{Y7Gq zHW=t={O!ndavGMJTEc_3K=J_}u#+e)!@1`3DYs{z02Pe&~$@ z2R=N*+DjKB$Z$~!jW}*@j>T546f|XJRr5C7co+OmP2>sk8u>YIg{?{%G?z6}M1%g0 z#=^bV*1$tsw(y#rjgY{J>)q~=g5R{ zD-%Q3s5vO1NXEjldVMhXPn^^2i+On{bDno`?y4mfX*NBze(@Zy&zmt-X>nW1HvzBl zJ^EHZxV0v;FxLwFV)4$M8qKt6M~?iHhgH0@i={nlPMuYol|Z4wBrp@{^sovmqckE0 z1JyW?-~h|7WD+)OQmyXkMw-1L;1b!)th6B$Av}^`G`6&C+Kq%O;(H(5(&Bf9dscY8 z#V&Lk4zsu>ZE;g}LBX?6zuY#|(D31hRbJ#o`X(UlsykNJe)wU7oM~1ijqYkbuMRWN z+4IgJN4+?MvDyU0%EqWRT$E~4D)l2{r&_IMGs#HLAqBbVK|@AHB9Q^@MZ@!5T_Y-! zwsLdllCMK-`hF|5f&Wl*@3EQR_oJ_k1`NfWq2y}r;Rm^}vg><|iLRiG*? zl(~d}>^@n!UWCEp<+0n5I+59@#P==}HRHcVUSmpt@WEGANlAHmW6OO_*o!B~?-Z-A zyY2pE`2K!iJbz7od-?r4@+|p1EdD>>w%6z8<~E^*4&M52?!D#iNt4P-O3TXurf48f zFf}#!*R>~^+*4b(vIQHy+%$aVECAU-;CXj85g*Rc!}@#gx%b|C@4jW-`ZBMP+o!}2 zH_oq2c?cS$)sgRJugwlF;KYicE-i2NV}I2cRFD$f>YUqs76|W z1r}qNjIr8rn4b4LLjBOUXhCm42vjgf0lKtv!qVi}c{4O{NK z^UeSYC+v5e{2QP+sMxJmGfEGVfs}fbv>tAXYGvtmnluVdt<$Ml!N?koE)<@M1^t6! zB~-1`2?d*TI%9{#im203oipa+3MNl3-~}T;yMBjQ8TG9siUP+~BTtX_#0NThJ9_<5g-V6$jEOUGm_BLnSi;|$)=N-swHLcG#th1sg$o(` z!i9FOql2UWXUs-O&YoLtSUbPD`QX8Mle82$!DUUG-rNi(Au!K9Cn%o7OZ;xaf@2~- zlUIM$SFZkWhq+^n@h4sECBApev2z`Tg&iH#$M+wZ9TSavpXn!A zb+Qj$i!8nIz#wv;4Mzo!QfV-#0a~JP1K5}q7rTte{iM~Bq>$eu!Z76eU1~Mb;KDX0 zmG>h4Au_1Z4EneO2i|=8J9CqFC-=~|ZU28g|NMai{ryLN`o_gUtabOU@#+J|urHDfzo}&bCXG^MG{DCKnY^{;Rip z((($-Kr(r<@({R+S3yCp$fc2@Ee&}{Xe+#+09qZPkmE9kj;0v2S?kWu8IM1|L|#&r zm4PpB7y0t9$ur#Q%{#w#{}M3e-&|(Nza>wTC&8ruV>C-HD@(ED7NOvp)2FYw%!$L` z!;}%P-+9ALx9lE^1*f=6p)_l`j*oA2Sq!rQ33t9+8pAhcZ46~?ZD;3%^)X~QqgYyF zo6>4ks;pMkmug3t)M~%qXbd5xpE@%GFrkNRuI0;J?iDNCU#cZx%FloM?OC(h+RVAR z4}2px*DQHmWow;eNryiaW_JMVBD}-IC9P?C(S{Bk033nWT)e2+v}sclpYSfbZF!AX zlHy0m6Oe}h=hzR%zD1C%O|rdyR6Le}H4HPutcukSlVLqk)oJPuvIn&)^|XV`!D&+e zvJFkb+@)-2O!5`h45)`9){tmp7qm%jWdui~v}&0u;GP&A>L%jGw?tt8<@H8QA{-p- z3mKqer{`v;xov6|=0cO*NfMzz2v%3K(`M8w(tMe2W3X3QwP@|GyLPWz+7-~)yi@Co zLT8TrYU6FGyBmp)2=%Kj zO7SOy9{DB})VqN<Tp(g6&QL+Qr_ef1Bx z^%%&=%-WlqQiT!SH?N%qA!OECXBkYuWzGZwRTIt~JCMseMZfZ1kFe%axmCgGhk)4R zbkruvRUerAuC$&qZ7r zeXiLHnx+*OR193~4)ZYH>R|B4|1i=zx`KhOQ*E7)WwOi4v#YBQ9GE=$-FKzY%3fWM zw3F)4TQI=DeAgv#Sd5E+%BoeB&He{qGPe9D_DV5)X{|#kmk&uvbd~Y5k zj$U$3P@Y4^QHJ%A=Nrh6l+Qo^`{$9|jCmLc)qS||WLZMC|71$fhw+l*KIb@_jf2lv z1M6^RqMaI!eF|He&DM~dud>!N|U;Q$P6N%M>6X5{aHhQqF)Hpw~nE z5wuCdv?nt&Q@xoqCScl5RM9YSr2qpK_nh@V+SR?nv950<1YCFnuu}ilmT}0`rnwi=j!P;U;M{yr>k5 zIdBRBvr+}!2gRs5JTv1Umsk98x`P%9E zg`U7kiB9A>NO&K~X%{>;+^w+rLxdb@NN!?2ep0day%W-`7f5sYX6ih`+CuFtkbCei zHMme-CrUvgia#?{ZRxSAQcsSP2lv%0{}n1mg1E$Bb~wJ5*U~3p;mM6D?j?tkN$8N zv&x!}fi+kKr^#Vbz`dw-nTGp^lkjzSpZww?=@Aq?#Ae$+>BjBX&-3>GX}D?pK-j%O}58rwS5ngz%9F zPmeYm44w=Iagu^TU#re@gp^(++2_w^15?B5j~+!?FV)ebdXwqs(G(|^D;M+$DvEOZQeAm&5d<-fnh1SyMZhS2ID?9 zvJ>$5hsj>@uyXCrNDQ`jjnVkzlm7bpqerEf;E`A(RRqDrKvxSm_q zkc384B;YLbF4q%JKH1hLTi5HPeV3`w#Kc1pnl9l>QOyM0k;dzy!lX*46!bW4S4TE0 z12nQZgB?6|k!GCxa&&W&gpu%Zo51<~t_l~5Cx1D@`P7NioziR`l*aONi3Vp!he1kx z{S?0e{JIj%EfEdk?g&N`yd8EI>Q}O-A%ZO1o0gsJwwoc+!v2h7LJG(NVL?}qwPi0P&E8*W<&n*n0d@ZOKDg4IF2bHhTo*B5Sp z1@3>5e{iOsE<*toZsEd>d+u3)aEBj5ET-=t6M?(uwv7w#orhY#P;2o1x14+TtY5!= z*O@be8f(UsxpU`E$*^kuXKV#ir%o-f!RtDJ%kc@s`{Cad9lj{7*|4-`_5YJKE6UBx zKrlmQZc%v^o;anvx_VMk9!v#!MU$#Yp-}%nSx~y*uJKm<|JG`=SnWn=9{)f00HP8e zSO&T9X_N;$Opc51BZ$B_gZE$Y+eg{2eeG*=$)ou8ujEW?1Nrs;gH1}GXe(1YIPwg) zA`k$X%n1SkfD81oj$goeS>eN{~}Bor}N9KQOxx_p}Q95_Lw>)8fm&aRfV zb;UXA!9E2r?f}*XV2sygWat0@-+RX$w{2Nkn?bAg*h}(rC(T;E$-8OOwi~Wrws^t3 zJNB%bGov(d_L9G!R1l^L*lMI2?bmT%kyJNw#2b=5@<4Wtb~D^K^q zOcsf$T_phFEf(t?Eo#0V`1ozjGpcj7`*KjaIH$a%Y7Rh?bDI?5{@$zVrv)9QGnUI) zq3)A*=6;!@d0aXY3PBE`w>ZlioNkRqr?PJ$ZC10%Kz}dHaBvhsVu&SK zMX#FcgOc%(4ZuOHFTw2|51yl0YW=XMdJ~~AN>`_fia4!igx1kEDqe>yW=11#@ulzC zRz=#{JT5gjdxX!d+jdiNQTddm_uqd%O~@i-0}8i%+qP|sa<%cpFZ@x#s1Z(c_UzfN z5N~)s&-wxm|3lN>e*24o$Z!%p4t(*@4-p0M&ZS|JjI^D)5U}LeZoK*Co3|{RivXEO zgc#FvE2qzyJ$tsdIYs5N7LdPH^sE6vC`oq;!tCRiG}hx(LGDv1NVlLv0cKJ5p`sv_ z@bKbpSMO;7mYT|~M)IVDmwHxO-)CjYS5s^?UMdb@gT!bxA*^eVn#X|9M{osRP>m?~ z08qOqLBnVW5DJ7FJMDTvJe79HeHt_m6P+8_Sw$$&dx>zUl!OE*2)m)>#fOH%7Gx0u zb_fS51UeiJLc&I|)9zk>z>jJN72^5a$K~9y*1u zKCeIFfK=)ASPRQsWX_U$uOaXTkcodhbRNKbglzQpw4ZqQ0P6f4J=O)mJiD_kX2@L( zL22Fe>@)}DUz@Gy(VzbDRI=)(8*f--JoVXg{|S>$y{fu?W{KC(fAZwX4?j4wxV~xW z(xr8o{NRbtK00vl@CkSXj~#jP5AS^T-lvxmPzM6%z71I8GMm&2UTZHI0-Uq6dmw zT;uTZvwodP*K_vx;qKnyV0fUnn~+I&-`13!uBGhDQChX|+AWonr&Kp>2W8*1csf!C zO|qVQ4TU6LJ7=9V?~Zx6c7G?nAF9jsuA@Uz|4xYFt_ zt1ioh-3}?EGpM&E!{l+M!2^?Lb571abSS{8)okza^Mk=?u`-c z`w{Z6?(1J~xP5m^OUoU%-g~cTd1cpL2g&1Op(#n0U_|jn}7P{zcnNuZ~<=m#$TTM_kaKQ?|%2yS6}?|Z(&e=^}oLR-N&WX znJlf&Wa$h$!wKF9<(}i=jtIwjxGRtZi6{lTzbDv3%Yxz>p)b*a8Sy#WLz%PJtTCIj z;f81rWM)=YBCHF-wEdlDzIf&z7+-a@=&3q?zM$azdFiP#Hl-l7Ctx{LW5R|&m)3?7 zyoQM+;|gHPS-pmYV?05I9v!SEP`NRUvzh&0+$Yl!ZsO zlzj<9=8W4=_>Zt#hu5%%sH6|bdc+7@kYO11IGW%I$iA5eXCCA@+|cr8WKCPL!%3R9 zI;i(6w1dV=ih^U)-d9X|bJpXc{bgL6pU%$@YX{>hwv&E}s3yOY@p0MThg6zh(9cTa zyHVPmJEh&J(%J1OVMc40#)3nBlL`BTbPY7FGR;9n>1^b$GwV5e9Q9^LMm9D=l|*6D z*ntBA9D;MGhX;2>&{9YozE3~OAU zHLJ3wrlvB>s`68;a9E+mk$dMymyhIlxt-V&%w2RX)KLnJ}ml#oNX5)eW zPFk&2e)+6#eSXf*Ir68@qe?l4$a`GZX3fCofBpGiKOcai0)7YFr1TU>@uDRX+M)3+ z`aS2{PptS~+%cB^2LH3tU$3AAS^ReFzl`cpjowzuJ&vG9!X#|~H6?va0*U{KY?u5O zdJm!JQ*!VB!sk@@Oq%>T*+x7^nr8;`$f;q9(j(I&YXK0|Z=zDdzQ8h=y`7&xM^S!wxRg>$MuJG7w1v975ZfLBVQsuHOUbUjZmx1D_Q*0)Mq;h;b37{)z z+Mv_;Fj$)v{s6UFXQRR8sPbvnYJGNEVNz!W{-aFE=akk#cw982!e?Kxs9{zOY-*LY zE3So{yQz7_+^N+PohYUK=A{*4(#w1g5ukNm#TSuQM$)SVvW3--n+5BLI2M9i(+5eP zR|={`7$E}TgaFJP@3WN6n73?$Rt3pp>im^UiPoM?ZH<{$K@~iM*vKBjGdX2_%C)oI&!B@#d^Y zIBv{lHyeHGFzkuADUwm2x+XN(*RyKfqM1JR8MVd@t9-OW>R}W$4S|wAl&NXdUzPZa zW4yoaCvp4yOAKA9|6FFO%{Q1jkjI=hWRrZmO$okR$lrN3XdB*?C=rQ+V z%zu(rR^~}^yncq&Y(Rjw*<^LP5bvP3()a4_luxOungNAp zPJKgTBhog{s;jQ_Wz3yjRbE+BKYP)}YYVe;rYxMdWZCk?4Ri9d*I$3_a^JP&BfJli z1LSSkAn5xqiC&84W(m;j_I#=Ffk4`QyVU`y#_n|M}JT zeU{qVnH8Ct_5@6K3E0#p&#IM1Xp>H%P2z8@s#q`t)IPf(nQY*U=a`3DReguss!P&! z`&D!2R=8XimBjhveN;-H-A~$l`x}ybQY$lx_He#|1IGD&|0`EV?)mcV{69Xo!_qTH zjSA;B zi0yPkA_gEcb*ZpE+IVfihJ(=@X^WZj?$ZN^^572y$-gwJ2iC+EHj1CG4nQ zBPOVj>=(d3#6H19;j>NhqDF1=s`*nU6G#i&KMPsq056nzZ3>z{Bvj6u zjpfBz-keN_22rT~q;kCZbq>W;u*Gx8TExeC`cTkT5%X!D{_LXV$rC4R{# z9)qDr>OuBb)NK{-OGM&O-#-gI8on-04|BCyjm)2VmtJGmqhu4r-qgQ{VLo$)vE{*d zoM&UsoKYz9s^=p{d46>sj4Sg6PjNl$UG>ElcmyrQU-}_MUGhC!n0m4pxs5 zHXG0B`KK`+O<=>hD&6sKz7dq#r{-$3(DQ=ke6*;s#lpBt?}&4?@>G%o4lLkvRNJ6B z96x#MHfRoW>l@}Rxo!Jwgge-zvQ|W4y^>FI#6C7%*+=M@)R&3>SpDg);R`)ohOi*T4GZPk!=~U;gUX z&yrSwx$gERxE=7e-hSN@pc7CEx}~LM^X6-@CD%$L7_mB#2;s;fIv;B#Td!387{T-C z)iZ?n*)Wl6G>`H30m1^K$*1;UjK3r60o?!nW9|{GMo8vN!ahcUL{{YNIAd)k-9ARE zMvEgprZj&vjmZ@g!~`)FG`&N literal 0 HcmV?d00001 diff --git a/static/fonts/josefin.woff b/static/fonts/josefin.woff new file mode 100644 index 0000000000000000000000000000000000000000..0c4414cdc061a8ac2a5201577b29d5b3a7cee6ad GIT binary patch literal 56376 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 literal 0 HcmV?d00001 diff --git a/static/img/logo.png b/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..247ee61902b4d39c16a9fd7e6fbb9b48df27c869 GIT binary patch literal 460 zcmV;-0W}g;N<;-? zK$Yg9$XM?^f8ujWl=zby-)ko(-SfWtOrRR3Tml3G1cRPg>o=zLtiu4o0KpIp5DdmXtuOsqCxR8a9>Nj;K|Q-I^=gFTHjVCk=G}+C3bwI8A}8NgPt$dM~mRGQjv220000 \ No newline at end of file diff --git a/static/img/logotransition.png b/static/img/logotransition.png new file mode 100644 index 0000000000000000000000000000000000000000..835e7a4fce147f7c2146f5c46469173e5e57bdd0 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eL!3HGH8OdY;Db50q$YKTtJ!KGPtXOJa1{C!6 zba4!^IKB1CPC*6*9%jdfahWq`_$j1H$eliKy5Z)+?N$yd3c?HtBC`)@lsT^c!P5Ik xyw0oVL(rp^*+SZLrc@+`7qx^gY@Jls%gHf8HO 0 + #dashboard-feed + for update of recentUpdates + .feed-update + div + a(href=`/users/${update.user}`)= update.user + strong= update.mood + div= update.desc || "[no mood description provided]" + div= update.date + else + span [no updates] + script. + function disable(form) { + const btn = form.querySelector("button"); + btn.setAttribute("disabled", true); + + setTimeout(() => { + btn.removeAttribute("disabled"); + }, 3000) + } diff --git a/views/index.pug b/views/index.pug new file mode 100644 index 0000000..856a0b8 --- /dev/null +++ b/views/index.pug @@ -0,0 +1,30 @@ +extends site.pug + +block head + style + | #content { margin-left: 256px; } + +block page + #sidebar + h1 MiPilin + p(style="margin-top:0;") + | Thx for being a part of the MiPilin beta! + if session.loggedIn + | + | If you want to change your mood, update your profile, and see how your friends are doing, visit + | + a(href="/dashboard") the dashboard + | ! + p + strong #{users} + | + | registered users + h2 Recent updates + ul(style="list-style:none;padding-inline-start:0;") + for update of recentUpdates + li + a(href=`/users/${update.user}`)= update.user + +block content + p + | Hi, this is MiPilin! It lets you tell your friends how you're feeling, as well as keep a journal of your current mood and their trends over time! Due respect goes to imood, from which I borrowed many ideas and basically all of the moods. diff --git a/views/login.pug b/views/login.pug new file mode 100644 index 0000000..d78a3a3 --- /dev/null +++ b/views/login.pug @@ -0,0 +1,8 @@ +extends site.pug + +block content + strong Log in placeholder + form(action="/login", method="post") + input(type="text", name="name", placeholder="Username") + input(type="password", name="pass", placeholder="Password") + button(type="submit") Log In diff --git a/views/register.pug b/views/register.pug new file mode 100644 index 0000000..d32a5c3 --- /dev/null +++ b/views/register.pug @@ -0,0 +1,12 @@ +extends site.pug + +block content + strong Sign up placeholder + form(action="/register", method="post") + input(type="text", name="name", placeholder="Username", maxlength="26", required) + br + input(type="email", name="email", placeholder="Email", required) + br + input(type="password", name="pass", placeholder="Password", required) + br + button(type="submit") Sign Up diff --git a/views/site.pug b/views/site.pug new file mode 100644 index 0000000..d0c0df9 --- /dev/null +++ b/views/site.pug @@ -0,0 +1,46 @@ +doctype html +html(lang="en") + head + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1.0") + link(rel="stylesheet", href="/css/main.css") + block head + title #{title} > mipilin + body + main + header + a(href="/") + img#header-logo(src="/img/logo.svg", alt="logo") + nav + if session.loggedIn + a(href="/dashboard/") Dashboard + a(href="/feed/") Feed + a(href="/logout/") Log out + else + a(href="/feed/") Feed + a(href="/register/") Sign up + a(href="/login") Log in + #ticker + div + if session.loggedIn + span + a(href=`/users/${session.user}`)= session.user + | + | is feeling + | + strong #{currentMood || "nothing...??"} + else + | You should log in! It's FUN!! + span#ticker-marquee + marquee + | The beta is still a thing that is happening! If something fucks up plz let me know! <3 + #page + block page + #content + if flashes + #flashes + for [type, flashGroup] of Object.entries(flashes) + for flash of flashGroup + div(class=`flash-${type}`)= flash + block content + diff --git a/views/user.pug b/views/user.pug new file mode 100644 index 0000000..25f6272 --- /dev/null +++ b/views/user.pug @@ -0,0 +1,30 @@ +extends site.pug + +//- Display mood here but keep yourself dry (i.e. dont request user mood if the profile being viewed is the profile of the currently logged-in user) +block content + h1= user.name + if !isSelf + form(action=`/users/${user.name}/follow`, method="post") + button(type="submit")= isFollowing ? "unfollow" : "follow" + br + span= user.bio || "[no bio]" + if user.website + br + a(href=user.website)= user.website + br + br + h2 Current mood + if userMood + span + | Feeling + | + strong + if isSelf + | #{currentMood} + else + | #{userMood.mood} + br + div(style="margin-left:2ch;word-wrap:break-word;")= userMood.desc || "[no mood description]" + else + span User has not yet set a mood! +