From e48270e92ac1681f1fa2a2a90ca66641e901d3cc Mon Sep 17 00:00:00 2001 From: Hassan El Mghari Date: Thu, 9 Mar 2023 14:57:30 -0500 Subject: [PATCH 1/2] add auth with next-auth and neon --- .example.env | 8 + README.md | 5 + components/Header.tsx | 30 +- lib/prismadb.ts | 10 + next.config.js | 2 +- package-lock.json | 745 +++++++++++++++++++++++++++++--- package.json | 10 +- pages/_app.tsx | 7 +- pages/api/auth/[...nextauth].ts | 19 + pages/api/generate.ts | 22 +- pages/api/remaining.ts | 36 ++ pages/dream.tsx | 65 ++- prisma/schema.prisma | 53 +++ public/google.png | Bin 0 -> 110441 bytes 14 files changed, 922 insertions(+), 90 deletions(-) create mode 100644 lib/prismadb.ts create mode 100644 pages/api/auth/[...nextauth].ts create mode 100644 pages/api/remaining.ts create mode 100644 prisma/schema.prisma create mode 100644 public/google.png diff --git a/.example.env b/.example.env index b4017c06..a2718269 100644 --- a/.example.env +++ b/.example.env @@ -6,3 +6,11 @@ UPSTASH_REDIS_REST_TOKEN= # Optional, if you're planning to use Upload.io (you need to if you have 100+ uploads) NEXT_PUBLIC_UPLOAD_API_KEY= + +# Optional, if you want to add auth + DB +NEXTAUTH_SECRET= +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +DATABASE_URL= +SHADOW_DATABASE_URL= +NEXTAUTH_URL= diff --git a/README.md b/README.md index 8de2e656..c322e821 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,11 @@ Then, run the application in the command line and it will be available at `http: npm run dev ``` +## Auth setup + +1. Use `openssl rand -base64 32` to generate NEXTAUTH_SECRET +2. Add DB URL and SHADOW DB URL from Neon + ## One-Click Deploy Deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=vercel-examples): diff --git a/components/Header.tsx b/components/Header.tsx index 328b9fed..178e2bcd 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -1,7 +1,7 @@ import Image from "next/image"; import Link from "next/link"; -export default function Header() { +export default function Header({ photo }: { photo?: string }) { return (
@@ -16,15 +16,25 @@ export default function Header() { roomGPT.io - - -

Star on GitHub

-
+ {photo ? ( + Profile picture + ) : ( + + +

Star on GitHub

+
+ )}
); } diff --git a/lib/prismadb.ts b/lib/prismadb.ts new file mode 100644 index 00000000..1e77578b --- /dev/null +++ b/lib/prismadb.ts @@ -0,0 +1,10 @@ +import { PrismaClient } from "@prisma/client"; + +declare global { + var prisma: PrismaClient | undefined; +} + +const client = globalThis.prisma || new PrismaClient(); +if (process.env.NODE_ENV !== "production") globalThis.prisma = client; + +export default client; diff --git a/next.config.js b/next.config.js index e11c20a3..363a9393 100644 --- a/next.config.js +++ b/next.config.js @@ -2,7 +2,7 @@ module.exports = { reactStrictMode: true, images: { - domains: ["upcdn.io", "replicate.delivery"], + domains: ["upcdn.io", "replicate.delivery", "lh3.googleusercontent.com"], }, async redirects() { return [ diff --git a/package-lock.json b/package-lock.json index 0c82b401..1255c6f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "roomGPT", + "name": "room-generator", "lockfileVersion": 2, "requires": true, "packages": { @@ -8,19 +8,25 @@ "@headlessui/react": "^1.7.7", "@headlessui/tailwindcss": "^0.1.2", "@heroicons/react": "^2.0.16", + "@next-auth/prisma-adapter": "^1.0.5", + "@prisma/client": "^4.11.0", "@tailwindcss/forms": "^0.5.3", "@upstash/ratelimit": "^0.3.8", "@upstash/redis": "^1.19.1", "@vercel/analytics": "^0.1.9-beta.4", "framer-motion": "^8.2.4", "next": "latest", + "next-auth": "^4.20.1", + "prisma": "^4.11.0", "react": "18.2.0", "react-compare-slider": "^2.2.0", "react-countup": "^6.4.0", "react-dom": "18.2.0", + "react-loader-spinner": "^5.3.4", "react-uploader": "^3.10.0", "react-use-measure": "^2.1.1", "request-ip": "^3.3.0", + "swr": "^2.1.0", "uploader": "^3.9.0" }, "devDependencies": { @@ -51,7 +57,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "peer": true, "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -102,7 +107,6 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "peer": true, "dependencies": { "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", @@ -116,7 +120,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "peer": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -126,6 +129,17 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", @@ -149,7 +163,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -158,7 +171,6 @@ "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "peer": true, "dependencies": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" @@ -171,7 +183,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "peer": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -225,7 +236,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "peer": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -276,7 +286,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -290,7 +299,6 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "peer": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -298,11 +306,21 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "peer": true, "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", @@ -316,7 +334,6 @@ "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", - "peer": true, "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", @@ -361,6 +378,16 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@headlessui/react": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.7.tgz", @@ -412,7 +439,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "peer": true, "engines": { "node": ">=6.0.0" } @@ -421,7 +447,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "peer": true, "engines": { "node": ">=6.0.0" } @@ -429,14 +454,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "peer": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -500,6 +523,15 @@ "tslib": "^2.3.1" } }, + "node_modules/@next-auth/prisma-adapter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.5.tgz", + "integrity": "sha512-VqMS11IxPXrPGXw6Oul6jcyS/n8GLOWzRMrPr3EMdtD6eOalM6zz05j08PcNiis8QzkfuYnCv49OvufTuaEwYQ==", + "peerDependencies": { + "@prisma/client": ">=2.26.0 || >=3", + "next-auth": "^4" + } + }, "node_modules/@next/env": { "version": "13.1.6", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.1.6.tgz", @@ -732,6 +764,45 @@ "node": ">= 8" } }, + "node_modules/@panva/hkdf": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.4.tgz", + "integrity": "sha512-003xWiCuvePbLaPHT+CRuaV4GlyCAVm6XYSbBZDHoWZGn1mNkVKFaDbGJjjxmEFvizUwlCoM6O18FCBMMky2zQ==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@prisma/client": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.11.0.tgz", + "integrity": "sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.11.0-57.8fde8fef4033376662cad983758335009d522acb" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.11.0.tgz", + "integrity": "sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==", + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.11.0-57.8fde8fef4033376662cad983758335009d522acb", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.11.0-57.8fde8fef4033376662cad983758335009d522acb.tgz", + "integrity": "sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==" + }, "node_modules/@rollup/plugin-babel": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz", @@ -925,7 +996,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -983,6 +1053,26 @@ "postcss": "^8.1.0" } }, + "node_modules/babel-plugin-styled-components": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", + "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-module-imports": "^7.16.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11", + "picomatch": "^2.3.0" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1037,6 +1127,14 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001442", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz", @@ -1056,7 +1154,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1117,7 +1214,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -1125,8 +1221,7 @@ "node_modules/color-convert/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/color-name": { "version": "1.1.4", @@ -1139,11 +1234,37 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "peer": true }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/countup.js": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.3.2.tgz", "integrity": "sha512-dQ7F/CmKGjaO6cDfhtEXwsKVlXIpJ89dFs8PvkaZH9jBVJ2Z8GU4iwG/qP7MgY8qwr+1skbwR6qecWWQLUzB8Q==" }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1170,7 +1291,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -1234,7 +1354,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -1361,7 +1480,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "peer": true, "engines": { "node": ">=4" } @@ -1381,7 +1499,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "peer": true, "engines": { "node": ">=4" } @@ -1391,6 +1508,19 @@ "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1449,6 +1579,14 @@ "whatwg-fetch": "^3.4.1" } }, + "node_modules/jose": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", + "integrity": "sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1458,7 +1596,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "peer": true, "bin": { "jsesc": "bin/jsesc" }, @@ -1486,6 +1623,11 @@ "node": ">=10" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -1545,8 +1687,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.4", @@ -1610,6 +1751,33 @@ } } }, + "node_modules/next-auth": { + "version": "4.20.1", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.20.1.tgz", + "integrity": "sha512-ZcTUN4qzzZ/zJYgOW0hMXccpheWtAol8QOMdMts+LYRcsPGsqf2hEityyaKyECQVw1cWInb9dF3wYwI5GZdEmQ==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.5.0", + "jose": "^4.11.4", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "next": "^12.2.5 || ^13", + "nodemailer": "^6.6.5", + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" + }, + "peerDependenciesMeta": { + "nodemailer": { + "optional": true + } + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", @@ -1674,6 +1842,11 @@ "node": ">=0.10.0" } }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "node_modules/object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", @@ -1682,6 +1855,52 @@ "node": ">= 6" } }, + "node_modules/oidc-token-hash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", + "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/openid-client": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.0.tgz", + "integrity": "sha512-hgJa2aQKcM2hn3eyVtN12tEA45ECjTJPXCgUh5YzTzy9qwapCvmDTVPWOcWVL0d34zeQoQ/hbG9lJhl3AYxJlQ==", + "dependencies": { + "jose": "^4.10.0", + "lru-cache": "^6.0.0", + "object-hash": "^2.0.1", + "oidc-token-hash": "^5.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/openid-client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -1840,6 +2059,38 @@ "url": "https://opencollective.com/preact" } }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, + "node_modules/prisma": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.11.0.tgz", + "integrity": "sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.11.0" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/progress-smoother": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/progress-smoother/-/progress-smoother-1.4.0.tgz", @@ -1919,6 +2170,25 @@ "react": "^18.2.0" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-loader-spinner": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-5.3.4.tgz", + "integrity": "sha512-G2vw4ssX+RDZ/vfaeva06yfNqyFViv/u+tVZ3kFLy5TKNlNx2DbuwreBSpRtPespQA+VxinxUJsigwLwG9erOg==", + "dependencies": { + "react-is": "^18.2.0", + "styled-components": "^5.3.5", + "styled-tools": "^1.7.2" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-uploader": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/react-uploader/-/react-uploader-3.10.0.tgz", @@ -1961,6 +2231,11 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/request-ip": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", @@ -2030,6 +2305,11 @@ "semver": "bin/semver.js" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -2038,6 +2318,48 @@ "node": ">=0.10.0" } }, + "node_modules/styled-components": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.8.tgz", + "integrity": "sha512-6jQrlvaJQ16uWVVO0rBfApaTPItkqaG32l3746enNZzpMDxMvzmHzj8rHUg39bvVtom0Y8o8ZzWuchEXKGjVsg==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "dependencies": { + "@emotion/memoize": "^0.8.0" + } + }, + "node_modules/styled-components/node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -2060,11 +2382,15 @@ } } }, + "node_modules/styled-tools": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/styled-tools/-/styled-tools-1.7.2.tgz", + "integrity": "sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2083,6 +2409,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swr": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.1.0.tgz", + "integrity": "sha512-4hYl5p3/KalQ1MORealM79g/DtLohmud6yyfXw5l4wjtFksYUnocRFudvyaoUtgj3FrVNK9lS25Av9dsZYvz0g==", + "dependencies": { + "use-sync-external-store": "^1.2.0" + }, + "engines": { + "pnpm": "7" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/tailwindcss": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", @@ -2209,11 +2549,27 @@ "upload-js": "^2.11.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -2279,7 +2635,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "peer": true, "requires": { "@babel/highlight": "^7.18.6" } @@ -2317,7 +2672,6 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "peer": true, "requires": { "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", @@ -2328,7 +2682,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "peer": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2337,6 +2690,14 @@ } } }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, "@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", @@ -2353,14 +2714,12 @@ "@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "peer": true + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-function-name": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "peer": true, "requires": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" @@ -2370,7 +2729,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "peer": true, "requires": { "@babel/types": "^7.18.6" } @@ -2412,7 +2770,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "peer": true, "requires": { "@babel/types": "^7.18.6" } @@ -2448,7 +2805,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -2458,14 +2814,20 @@ "@babel/parser": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "peer": true + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==" + }, + "@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "requires": { + "regenerator-runtime": "^0.13.11" + } }, "@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "peer": true, "requires": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", @@ -2476,7 +2838,6 @@ "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", - "peer": true, "requires": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", @@ -2515,6 +2876,16 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "@headlessui/react": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.7.tgz", @@ -2548,26 +2919,22 @@ "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "peer": true + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "peer": true + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "peer": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "peer": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -2631,6 +2998,12 @@ "tslib": "^2.3.1" } }, + "@next-auth/prisma-adapter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.5.tgz", + "integrity": "sha512-VqMS11IxPXrPGXw6Oul6jcyS/n8GLOWzRMrPr3EMdtD6eOalM6zz05j08PcNiis8QzkfuYnCv49OvufTuaEwYQ==", + "requires": {} + }, "@next/env": { "version": "13.1.6", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.1.6.tgz", @@ -2737,6 +3110,29 @@ "fastq": "^1.6.0" } }, + "@panva/hkdf": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.4.tgz", + "integrity": "sha512-003xWiCuvePbLaPHT+CRuaV4GlyCAVm6XYSbBZDHoWZGn1mNkVKFaDbGJjjxmEFvizUwlCoM6O18FCBMMky2zQ==" + }, + "@prisma/client": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.11.0.tgz", + "integrity": "sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==", + "requires": { + "@prisma/engines-version": "4.11.0-57.8fde8fef4033376662cad983758335009d522acb" + } + }, + "@prisma/engines": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.11.0.tgz", + "integrity": "sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==" + }, + "@prisma/engines-version": { + "version": "4.11.0-57.8fde8fef4033376662cad983758335009d522acb", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.11.0-57.8fde8fef4033376662cad983758335009d522acb.tgz", + "integrity": "sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==" + }, "@rollup/plugin-babel": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz", @@ -2886,7 +3282,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -2919,6 +3314,23 @@ "postcss-value-parser": "^4.2.0" } }, + "babel-plugin-styled-components": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", + "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-module-imports": "^7.16.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11", + "picomatch": "^2.3.0" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2948,6 +3360,11 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, + "camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" + }, "caniuse-lite": { "version": "1.0.30001442", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz", @@ -2957,7 +3374,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -3003,7 +3419,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, "requires": { "color-name": "1.1.3" }, @@ -3011,8 +3426,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" } } }, @@ -3027,11 +3441,31 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "peer": true }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, "countup.js": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.3.2.tgz", "integrity": "sha512-dQ7F/CmKGjaO6cDfhtEXwsKVlXIpJ89dFs8PvkaZH9jBVJ2Z8GU4iwG/qP7MgY8qwr+1skbwR6qecWWQLUzB8Q==" }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" + }, + "css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -3052,7 +3486,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "peer": true, "requires": { "ms": "2.1.2" } @@ -3095,8 +3528,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "peer": true + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "estree-walker": { "version": "2.0.2", @@ -3186,8 +3618,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "peer": true + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "has": { "version": "1.0.3", @@ -3200,14 +3631,28 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "peer": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "hey-listen": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3251,6 +3696,11 @@ "whatwg-fetch": "^3.4.1" } }, + "jose": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", + "integrity": "sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3259,8 +3709,7 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "peer": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json5": { "version": "2.2.3", @@ -3273,6 +3722,11 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3317,8 +3771,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nanoid": { "version": "3.3.4", @@ -3362,6 +3815,22 @@ } } }, + "next-auth": { + "version": "4.20.1", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.20.1.tgz", + "integrity": "sha512-ZcTUN4qzzZ/zJYgOW0hMXccpheWtAol8QOMdMts+LYRcsPGsqf2hEityyaKyECQVw1cWInb9dF3wYwI5GZdEmQ==", + "requires": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.5.0", + "jose": "^4.11.4", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + } + }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -3386,11 +3855,52 @@ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" }, + "oidc-token-hash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", + "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==" + }, + "openid-client": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.0.tgz", + "integrity": "sha512-hgJa2aQKcM2hn3eyVtN12tEA45ECjTJPXCgUh5YzTzy9qwapCvmDTVPWOcWVL0d34zeQoQ/hbG9lJhl3AYxJlQ==", + "requires": { + "jose": "^4.10.0", + "lru-cache": "^6.0.0", + "object-hash": "^2.0.1", + "oidc-token-hash": "^5.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -3475,6 +3985,27 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.0.tgz", "integrity": "sha512-ERdIdUpR6doqdaSIh80hvzebHB7O6JxycOhyzAeLEchqOq/4yueslQbfnPwXaNhAYacFTyCclhwkEbOumT0tHw==" }, + "preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "requires": { + "pretty-format": "^3.8.0" + } + }, + "pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, + "prisma": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.11.0.tgz", + "integrity": "sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==", + "requires": { + "@prisma/engines": "4.11.0" + } + }, "progress-smoother": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/progress-smoother/-/progress-smoother-1.4.0.tgz", @@ -3522,6 +4053,21 @@ "scheduler": "^0.23.0" } }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "react-loader-spinner": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-5.3.4.tgz", + "integrity": "sha512-G2vw4ssX+RDZ/vfaeva06yfNqyFViv/u+tVZ3kFLy5TKNlNx2DbuwreBSpRtPespQA+VxinxUJsigwLwG9erOg==", + "requires": { + "react-is": "^18.2.0", + "styled-components": "^5.3.5", + "styled-tools": "^1.7.2" + } + }, "react-uploader": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/react-uploader/-/react-uploader-3.10.0.tgz", @@ -3554,6 +4100,11 @@ "picomatch": "^2.2.1" } }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "request-ip": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", @@ -3596,11 +4147,48 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "peer": true }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, + "styled-components": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.8.tgz", + "integrity": "sha512-6jQrlvaJQ16uWVVO0rBfApaTPItkqaG32l3746enNZzpMDxMvzmHzj8rHUg39bvVtom0Y8o8ZzWuchEXKGjVsg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "dependencies": { + "@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "requires": { + "@emotion/memoize": "^0.8.0" + } + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + } + } + }, "styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -3609,11 +4197,15 @@ "client-only": "0.0.1" } }, + "styled-tools": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/styled-tools/-/styled-tools-1.7.2.tgz", + "integrity": "sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -3623,6 +4215,14 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "swr": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.1.0.tgz", + "integrity": "sha512-4hYl5p3/KalQ1MORealM79g/DtLohmud6yyfXw5l4wjtFksYUnocRFudvyaoUtgj3FrVNK9lS25Av9dsZYvz0g==", + "requires": { + "use-sync-external-store": "^1.2.0" + } + }, "tailwindcss": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", @@ -3710,11 +4310,22 @@ "upload-js": "^2.11.0" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index f6a01a2e..6c6bdf5c 100644 --- a/package.json +++ b/package.json @@ -3,25 +3,33 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start" + "start": "next start", + "vercel-build": "prisma generate && next build", + "prisma:generate": "prisma generate" }, "dependencies": { "@headlessui/react": "^1.7.7", "@headlessui/tailwindcss": "^0.1.2", "@heroicons/react": "^2.0.16", + "@next-auth/prisma-adapter": "^1.0.5", + "@prisma/client": "^4.11.0", "@tailwindcss/forms": "^0.5.3", "@upstash/ratelimit": "^0.3.8", "@upstash/redis": "^1.19.1", "@vercel/analytics": "^0.1.9-beta.4", "framer-motion": "^8.2.4", "next": "latest", + "next-auth": "^4.20.1", + "prisma": "^4.11.0", "react": "18.2.0", "react-compare-slider": "^2.2.0", "react-countup": "^6.4.0", "react-dom": "18.2.0", + "react-loader-spinner": "^5.3.4", "react-uploader": "^3.10.0", "react-use-measure": "^2.1.1", "request-ip": "^3.3.0", + "swr": "^2.1.0", "uploader": "^3.9.0" }, "devDependencies": { diff --git a/pages/_app.tsx b/pages/_app.tsx index 9940e42a..a520a644 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,13 +1,14 @@ import { Analytics } from "@vercel/analytics/react"; import type { AppProps } from "next/app"; import "../styles/globals.css"; +import { SessionProvider } from "next-auth/react"; -function MyApp({ Component, pageProps }: AppProps) { +function MyApp({ Component, pageProps: { session, ...pageProps } }: AppProps) { return ( - <> + - + ); } diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts new file mode 100644 index 00000000..45963e51 --- /dev/null +++ b/pages/api/auth/[...nextauth].ts @@ -0,0 +1,19 @@ +import NextAuth, { NextAuthOptions } from "next-auth"; +import GoogleProvider from "next-auth/providers/google"; +import { PrismaAdapter } from "@next-auth/prisma-adapter"; +import prisma from "../../../lib/prismadb"; + +export const authOptions: NextAuthOptions = { + debug: true, + adapter: PrismaAdapter(prisma), + providers: [ + GoogleProvider({ + clientId: process.env.GOOGLE_CLIENT_ID || "", + clientSecret: process.env.GOOGLE_CLIENT_SECRET || "", + }), + ], +}; + +export default NextAuth({ + ...authOptions, +}); diff --git a/pages/api/generate.ts b/pages/api/generate.ts index 9eb69ca3..8d676734 100644 --- a/pages/api/generate.ts +++ b/pages/api/generate.ts @@ -2,6 +2,8 @@ import { Ratelimit } from "@upstash/ratelimit"; import type { NextApiRequest, NextApiResponse } from "next"; import requestIp from "request-ip"; import redis from "../../utils/redis"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "./auth/[...nextauth]"; export type GenerateResponseData = { original: string | null; @@ -30,20 +32,32 @@ export default async function handler( req: ExtendedNextApiRequest, res: NextApiResponse ) { + // Check if user is logged in + const session = await getServerSession(req, res, authOptions); + if (!session || !session.user) { + return res.status(500).json("Login to upload."); + } + // Rate Limiter Code if (ratelimit) { - const identifier = requestIp.getClientIp(req); + const identifier = session.user.email; const result = await ratelimit.limit(identifier!); res.setHeader("X-RateLimit-Limit", result.limit); res.setHeader("X-RateLimit-Remaining", result.remaining); + // Calcualte the remaining time until generations are reset + const diff = Math.abs( + new Date(result.reset).getTime() - new Date().getTime() + ); + const hours = Math.floor(diff / 1000 / 60 / 60); + const minutes = Math.floor(diff / 1000 / 60) - hours * 60; + if (!result.success) { - res + return res .status(429) .json( - "We're temporarily limiting generations to 3 per day because of high traffic. For any questions, email hassan@hey.com" + `Your generations will renew in ${hours} hours and ${minutes} minutes. Email hassan@hey.com if you have any questions.` ); - return; } } diff --git a/pages/api/remaining.ts b/pages/api/remaining.ts new file mode 100644 index 00000000..667a9cd4 --- /dev/null +++ b/pages/api/remaining.ts @@ -0,0 +1,36 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import redis from "../../utils/redis"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "./auth/[...nextauth]"; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + // Check if user is logged in + const session = await getServerSession(req, res, authOptions); + if (!session || !session.user) { + return res.status(500).json("Login to upload."); + } + + // Query the redis database by email to get the number of generations left + const identifier = session.user.email; + const windowDuration = 24 * 60 * 60 * 1000; + const bucket = Math.floor(Date.now() / windowDuration); + + const usedGenerations = + (await redis?.get(`@upstash/ratelimit:${identifier!}:${bucket}`)) || 0; + + // it can return null and it also returns the number of generations the user has done, not the number they have left + + // TODO: Move this using date-fns on the client-side + const resetDate = new Date(); + resetDate.setHours(19, 0, 0, 0); + const diff = Math.abs(resetDate.getTime() - new Date().getTime()); + const hours = Math.floor(diff / 1000 / 60 / 60); + const minutes = Math.floor(diff / 1000 / 60) - hours * 60; + + const remainingGenerations = 5 - Number(usedGenerations); + + return res.status(200).json({ remainingGenerations, hours, minutes }); +} diff --git a/pages/dream.tsx b/pages/dream.tsx index d354b06e..f5579ee3 100644 --- a/pages/dream.tsx +++ b/pages/dream.tsx @@ -16,6 +16,9 @@ import downloadPhoto from "../utils/downloadPhoto"; import DropDown from "../components/DropDown"; import { roomType, rooms, themeType, themes } from "../utils/dropdownTypes"; import { GenerateResponseData } from "./api/generate"; +import { useSession, signIn } from "next-auth/react"; +import useSWR from "swr"; +import { Rings } from "react-loader-spinner"; // Configuration for the uploader const uploader = Uploader({ @@ -55,6 +58,10 @@ const Home: NextPage = () => { const [theme, setTheme] = useState("Modern"); const [room, setRoom] = useState("Living Room"); + const fetcher = (url: string) => fetch(url).then((res) => res.json()); + const { data, mutate } = useSWR("/api/remaining", fetcher); + const { data: session, status } = useSession(); + const UploadDropZone = () => ( { RoomGPT -
+
{

Generate your dream room

- {!restoredImage && ( + {status === "authenticated" && data && ( +

+ You have{" "} + + {data.remainingGenerations} generations + {" "} + left today. Your generation + {Number(data.remainingGenerations) > 1 ? "s" : ""} will renew in{" "} + + {data.hours} hours and {data.minutes} minutes. + +

+ )} + {/* {!restoredImage && (

Note: We're temporarily{" "} @@ -127,7 +147,7 @@ const Home: NextPage = () => { {" "} because of high traffic.

- )} + )} */} @@ -209,7 +229,44 @@ const Home: NextPage = () => { restored={restoredImage!} /> )} - {!originalPhoto && } + {status === "loading" ? ( +
+ +
+ ) : status === "authenticated" && !originalPhoto ? ( + + ) : ( + !originalPhoto && ( +
+
+ Sign in below with Google to create a free account and + restore your photos today. You will be able to restore 5 + photos per day for free. +
+ +
+ ) + )} {originalPhoto && !restoredImage && ( original photopuaGc+V14-ak+er`t>OCCN^QBfY=J3M#pZ~-;AT)iA%P){xg zSLQ#2{6h}J+||^@+6iXu=)i!K3w`Y929sc7LU#1e-=Ficclu{X4z7P<2cXE~33cM( z0P-~7?+r%nB#YH`4j!E!FdCN3L*+Jf_xA`K7L+4K6yb|L0MjifIP2^fPf4{7$W!&u~(Y@ zyI6AF0p*JG{3N=6Jo{@< zf3!e$^hbsNpws`&eE+TafA7P?%G}}a?tax({}A=F)_)h`>SzJ;fV!B=SOOmLzj4tY za{smAfA7H53hH2KZYIg|5A6Q&;O|Yud63Gpv;J4z{qgi)Rr(Jz{C5)&H!}rWIJ($F zVUpJNP)lG73T$dv$T;Q(0BpJu@) z&hu~2{$5`P>Hl_aKkM`J{`~RqA^-f@_Uik;x7Gbc+pF*Y-uADiS`OAQ$vb~`_qWGa zS|Jy#Kj3%>1Zn1yLV|+)0Qdd<@!wmhTYH+@=|HRjQgubT3c$p`)PA=5`>X%hRQJC( zz4GeMrhgd3m5}PEz5MYM2-tvFk>{Vm;=h{GKYjH7apA8y{XZ6bRow4RuA=eF@^83) z3DMOGzu~%y#xKji;rb;+S1bI6>na+*EdPez5E+t?(PJt7!bP{2Q)cLUgsl zZ@8|a@yqgWxPA%I)e67ix{Agx%fI3JB}7*%{D$i)8ow<6hU=FQU9IpNuB&MLviuva zUqW=X!f&{)qVdb}Z@7L5(bWpS;kt^(FU!B-`XxkHEBuD*DjL5m|AyuA=eF@^83)3DMOGzu~%y#xKji;rb;+S1bI6>na+*EdPeG5XhSq1PTZSfld&>-whDR zjTZ#kGy#FYFF_!3$2j9o1rUmxm@-60({uXkoJX3GqA$%jaB!IHK#=VGo><;I*e*8H2XyNCd zX4r#4NuKEIF10&h+c<8+x;>a-IoQ9}|3tBxrK`sUi ziI^JJN??q{LFq4>fp!FOJxn{I*wmPC4~O8*G?aYDrw&#@l{M{n2aG!PI0faT?_cA3 z|FC;GLVO$}fhS?f4V$C%@3EgEfX7{nQ5HDlpvnI3Gi0%mv^c3^89 zW^%zlOq(8SN89FB`09@COO0D6myI_xRjISl&KOk|`!moU-flTXnU$Zz_HYP$Q{lAQ zF9SOU^)G^86SwnD!4MyJxq+AXAAPWi0^fWri^dw8gnKSHfKbOqFy0o^3Plqi(gitK zJr(r?S=q=wF_B91+J_dBP8JXnw`dj;@nGop%elDmhKOs*@!L7y_%PnOy6-e3LhWo! z2-6qqU#Ecih~4$W8~ucu*w>2qGN;aO*`Dys>Agj3WR$F%8wwPiUkC^L6;&!DeiU4& zSheYg0qvVCVz}(OE^zJDA-F#+#A<;~#6BIqZ|X$GBU8J1twmL42#n8>BnNZi(RAfp zZuNsFVVam=VlBDzgfuThYxnD+v{-owS$fk@H2MNp%pd?7{h2JP6e5Qi^tWetFEiwZ zX}8P9aAFI?9314!zF$)+A@FXMMdzfGIelhJe5QrIl__&Niwni^f}FXxC)a}l0_;Zn~5W;jQB7i{~bIrFzQ1JIq^G@2Z<4EVAC#aS|pMKJsXw!AUT%Hdud;PjB1a(>ETApTQv1S6kocSq1#8FD$q9IH< z;#Q7;mFk zX_M{HlLq0Ea&nQWbdx=n4-eFSPD&f0p<*eP+57fzkWe86JzTOvYyMz_{ZY$3b+UHd{}lnBYl48(V=H{DdQ|zC^5LO@v2jxWx7gsB@xdBbRf- z`{bxv^m~)oMaF?OR+Q?+OmyqPpT^n`=t6C5u|ShHq-@`^EC)k7_?BByTJ{56h?Oi& za7~@axk9*-pv8gt30c(oL@@+%9s^Hlsh(ztk~sU*AIzQ*O~_Zek=WItQezJDTeRNj zdSy8nc!UmrM3kth$wE7Hdyj#4;00Oeoazh~Q-#g+`Lmwa=SG^pjzpyAJDv z+zgMfG=1}`g@gJz@PxQ39xn6%yDe?gGUP7o~Mz4j0K1ICMQM7rr=F2FXF+pf-wM?umk=f!I zB{gOSJ~N^7SH|edC|SY>Ut3vF!qTxtOiDKygL zi6G|P+ht_qEDtb>X#Lxdarj!=WKH5l+M}CMhAuPrN~uBUcj!bWndzwz86as+xYBnC zIZ#eq^OJ1+%1~@sk)4;d8HB6~2?SYl*vT-h1{lLe0#80n%lw`Br!NKYfdJ2WGW}w0 z28|FU%Ixpz1)v;-tWOM;biOjw5#HlN0gTsx4c;FrfqFWd$?irvQoDk-u`9KQ^;-41 zF=eoVOxW69;X@|_dF>Q$j46XxFt#!`2qud3>~Jvb`*H+&b1L(-4LY9VnhHd^*%5gP z;dNDnh8NqoKRKKBJbs1Fizy^Dl-_|GeXjSdAqH*eboO=gSvGMCUV^lP!o zXCKUb6N_F5+-)Tr%-Trr&p1 zLNC8v4&Fnq`aEq~+s7ETfj3c?t;E?p-8~r;C7FNL64(4MAzqKG+KyF1tiR}Fwf0>j$)Jy8DKtd?R>egMvnv+9^ulF)M+E8^ z2}o6WcIT~zw)q{O=RJ7IPnt|rPmJcq-6p&Cg!FIi225VRE6x$k&r~@p3H_NV&HoL7ymXj`ZeA9KsGppS%I?;R$E$rS%46adg zN?kmNe~Hb87kCrBD1;_|pP^?~Z|m~}?7AQP`#b+3J2?^ z-0nadI}Rm7Lq>3!f6GS77>}A-s$G7qAx(`5XO1MvaTrVL9D9j=oF-0O4=DHhta=0- z4)D4@md_5#b@4c1S3Rx3-l}k#-@CY-_F)_(fvRbRlG*W0ad)Kj zkw+4=E9{LtPE$eYRo3>lQjWIBc=_S`&5r5p46QY}IC(l$mYK)d*w{}xI%OpuKO}sf z4E5#q@D$5VQ_V3o~>$7StpaS|cF0 z<PeeKBPEVBu-rYL98#pb}yEMcS?9=Zy3=rkUjk;epIYuW1$mqem6ua}~ zQ`76Wddz+(vsK_H_6mVeYO08cM__F~2UHzSq8LX?iovn#cxuX>f~luu-|C{i76-!AG{B)4D>5B8nhG1*-0Tl2peTj+VVqC9^>$cBfK+j?ycgl3Mrc!o|wR<+e%Gc=|%QoZE0& zoxHuTvT?j}Hz1x**wvVZaJGzyymfH(^INogMQ2<^uyR&aI54If7}X0iDB|trEXJm* zIVC4+mBk%d1KQO`3A=Bp*_AHa5Hc|pxFIbiuUglKWteCJEz(+sf?M{+K(!ni(wmHK z9MNV_7kRr>-}+2#MjsIwW+;5?^a6r-KMBTPXR4IA0gt`SZ+_mDFxjPXnA<*=@cJ@6n zx5U8WoRYQv+Lg}R@^OPtq^qhA6(qt=(~~Rc!@`9oHK2vHJ9?h^L1ypDYw2o?iHRSm znIJQyRjm|2(C%!=WmGVSN5~x+7FNRBF88(@>xVG~{cQb*=qS-#&Cr&XXF*o@Rv6Bn z^{=gWrmC!X{hmdHLwn`(p)_+b-}8yTKG|oP6iHJ03|7hAQ4u3r<@ejyUKtcr4~1kZXX)lhA36d(DW{VSJOuIYfs~|2iY}XwMEmpfHw0nC%5!1LC*CerR#pRM(;F&;rE)tC$h!^!rtgu z(=hLde(u5|yd4koP8JYkp04+4w%OIm5wj?EU*$PY^qkig8Kj_&g~RXt^ih}#n-U2I zL1J(C7FQ)R^O}N$gyS=JJ5f&0<)sjJ*lknQ&e!qzu#_y!5wka%E>zFA*z|RmDJ;t9 zbJvCqM0O0Ut$kxYPW!1(i`CQyB196ru~qB?H7|EK>@HiITJi8eD;3Wl+GJa@MIl^dS_ZcV;e@nlfts6# z?`^yCG6XFXKM9LlM1+v4+a$ix@Y)k6!(wB~eiVhYKH8XM{0>!=Xceec9_P+(<2Yuk z)@5(^Ab)$Xsy$;Vv4UcC0el=!5S|N5`c`CbE&VPrM^9^SUV>|{sd0iazMgyfy_b>) zOfuZy!ZdDRj?2xho_Hqv(Dw%+1ak0#2R^h zVZ-Gk8a*={FU2BdHjz6`S|Pyl6K-n8ei~y#xi@cEJThOn? z0nyXTOn_Nn8N_TWKp;H0im5<1qq?|o=`mqxjSY*Hvr@s-aYIu2SwybY%nSbI=ZsO4 zvT1wfn{7;4kOT1{y*Wluk+DLhrKM%1$C}TZ@-GrQZ98-BuXgEr-q2}8sl}waoRpOb z5fT$OqW^RhRy8G-_z*K!oDvW1N}n~iktV|l`FeK)8-g9R)B-|hL#19cgHS5S!5u67 zk>oeh8JyU% zz@=-ZUi6hY<2lnRfqh_Am~!|`U}CmYvK&Th_Nk`p^1Nsl(UepMWV_RKcdM$oV~)0c zH3WqavKB)ZtdMFJ`KUVI5V+O*$G~DBV5oNE^dl9~r}nYZsA>mq+i#O{j_{)$1H11S z-QkQ>Tdh@lbkuvKS?_ycjk6VsR<^4L!)@9j!%!|FOx`epYOFAV3oeW=`zU6T7l6DAxHZ#9UE|@Jk4plswY|v9uui6?P2rRw`i+gT=r?SfQ^}Sk~&bpD5w?l4ZT$fKP%Feh2*DC8-68&@##b8<;VVj#@ZoS3jr${`)S9(xWU{zy8`c5vDDMRw@gvAD@?&^hS?z>ME zD^0hi_SESi)&MeN!YrA6Cc*IB?C_=mH^vfNYIL}}qa&Pf$3JPh>cVj69seUG)BU5d zB2f=zp&F7-)H6Az>{|f_%+8cD>T5bW5x&N%zn6^-C>KunwH{LCW{_Q<yjc+~a5V`@-mKP+B*`gS;4Lf(uDPm#4!?$cTxu$N- z&@-mqY|3AD%ZD|Q$`nX`33%}#{h){~D9YfToii+)>xN^bkiDlzga7Unn-t~)4$4?D z8aonVT5_fy4v}IMQxnXycdb1Bm-SlSlc5&5G~p#3P~lfR$cHS}7X|u@V@qV`O75E4UBX>y*YEebqDJ{9@Lr0FD=j zezpd1WG^-jU6Y9nq+NGAKl7O9$n(q{&+q3!)R6FIqt1BmkjfNUXevopz18g6t@y=+C%y6B9Vzg00OQvlU+- zvgGmy@HJM&M#;1Na3HR`j?rTgC=x_VmCzg0bmT7RI_|bwAbg4L=H~yJii++XGqW8# zFv6d1luyN6&uvG+#d{$kjBcBGX#z0!b+J2XpC&)7wy0bHc9BpOFdBOo6D~11Z&Z3P z=h!@yER3+(ZJ0P$7Zf;;uibeF(s>mOUuQwm2<%RHB)#JLV2#YTdx)hoDT?h`_mY7% zlu4FJ^=E~GaJWs5{sh&BF9A1$L~EO?zyb#|-s4||Mc-y#$ju3^h^gCAI>sy!A+IYmkdLEiBLk8AO`~X2AK;ZLQ?pK0E#_|oe-D$OJ z-{`?_2Yd=Ez7`>dao;0I^&Bk&)F80ONJ9iaV6(9^b1ge52WwtlnknXqgCkXScFu8eAHi_-ke>g$21jC^kg4@U@fD>3e z?%^Tnm>t-}wRq?1G~{|CcqGXj49HDF-!OeBRr0&L`$i>Zfh?=1M# z`&`xS5K3+{FTOk&g5GDV&IjU6 zfjUO)SG3Y-)p`owK3pViR!8F+HlLEr@vZE>$vI>cDOth+C}|~_*&g_>=nJ(Rlh?1r zB+GVd26ocv@oMaCYMuw0jf#^3d=Flruf(;&vao8|-#ytlOFM}ubsKD4T$pp^K5mXH zHVzws3SB22DMV(**2mtFIT3erc{IOtjIo5mW@vV1Aaqah}CB<9zxAA3G>sGKD zwIBOz<&FyQRclXN$#-RBh?$8g<&_}IBP?{ubJ7^@ST5?zJ8pY9yTcW0^E+Gyr^Xgm z@FT#x9{sdkPAC^kJWAW*GpFs8g>ZL!U&Ts)M>3{Z1A^g{;D-QDIp+%`th8x!VAFYh zyE8W8MR&fbe^6AnAPa7c!w0DGJCaPi>k@)K3HHYvN&e_@>K@n6mZ%pa?u^w0UlRf$ z-Si+;jfOpA5cJ?_Z7Glb$p)dr*xLdBMxRqr#Lbd3`Tu0eb=A ztj}xFhUTpgHUyZ!3}H-gkhl2yxZ2W5Cbxum>u+6czEo$BT7|w&xG44zwnW-mY<- zyN(I2Fm7QLod8(g{z*nT4-Npt6H%JTKwM~$4DTY2qg&U)gPbFqGk=yg4m=5ykH_zo5d=7z3y-0U6n%vlI%66UGg~FsLW|1!ikk3EQG< zXF5?iQq?e%@PvV7;6@w_(}@Q7k~03N2{AWRM{aPgAaPWQ*!VPoh%J`;nfzT}fA!$& zOhI$QnQQCAnC8J3D(V|B4UrdvtD1Jn!lr`{6I0*g75k^my| zJ074)w3{KdrNZW23R25hmlzI5qci5KX}iz1Fo59PiUS#mJxr>Ky-QZm#7J#F^F8oe zdDx}MY@I#dGDY0I3SS^$V{<*R=w2if@Rc%?ns(OTa`Tz3QQ^C~<^)X}9ytQ0l!98e zRCq3%DTA9E{LK4BD6qu2e>qz?*>c*-?Ic1GkJ*+3HUK7XN*Nq*+?^O6HEtr-+N<9~*MSi*yv|1XbQBKgFM81% zs_BO0#V6fdgV0_xl0fD*vRQ}$ zi8UmoRYPvjzAq;uFQS@_eLuIxB+FsB4pSABaEr=>AZ>nxIIa)n0oz9+jhj4-?zsA4a2rY>yeTkLL5arX_#&(YETa2MFQOhzYw%6wX1jeCMfx2)qfbw| zUcJuy<#R?_@xu-*`?|{h`mfKLgEXW-PlfL@6(|EdkSBBtzr4C95)V<080JAR%r{#K zEsKbf-G7SI$wBt*S1h+$XyviTi{4M-5zKDf7QMJD;re5u;}FM=nW;b!DI&D%u~2^1 z^8s0!wMdgO660q=r9PRIv?Id=i?u){AoU;*DrQt5+Fh7|VxBc`8oG3fzIW~NPtx?p zukpVAfNSX%2Sk&)2!jS|`8}_%gfL(rr%i~-QU?KMW~%5uEr1>&r8e5H;!?E7IL^;@ z{T`j1A%38Vfn6d51W=5g0oolyM>=oMkY0-`K;uL{feb>N= z>toyzJ;<_JIYrPF8%khxNpEg;O9lQ^tF!RsH)$#=s4DAm^Ks9Ny}x6PQSJK2xI*A_ zFc1SH6HWr6;UK+%Z}jgG4=;VC5NIDgCP^oP-|!n$A;)k>2e;=7sQH=G+$QVZk4WjDt&jLqf!O2Bx&myVN zD*PQyPns_;{BsBW2PnPAXAvkl)#V?AiPZ|M(NhE9Yy%*bTP=qj+MIpC#uwk|fo#7Q zNr7a?e%ylTPb{8U;B$yZ``X>bh!J;ktzAlXY(FXu8t>T!!Yx#!r@hUn3IJknfv(0d zsV`DLhTq=xchs&#tL2^v11RGTkun_^LJS;nFnUNueR1zJeZv1iRpoi%1F!`e@kl=M zJIKBCJuT|EJ{gUTkA*Rk$7`)20v5)_M)^TB7ks0W@-j+U-T^?3|FHZ zbvX{B5V#LCO;(6T@;eUAATXQB&lF&1gO}wa!k9zihwYnl9*ynVg|T--f9k`G4JWTK zn0EcX*6wNRTDE;ELd#|9ByOPG9=@J{Bpk3{WzZXbqi>&{#XQ9Q77)aBIUw#lH4sq48?WR}exWEQ{^d1J%A|DR#-&A6oTPoE(JpA75e->@E zuw$WY&QQ|r1SDWqcXO09m(yK(fS?&{!^mGCi3DdxmiBpl& z$j`Y9b*l-pePnD|C>ed*(j2J-&G@6EH#)Vlm9DCfSo3C+!MoX_aXsgR^E2V=X3NOI zTL;tkj4@7EZBO?aN}bDm`$RG^Wh0p1bq_gq|I9EA^$ooK)(c%k*4bq}CGE+JPh-M+ zc^*t)-P#~P0XT_;4@WW#=}YG?R-_`_9c+_;oO{kBFVOnoW@srxzQElk5WtdB7RBlD zO{Z#^ad$0nse!o*0Co&p22$gJX7BL#=I4xm(EEHNTy77ONbEt?LoOQd-1Q6NJCwjd zluHRIp9)I4l;=&$n?p?Lm#p`dnX^fd-#yaHTJaMwi;_uzdY?ydITZLBagzYZ zWy5pN)fv(QqfpWBmx_~r8I{^#?Q41iWIu2r&doT)=|liCt)oX;p>xE`JXvqa89Vd4 zBww1=N@B(ifV}|d93o(^1LQ6e6e@lDzIs|MmTEn8O{#F}nJ6-j0v1PDL-~iB#Izo9 zDnRD@Tt9Kwe=RdOF~&IhCaOUaKC(HNB@K>~_+(br>E`_=M057Q7Q*1mrb}Bn3Nh{O zPACvPc1KkK#_H_9%g!lv)>;G9sF$}Lp8?!3Wd}WAtu^|K+aVTWZ^LAc-{1Ci9)5Hm zi8g$_c8QFX$@>sVhXr-=$s;3D`6Mt>{@sHn;8%v)UfCkJGcM^neD$P~$c zD?FR05I=7rB%Z_Z<$ZNrfrfCB0hBOQ9oDV|ICp6C`4ZqzMe>UZ4<#{x?I$DF+U68N$xGXVqZL=?d9H^A7F=Qu+UMB|Z z^1%~3)nx*WYIvo~f!0edlOjfBYE5$$LU+v;7o@b@R(ojTDKDd~<4h8uA^ zJYdXD8Zi}#h3Uy-{kXXIt-n{QLLyARa}PvZjr{E2=)%-9J~6UncM`U6_7Rpdx}NU0 ziU@rjVMoK{-Sd%D2!;4UVH~vtcXBey-Qg_0mk_bP?{3F}pM<0tVp_!#TzwiIR-%jLW%sl^&5rA5Y(;?op%DzD1Q``glNRo2Lm6n)CuIH{Ar7H-O51$ z-9g#N!3F`}ayg`{+%zjDco5Gj%%-+;4c_sF0`AS@$kEQmkj-3)Mje`@NIgDJ=b+=! z1P2k+UjvTKfMtq8ZmnkNiv@j+qCY3G+J$|9y$E%Qo0%tNg0Ygf(u~}69 zNq_r|%*$2d*Z8)U${d|3$dw7Uj2-9ny7+ZU-5y$|E7|S$A0wl_E#UxJzO)`9HN`IE z-Vg7G@uSnXju-lsrmCq0j-blbrbj=)VVQa{I&IWr)O@b$Ju-?s9-K|-Ks2%k>`ScP zmy>BMfId!~MK3pBwj+R5!ST<58swml&1(0~m!0>$_t~(o)>*8+!2~X$NV=}ZA2-l? zK<{^d!x*uI0Q^><@YEZ*uZO^7r(7sUXY~f>J^Pa8Sl=!<^s$0ye1N`?tKY{EY?efs z*_r)}UjNIj^pW|wfr1hOqE6)63BN}K=w7C(QtL0>YgF@ws>wmRY0(I>tz|W=0cW3o zcv8AMOSU`n@z&Jsq>$@?Cc^oh^;Gl~V;e7DNIAbxnzK-4t;Quz=bg=#6~M$9 zx@59ttfK)|Rqg^w7lcRlw!US-tf$NaK!@2Rg6P0l!QhMjff~O-z;IH56V2*0{yes{QwOPjXNU3eolXkSC~kGv^!ILJ3qYlrlFY^Es9dx zw{_0d0A~h>OyCxfG)VahiDPF2 zQcM6I0a<4*Stj{^{R^ z&Js!-7;hWVoc$5IT7J$GFJrj{~+6wwyd@mJIz1KXa-AmS0 zW)HU-ef<1^_Xst0I+F^kBT1hWEmpOrxYUz_N5&B~j>*g$H(m+Mgae9?=0P#JeYYGm zH%@1Mn+=I*wpLK2a3Fdx04
v?0<EkgS8N zY-yqp%5${aeD-6#r77XfsN(&HK)AvLHiDQGk}A3C-*R2~&I2rwa~2U8(PHpC3n0)* zfdu3Am_b7^UugQB8v9cNA6pCV=t}R4{N$`lyE;5;8!mGPolDlzvjb%O5Fj`S&vOT& zc-nYMYAAD>m5PkH3mof|=#UN_58RG#yNf*`v-P?If}^>jr!d)}0Vt*cBB;0DwQeT*Qvzufw`|%L^9M-E1z(yH z>T}CfxuH){zwifmlSQ|#b?p{J00VGL)0NA<_>WzBa(5_!OsJov!BIaJD-I}0ULG*A zb&(j+NZ=HGme~6sU}-szM1~d1vUE(S0V|SB1-`)Qa&ON>Zqyp$a|EOU8+Hlpoo_7X zO#LK6aV(mEa44=Ot zyZ4QOddV~5ao)H#L%M?a9aNw7#k5`tsf!uUqaV6)gF$_A$hmk{AJ zm`OSZ)p{$>%+cV|+;VSpW?*vCv$i!6Ah|;%mJ1|x@?VZ!@lCi`5`o(nGnUzhLk;&C zdYsFUWYKNUz%IQgr>BRTd^CUXc5oSB_)gjH&cI?LAn&X#-`ypV-0c{!_tn^<0xsnE zq}hLANXmZSRGOn*2vB48idbZ!_Nx@Vh~%T$1FagLjqRQXWi&IyBcFhzM6{Z1b*nQa zbn>$rdO;IiYnNN;zW-i)Gw;R4hM6r+D&Xnx=!M$$7pm&Tw21&;ofcGhPSI9tRF?r5 z5{+mgEy>rpKcij2vnnC9IDzPhE_5>u|Ju1|BCtbkZnM{4eYREBLQbqE`+Zh)xPxTD zcz^yLdhJlUp~Tu8uB7Ci<9Ukz4^et@N<=J;;kBc$M?B0VkQM*BE3d6VGV72zA+ui1nMWqo?g*3H_7KRYis=Z-Tt= z^{4k>MBQc1=ny_4#j*!@!0|~MC0`OvIk{`m+;XC<`K6_Kq3@+91TjY^M+p}xIjipr z3$5j3K|k5BmwkE1lWdn)vC-m9`8qYFz&RhrFke}66M(|N&}GQU0PYUz7X3~ajaCc3 zMg>6=LVb)z9TUbq4tfC6KZLduVWTl%LwhlzRFu;ycs^|At|srTD|KlW5^%7RL)RG- zm9sSS_`kR`Qc~MrS85FLE#_L)zst8fRbHOZvsM9r4c2++*wr;!tph6f@dxoV&*5+&rvs3TP#fovP{3phgqS5YgS_a; zxscefF?+JzcOM!@q7lwb{m)iQ%i+B39X(HdmnCkqBnFzfs=K+dj!ip*rrtA-4aZJY zSP;sYC896US=-Y-#8+b;?~u9pd_5Di@> z`X)=kT9$}oN5o)&3D((uy%(0(du$4IE0vv@lN3%D1lf}uns!=r~O;n-CDn%Rv_Dy7%d)>?ALc0hZH;o<6}h>W+&pG5$+%&oGwy2 z<5Zl14LMIKeKJvZ&x`A(pvZ|2FK=pm^&Y0R*Y@bwDV?4^Qjs&ww6Ugrm~I%%k&Zk{ zG|i(nz+6yQoOeHUt=q?)X}S`n7r5J?AkK@|_cM?;VFFa-lnygeHk(F5hW1a6`S13+TXK1Q%)oV=@wR;cF8Uk0; zQnha2Z=B$&6qH{psG=P|BHo@CHR^sSx48vX&3RoVl5K?(Q^sXS!LsmLuq=%_3f*=&;+W5Ucaqm6gHQlu;>+qFZqDfuT0l`!9wzBG21MZcmU;umF-ln6~Qjxhnhl)N_M zug|$}+e8sJd?>acPK^X6t-SS0Z)OUc$HQj17EZ8zKg08d>Mp^f(qp_{)|UNA5eTe5 zTqJ-6#@q7)AK(r-(>I$gXa!B>Z`QbG3#d}*WaK__TaKqmj!jOI6zNXA6|;D8kmdzk z@MV;If^FdhilbL$6D<*ztXq3}_Hvu9yDUT;2&3ZZf%B`q)v-KVloj4E@V--8AERXD z1dz|M_Lz757-@ybDDm9QzyP?sI}$G)_<%m6RzCbxwrO6o3yrW_l*--doie*hKDxCv zr=>&f7uB6*bB~uU;r6m`9nNuaiKQc2rDIzS!&YC@h^(*oXV0M(*dbSh`0NUmoJnk+ zngIiz{L-bfzVmLs!<^&AKnsy4$;2c3Y~w34Y8@0hwkX9}R8&lJ)6UW<`ai^I`3V@l z6eo1$M(s?k?E)uegL9A6W!zvgz|F-s;=mrKTH{`ILc+5iA)I@8F>;FBJ)4mtpflU?*?gU?AC+k%aH(wvhB1e`^q{1%-<^ioPc$ z4G8^ox-m31q&?j5H%fF14~ z!q&!%is2PY;+Z#be%gv~d=p9|U_vRHx!>o%lJJ76Wk4fTtHZ7LA*tid z`8~M5_dosHdEoQLO9v0D23@oqd29Z4&RND|Gn?(E#4L{y;NDm);Nz3D#sJ@il#Emx zw7+sOPXC}3Elu$?WaSal_duGZ z#mAd!jTBp#!U3D>O1_q6m~MeQOCgz)BruHvC>Wr=d<@iwAD9{Pm?g?=bdH4(u znHyRh%2(4l6_xRI4>9JGLHec%z>J!+Zqd*(k+0hk_KWtxxmvZ2`5tu2r*D2%tJ6SM z4=)mjy{O37qKa@GM9X1U){@Lw(nL8}yuNE=Gkp^=o$!%3I%@3qbRkS0EZX_0VieOU z_adPESuGKLirjX%EcWA1)6wq z_K_pD1sqmB7)8or_1?#NLC30kZ~{J`=-a&VXz;AyP@kmbV2psxrl6AW>^s8z!6QP} zpUlkI-VL<#2utLk^6a3)od9Pf1b!3`zQf5-3M^6M+-QRjqtWorOGW9oG=@ zRc_v18{GrbovSHBp034Kxp5UIQiTah_RVERPjbw%&?Sw?Lf3CvLg)YDC23Il?Z^jW zx~{4T`h6d2zc-@`_`uLfEE#}16?mzG4YC>omb`vHBX}4Bh;WD?`D#G3^Hds35(OwB zfUUd8u*QJ?8$+Km9V!#j>@+5?Y_jzf+aCYMSo-}Bnxrg;l*~@OoDHEDu(6A8b*+Kr zn+G`aKajkD;EJD{xo9|!zE4->XDE%f*3*%#lbA+K5w7PRp3O$1(3hK#-}yM<0Yw*Y z--omMW;q-Izm0XI5_YHQudKEW zwTXZrnta~fZz)?L1Z>wh}|OY54kD6T^ul`R)8-@UwxK?|A3M2xu@H{t8#x_ z2z^c$(|XZK4zK~>0**TmFkl3k(q`aRsfN`m1!Tp^b@RR(fC&dr-Y;rz0Vhuy64*{4g0^IIE~ssm3Uk#-ezx6 zsZoGZ!U-hAKb^Hc?eG|^c)o29_T5HC%CLM_*>hI5(JuYkw$fsZ!KQTPe#~SQ@&zx$ zlv0wVaeN)uvrnOK8~-6|h0V*7f=@37#sCBP8AeEmow(C}N@+Z2B7AC7#h`~5Us(%) zzdG{NVqm#r`eBj1{^(sE@R5QMq@WYzX}auuLI+rLr}?OM&A+dHZRUrNaDkFH?a*!3 zrRouq5(c9K1w|n&8R~yNWS%TB2Qei1S>4sJa}cZQ9;F;6C%f;JSylr%Dej{6?tS=M zx&Bz;B47?TP*}Pt4MR)DyAqaKJkMF_om=!8E^PqbQDLw=WnVZT5*}>JK9V~)31ga% z!GnXWWS8{$7k)QH4S!a~JHCnz5L&j|k>P>7 zU>ohHoKDsN8Zbg-VH1`HF^DLO=&bumgw0{wKZIPHLJa6Zy!!F&*vKMV za9ai6ybn4jp~|zp$SX|v&}K)D)u86?{Vgyr_@#6NRvshg_z>ENMU-abJ4UNK#J0Gj zP>9{;Trj`Fd}p21KAE=Uh`EbAev{qPnFndro6H=aOm(*b;TLNk&(>=DF|JTgg;`UL zRbZ=+hx_`Ojf}qOu)UmI#d^t1>Nyn?;>)UTpmr>25rfSm`7QLs7?QhS<6m5Sqta{# zL;CtV36GruDAY!-5mloSZaq-Ly@<%#*fyH?_815N73o5nc2lhb9VGZAH}3D;PoDCv zF};Tx*S7)J;|bjRlEEUvSrvJ}kSTeLjXFza31qsEAKs9!&CUw|_JFqzF7}(`i_~Hp zK+`? z!@=#ZX5SoyTbrONC(OY*J8C%{MD7FeDr8-v$yD<20ARl@<-dp&ioQR!{#G?4L7KM0 zq)8H?A3=@^mjN9qnPFnKcAn`w-9-jR?&!YECKOaR2R9@6ZvPG?O# z^v^QOhj`CviY_2XsDpl~>mG92sLR8aeIXn36s!sotAYQ6P-J%~dlSYlpahhEy|1fY zHr$i~H_l6u4G+HaI$>hptj(HXJ~5lxE}q_kF?aQb!Dl~x#|;0-MO#5x`hUS!?AlmSPmi-}e7>+=k{q`Q;VN&q)K1~nTy_!+{%eH|HBN!%wlCla(k;fnbAh-e0cn(^Jmdl>DD>)Jzc4z&7cEA zR5}m)OZ{j~%yxO}Q|KyC0~E8J*Sdl%)x4RPn$J!ZCUcQ5y}PFop<=ZHwH6f7$|`^H zb~rd2a7u$^&!i2JLP!TC0H zY>K4foJz9y<1~w|%y2TC77e8CQs};5TIXIX)%YJaP~Upbz`kPXJ&?!?t&j`1jHd3Rlk)l+;i|z&-^XuVi;VA;pR#VCe!e1&_J8;Z^U{D%+x;!hY4~Hb8Y>QjyTG#WDX*Q$9HWnCk)B!U+{@4NBr}SVq8ozzk_JTWh zfIc3IvaorS6g;Ir>73cYwV9G_J_QG0(lEjkYEDDfT5uE;=ez-gsf{47U9=830H;2g z;85cd=(0Bg=$N0i@s@p|=O7)e(ogc0fW^dB1frkCssZ?uQD{aWqvNvMwCc$8AgQ9( zwXFBp|Da?B@JxvSiSr1T50cS&d(v}D(Q%Iim3s;j33eRuYtak;!R_8;z7kKb(GEB} zx%$Pm{)B6`xy3iWK&{q26{*Jt#!uB!ZH;UBxjK8`6;h|fmE5VYoH;pIG~5S$E%ji* zF> z*Oe{e3thMaJ~FQH1Gpe)twWrOq)!WWB35{3VzJph5%DhSV1%VRC2B?*+&=(`jJzz9 zU`?veI(xrD*t4e~9>5TBOd)4CqGnokqTmn34N?{`wVap%mCN>M25T*nL~Laq!9H`x z36_kP#|YfgKq5rnX!%&jYcZSW*WM~-h1TnHPlTi`E2KA(Hp*7r*?9aNEjB5Gb<)Z0 zXx9$Cu0!Z}tbID&tL7X$KOv+p=5i=sZKZasb+AO#Afu*EHhxc-F8DirQ`BVk$-j zrm+|XF0tcmAF2u<&Ll691WrF6^$&;TC+Feab>~Sz(77^iLk|$BqFSDTgDSW8!5c`~ zVMOASop?ygV%bl*S`hWcu~~fZnQ`SNuS%(CPD8FXuuQbeFRV=K@Oezhq!_i~Dy$3M zMa%jzWtiLF%Z0c5ZQBg;mqG*qVkk}XNX{aXKDhctmgJ4ad!4&(KfLZJVnbE94os4N z$;Bmd(ZJ0*fQlsh*&RBvoA)=V+E;{0{fT4xX@9G^7RiewW&xnffdEDIM{dn?9lOi( zf~wZNtaoYXmm2$3@vUdn$@D9_8h|{VT_Q3DxKt|OMSbT|aRdX40S0o28kWcl?(8%> zm`EscfpV6kj<;q0(t?!NhdVOgs9d$Ehb#3YvLO%EX8r1U`c1%0G)O)={OgACZy3Ri zRsc&nmDPKD>iXJo=L{k^S>mxmCYA|6>U;^aunMvDrw)kD6K<;a5qd3Z64-TOdR@I3 z9umYlU!5^dk_m{R;qqZ-2GAVOcQhw3+Zo%{7jUnf^c6jif=k!rW}^DU^$H(s9&RF6 zFtL+!5t(!M&I*W8!2`wij=!MVR?{mxVS;3>@i4k4A7w3~OsGS(3N`Zw_M)4A2eV(a zQAy)ng6mqakkh2+I7lINOhSv6Qr{y;j?ii` zQZ?`p6yG7(d?hf^`7P=?aq)|5^@+x;XNynH01FOO{JmehQ(M4kqKh}L?W;duMMOKB(+{Gbp>#MOb{MFecOqk z$t!h@tW*U@Url$PjF#s!%e)>QS#^E2Z};>J95MEDDryu(HqwuDFS+|F6REf>d zITI5FhTIqZ-LnJoA_Eny#-swe!w2gg#VL0!dMc@^R~-wPf>#4To>}B>c|uiys7$n; z89Je(YRyZST9_$%dKsq`>Ld)(3f0ZAG_9{X&wE|=SoF=SI?XrVF25mO*Wx4eykt7aV0B?{Oj;%SZrR1RmjTA0SI(d@91l^}i@6K6H=P zk`6$k>Mz>-dh>u=f%82SdMaKf#)Bi7i!Uz`Py-V#E1$(y0-oYN)zRzxhH@b@1b3;b z7$L{J?LV$j^NoPeMFqYTLHF8ekMR68LeP41b+Zu(2$EX{?CXf1qWp0W0_6&ce(QF5 z1zK2wv~SnieAkh0S{2pww6s*k5(4t9Pm@lbg>K%dQ@*hU>e$+>kP1vUUYK^;Mif^= ztrntX_-LGHo%&Y6gpYZE5A=PkOds*wYJjP*4;UhT{Ly7|OOW&xa%uAvpurJews5GE za?Hlciq^dQxSU02PRsJI<8I4^aU5jfr=9XK0IXe$=DwJ*?MUgYmm*e$xOqRarwkKY ziU3^K;>s6=>|KrEXi4*rnyNKr4G5386iyM^`tHmV`JabfUF3h9ue^61?G4rzK1P~- zFyOrnliIiyJ^&hGM3P?lnr9|fy!0RqZ%5Fa(tZ{XB$VEBc<=GJ4)8T;0f^CeD?kaw zZVihGf&T#Pgn%_W|L?9^W#Zf%Q!pJdC}%vDhWo7GjM%CHes)E3tnt2GTF0frOQ`La|It!e_AFJ@I_!+uv27?@GYeCH9>E8ONZf75_&vWwbssG+4B; z0gpN<3SgIQz1HdLP=#QHkA0LL9EnNHU zJH$ews3^y<{-xur%o$M1>jBe9JJx3onup3;nlmA&8kk0PzoP@hy7~1higzW0RX812 z5#)Q!=6^4xGJ_*lw0Y9+G6^jLxgI)QKp=Yk0(<@psl_Ntkd-EKGcx!F5k&f>1!|Rp z?ruWxzHM#R_Qf%M(za27oyFaN4{f>@7ZM*T?#tQq*z)@IX93GIv+{e;7J5+=6~&=b z-PYBQAOeU598-FfRi3`d4v;8t23^(-B7*Z@iRE~({&N{MT=*uI=-oO5ETb`ew7aGE za_&SxIHn-h>7siwcUmAuo*MT<(=ID2G>|J>&gJ|#3)13Xf2$N0=ZtY*VMXg`4>!RP zac~Y*Qqz5wG2Md`U`*O9mQu>jFvH_T}-WanM4(x&3k?XLpazaFPCO^xBo3Ztz7FA=kHO%0&s3mNpCSi6cJpY=R{ z^0=6KP0>Ubt!qhqcE&)6yTkPXW@e#XMqp-+LI&^6*Du~N`5$m^cIv~OV zD^#~Kh^YM!*mFX@ZuG8qbP3k`l#ot4z?Bq0gQ<^9?4k5^YS6%Ed??i&E9&8>$n)Zpfz7jF2>5z ztx2;pYOXAv$Sn=t$%`0^ce$p0GJV_X4_RQyzlg*7AGiL1d$zpNkbe}83d<>>ZbTcr zVJ_zn!tF-O?lr8=jjO1czlVeL{5h~nuNigIf$5~WTfsHe0y9j66B#Wt;OlU22x-nv zTvpcs`XSG?$4fTo0A>7J7u{m3nrcd)=1)VS)&}z5YY%{?5{s#AJUPOT1JT~{Cl*4X z(GN%zL8$w?Ns-uWajQg?Pz^!~AsA#u1bsr9XenG;1x5R4$v1QUV9s`nJd@vG5 zF3elg&CPY|lB7CyvUw|Di5S8fYIts-gZ|(pmd@!zFIeLXPH^9^qDz$q|4uXk13*;9HB1EaQGUAPz!8ldC!_V}=2=Wtq;zpumpZ^VjF~ko36;v>~~#QqOXv!3}`g;(c#F zOa52U_f-i8vRNgU^27gxz>3Yhv&xOkCF9l05M?dUfL4BA89-=4^~t1KV}#`M^!Ru& z02z#|_`wWTl`sF-dIucyhGbFXvT&zqoNAc~Ci^Tifv zC}2PM_ST+f~9f|Yn_J{#2<(BCbMo>8ZF3Nfr25b>eP zI}jLsxQ_6;2rE6dK0*m@6kP=Li-5h${+*TCxO_IQCj!J>(`wO#YdO{AqU9?8GnhI$ z%PlqoSY~+}HR*rTKu8y(*{nOHf))aa{kCgrr~y=pZtfmjy@1j8_2`Cg{n@ju)853( zT&T$rP2rT8rJ|NkF-6C|!=eJj2kP-$kLV69P@L2pCLM14F?T2Pex&|HCa(cnH`MXY zDpjET{Q&>(Gozaw51O3*6pDUE{4L_`uq27-j7s0@^N4sI}mZJUU zc;6nmR%|w*`F)fki%3|kVW{74;Pd?of>4~#b=w2yMiNK^X@Fs%{>a_iEhM(b2CAmamI4wwIgNi1%0S|0K1VGy0x@^L_Bwv#r zcBRIxi$a=wUbqjE7A?5*t(4wXAt)gZf`Ye5Jp|6l9$KS5jU!Dk^5 zT8vze<*GglQBmAmtybuHX1}l+wS(&Gp;OmeFPVT4tvA_dFmfPOHI5gw zC8U_@)On@1{%SN`HLmMBs+Rd~7NIpk=-U>dVnc#Nilk+ywX=71V}a)kj<5Ah5S&W8pY*(j2wx}Q-4#5^E}(}(Hst=88%8fuZYS@C zbs8gEK&u-^@FKgOoQs6qq@OdG&=kgH8P|M>^ z1)#)x*SktL&53lAf+2qC84jMbdd6p-mN2Yf~0{&U!pJ{{(}yTs{_26aIpyc8z>md#BnOhp)0 zH^f2Qju=K?Z?2dV|6Yw11n=HBb%p<^D3qVg+}UgPm~N-4irR#@R}HuwVh)bO6#FL# zF*H=@3&u7Fap0>CLiz}gnVd22rZ*>tp#)U7u$;eejS`Wyef37=sln~`Q+Zx+Ze)OC zO7DHt95WUYAAsP6)LOgp{8*vBlc^MB!4q^8fwS2NL-MiP;P>a5F9bayq(GSXqubGl zWr|j$04E}N%Ble1d*Fx1s=}yY$_gIpyJoS%pEmks9*=5WHlh!BY~f@Mqa zFkpn5m_o#YKtN%6vL-)6W(=}bI;eFnNj&)Nf&tt*r#xU!#cq+6yYlNR4ILM{Cgp2v z#Ro&R?A9!qqh(dQ5#fL>sj`w>NeQ85KFBF$fYTR`>%2>q)iI^*Tw8) zc*Y0DPOnXqAHaK)hNvpJx_~+WRsxVpg}_Gx>PGE7^T0n zFrWI6;W})z*OIr9ni^LPmz)0^}|Z4iaCuGM*#olPUnkUFOv-Tg+79O`+N+49U_*W zNBrmlJgT{rPS6d7_cuAgvRJ^I9T%uB9g|2=CT;*nC;U`qd44z1wt?QLeh|pww|kNB z?pZuG1mHn$jR)uji?Wd?B!M^i3V1Djr_0s|phUljL#)VBuv! z@DGKPi8ipThvVCFv0`ImF(s^*0`oW7{6@Bgm~1iriH}m%U6_D-8b(;TR_y$43AAsOy#o6INM|N$Yw)L5 zpK%~)#_xc1A2ps48AAkY(kE-kvlzw@;1IL???cSK2<%PREa6#Dk&p`|Ju!k$Hd;J6 zxflro6nB`umYh?5MjMPo!GB@nl1||`>%lOoKJd7q6ieHmBA|u{H$Zp~YG|!Q>Ru~M zdoc8(+UYdD2WuMQ!N9`^YAbJSo^6QypC`Ix@EzJR1KSly+>cbC=~kU&3%u_XNWJ+^ zkOD@jSTiW%svOr+23yu6SyKdQ%A7<%KALZQs2oZD(-8a&cmHJ4=Kwt$i1;c7WMes< z@xb&g#^mb->mP^{14X?=AOd&xVM3zXS_~1oo9y3nT}JUv%Tt0Lhp!u`CmSBAY(-4u zIe9woR4Ufo1j+r-N?PF#=MlTVBP-}E`rG*u_CweKHN6xsSo5bM+EYEWXp5H6CEr9| zVJz@XpWiOP4NdWt1-8Cqt}XhM5zmmwWD?yP^?XegH$yUF{_9Hr0r66?r|>!m4f&7>3GQJr`ZAYUBQH z17=Wp4T;Et{|-RVh3-3534 z$hfGkA01$G7w`Q_dN4;@7VAPPm;tVcwS^Z#@E*|6iBg~_)pba??v$MM#-T+I#$e44 zkqlhW(!~e(@1d+HgT@Nzr^HIR(15@H8NmH_gMKCDZ4?JNp&$o;<25{8Tf0O3lihu3g2-OxU zM!~$Bzw=UCKS z93WqaK1udv8T&&JAT)U*{=pFzm$i{Ka0b>_EqLHLc{`4k zu?u)XCk5Z}6l&}W!@Ny7iBKl{YQBraj^~Jr)JGHF%e=>36){+j0<6K*_l1{{-NuWt zRP?4ZC9;p|`I}D4@f~-}PO@OW&U{;>C|l~lQ{w-F)ZJgR3(+2_cdxuBzy)L;um&>2 z$ga3dLBRO)%&VjbNA`Sza(=3Te9Trmf4LK;RNYm|{>)`zDG;_E> ziN?l1ciT-|i+W*4qn1NGo)?88NqjbzMYV3~Xz@16>MFU;j|;6+V_^@c28Ik*O1iHM zM+(22ZFoQ+Sw^Jw2e>J$pUh_%fdy`nxQ|X{EbRkU!p<+2-?sG<@j&+{Zq2Nh&W0}? zxS*AAz2$Hrx^3SzJoQl(FLrlbO9%vPwD$q!f7doR!tEXy0Nw$#-%cavOH~r~+k6|u z-?n43q~DIdsZcmLAU-j$X}^5ZDp=zokYLqT&Nlm^!tH#8HQW5xHv`@k`i*ZC)Cjxdq-lBK+rYW<3I3i)793pT7ko zgmTrBM{?_RyT|LC`>A1MGj{Ohj{Yv92Sg!2sOiOr>_t!0nK=ZJShQA6ZMmT zKYV%&7!3iLoq%o5k#knwFcDZWa%1~7Ub^oS>rZZXP45w^Tt6g?4IH=8!JH$}hw>#< ztM4JVm}-twbY1ndCM6TN22VQYpu8-$^ABvi4(w6g*OXqAZ{yY3*vymZUt(a%=O`0J z(7LBzK2MdybGA1}bPwkq71aE)!EKyn3gCpVrRL@gX=LG7FBs^JU$=XGOWQbuCicA> zq7?Ko&ea2?G@t*9W)b@F^HHaw3Lf8X!c~-CZ1*93YlNIK>z!alMbmGB8T+C?I8fqZ z(Z0GE8`B(c1e#p)h0*X>b@$o7&lu895v2Ro&UHaVBJB4`c;JF0byuVfuhO&uo$$|>CXb~sYty9!IhPs#AW~rns7(bhcopjNKYI5+ zuh+4;z|#g9n#WpGn|!k2P)+I*N*pJ>Cmum(ESFFd(OV*fj`=^je~y|@L8pAwfHCc7 zEY8Wv_ZJboVDCpm57U{bo23qWlyPC(@5L!Rc7AIeU3=3+LxUzD6EYBnj&g z&c9uHkRR8Ct-jeHU7PKXy{Sq#732_Am-5_qFy{zukFASyL02Qrz5Av2z?9hW?8{f5 zwnR&oE>mc3Kx&%XndBI~$}ixEGMm>OI*UoDihQ&xF7lWN{yQlkffzxS6>{YWgGN(_ zMWxE8Ql2D0NQWEj4a`d8^%nz4u!*cYwNKLVwc7BgbOiUg_l!eY2+xh&A zze_=R(z$1!&T*`SgW{X9tR=XyExfw8#~gRR;xR(PvMg}|71vL6jlvwKn>61PHC9B> zw|}qmZgl5#?Q;aa99Tx5yy;&-ml*Rh+5LFyonriE?hQpb_MO#Hrcqw*bLsQW`}zDs z22eBu)Arz?uY<{e%A>q{x!*A%uSF#mCoAjEKyMRA4DAVp4?5ar{%p%OrtS`0^46Yy z)WRLVSvc~K4c!T4s+0D-BCw9JFmcx_i3`#pti zuXPFj-)sC;$Kw~jA{uXmu>LA;*;$kCdNT;4!)q(NX;-Sya?LueoHEz9Jgk>?uv(`` z(_kY01Pkwue2R5wCIqs(b@YABUKnvW8yr*>a*0_ltEpP^mB;v;?|&Wh(28&O9b&ag zm+rB2D69A*Yo1pY+brSODbZ$dM|M%-Ap2DYaU^urCg)KlfwVdyq$++vh&@f#23ON7 zgLbWE%b-4X^i*@qwDiN5d+4i64D6u?uaG&Xk<&vByj>GJBYir3hBRgNc0_L>2W1_6 zzm&+13?w73O74DYf9opIDIO*=GI;JCZ(6LXH&Ai4@S+v-{cM-?{+0Y$;#x^!+{)%h zDP$%#)~xBYqXYqgzy^V;vU1~H!XFg5tDib{W40Ug9<%`8Kd75O6Ipeq;}_ST`lfwQ znTv5>wEPBTaX2zj52Ic$7WS>?@bZ8v0eso&wRXw+@6;ok7%JEn_Dtrr5A0Wn0w-&t z_?pA&3U9`EAN|>=`C^3X)9u)}Zn47abAMe^GVT>GWMxw^N&fz5#49*zy?PEwBc^k~ z;6O(``zHEFo}YtvgO6X2V2@y%Ka03~;}l;ZK-cp9yj_9AXk_cYf@Vr0Mj5>T1b1~# zYrFjevY=B(TwlPD?cq02>P&y44zK*!H{Ghc#&UB;GNHG%Bd4&tGrbC*&6GEEAwi$N zSlB*SE746hUt5+&K8}1uph$LZ5Elmv{nc&0Pv%H2>1O&olq&0LSI0UbhW69StUMI= zi1dClLi1wcr=8B4U|3(^WEA!aqfgvPFXlH1WBPiFJJfn2G$XMa24y&^R!X9$sVi~I*b16~9=)NN0;!IWn0zQ0q z2PHrYnhZGj%WkldotSk&A0xDxRyb(u0{AO0emnc7BpqQCOPZDJ*HBC{7t>MCYjsc8 zFh-dW=r`3b6s}u~ z^xNo@O*py%RjjEiv)Oh=1FsUJ83JL)q}cmKq)}JxUERz&x1Jgi*AAS&5tx>jb8${1 z&&+nrC5xltA0kEeqw{1^nf}(zaC@HL)vQv5nDC@U@!pF}n)G_hMt2WOT=UPvr`e#E z)viRI#q%+S5^D1>aZ)%4NwM_nv%|W8g1_d+TOV9xNbCovY%T8zQR?A<3n8ydxO8w% zm;LM6G11D9K~GQxVFFGyQ<-rZg*LW1QBd*abc@XqwJ|LISTp>X4W7(J$qpWn)H@46JNABG`{$iu=;k7mTRXAK>}tc}+2 z4G1fy@(MpVWVlAKP->m+lM^()<{CbWc2dTKCG_uBsApybRqr%8Obo6I5;UIGHFW`D zB=6Vo#lw4>_O2ghj>o%rT*$%f9K??oBf*|?(JYhW@J#Vy96FJ|{5$5WzD_lyRCT;v zpbLTop0eQeFVMZY#Sz^O?%$(y$2Lg~L-(pmT2ZpPj}^w9b(x7tf&5xTxu(zxfB3YO zBgaF`s3R&qJ=NBf{c80fzZ|?*GkxfM=23@|<=3-gnh8tWndZKAORY4(&CB=$&6>eT z?JaZ~6W>h9Q0^$m{@`Q(bAN=8T@^AK2m1FvCHUxos7n)*#8|rj&kV@V%ZA$4rl!|F z)D6UXTblv&(EG#hRuuj+rI1pgJSzt-wRJg9^FEtR3CA`sD!kSe^tsE6UZnoGRV*U) zCNK$5ys5g|auuo-egp0N-uUv?9l%#O%+=TEbTIXi1lG9EP8f%w`zY?U9?T@rSE))U(i&Cq)aKY}i=#OR*RZ#_YXzII#xr zuU>vTN9`>hb@~G9J48i}E?$b|@`Ie9{58aiUa1{*hg8#-us`2zwvni@{gACGZaeOA zV#+K7*>oB2?dB*SH0{F_uow1tq5iA#_!VeXOAJ6w7)8pzwK>TTh<521-6mtI(Uq)t zq6sbLzW(Nn*v{v6%yHxiIT}EgjTDo#QLpeiNd(0=ESrUqQ;!hezRKOJvHq@G!@@j( z=IAk4{d%5(Oeox90L?!ehlc6c&SNitjeN3w5EGj)5EIWo-|2g(RWU?rhWJw|3VS4z ze{~5OIRSnwCGm%m)p~;fN!sPDJZ6cfFsI-L>=LjAk75 zPq8}Ja^70HF7>Ef*Y9<-GD2kt|7^N@=btWn<_?Y_?hd1?YaBGJn~SG7isj}^w{#z- zie}XGW#F$4zi>x6%l^p|g9RV&=BjMf9rtTNIie!vl(}2&Ngm8M@@Jcx;?rc2^F z2@>@{2gx&STk%DrPV0JlPqLyE1UG}>YW;a;d$&x97m!aaXVZ2K+AdSM zQ2LfE+Az{H?=e4=pbCdQdH?29m-|U0@$m^U_WYT9G)aRo2u&g~-~+a5BqOHoRS&m* z24fX_-O6?5gXt9xmTFOIqJ9D1Bv zbg7dL?a6X^EORH|+qzd?Elz^=G2HL&uwt5geAVB|Y@zYoix_C}%Pvkbi_k(d2A=3+ ziJHR)rtQmGSia-#Wxz9OwC#h%EZ}d?4H#*=7-d{1P9clU;$o?p9%%NzSuZ~-U&4s5 zw3W@-{#h1X^SB4Pk_gWJ=;P}D(UlGafNui%iE^en-O-L=yr5ZTH>cP1a^Tv5{R~|B ztf|;?%IZUwf4xBeI32#Gnk=R^Y(wiV!OoGXBKS7tD^DO~xr$t+iGMbW1kcGSwzw-A zj>6M3;G`35%Zc*ml7qJ)Xu86cFCv0bL*Br-O~OLl*5A}`hEpQkh=!-valB(?o_q52 z&6&4Kqz@Mjy3qRN)EdnnE?@M^vSMe(>L4r4b?)aQ8A?p6u=jUb?wecnIv1?ofF=_t zqmthf6>^2c3!)9YWhhU$&K6fFc_wr0K=7AGlGVpEM2u0^FtXb~aDG9<(L-fCj9L3EqPEyarwCSV>ZtzR)`rh8MOz-5!O)T^ zwCmQVJ2Xv66Jh)Nug7CGB1Exl+X!~hq*fWCwn&m+q)%Fb9<#!)M`N>_5v_FBxS;5| zxU2_!Gzy;Em^`xV_+gw-*g|%aU&@7au6?5tV$ldZuM~L}c5;iV%_%FRu>IR9gWa@B z9e#@Ax1Ii`l}qibsmT{ErzJvWIG59x*G)++yNu&Z5$a=2FLwmx!?>n&{sz!KcZ+8R zEp*Tt)r3dmNQk?benAxp7@=%8-<#7ToXM`opy~39*FBVmf#pgJok0b$CWazbMRx-M-7r$ zq6x^espR;j%1&4~$J#|EY#B0*4(-2Ewgi#~L^NFndchL&E$`^Jq}=`fO4H}I1!kCwB&c`P#em|IWZq88ubxqCqc97 zKz=$fbC@D=YgSikoyHJXF09PI@je;`%?GttgZ(65n#+4zoDoyPJ*6^*bHwy&2wK2! zK;&Hkv$FT!xogvvIqv|0OvX)_E}B&#V~E%D6frtn;7rbmG1rM(!OBB9F&KOnT4IWA zoBa#?O50u8B6^V)UqrLWYcq7hFJFRx6z8?+e`MUJTIl>?XL$oJ%^AAr()z&Rq32#! z1?l8g#oh0YzkQkK%D$k*m3Pqb&psRS*?H*6OOIGoV@>*bHk~?RjjGe3a1nclNGMt1 zwIBCIIent3Nh!l(W6T3Kj&=t}z1u)mwmEe%@9Hr7m8ttHx{P*VUb;9Keb18h%5Q2L zV<(QCxck+piNs_=i&fe7sRx{E8yF&L{bFaF$H-D=hkn%Mg~l?2zI%K z^k=DCgKpvY+z2+wXRwIGR=0!L=h*Ho-2LUdh)kh`^crJ7M(utgBV)dg*P?}<9+?m^ zc#T&p>$P{a;cKwWy4J5mBFM)QaWG}B+LUQy=Due5kE7`7^V?2IC;Gk76_J=cv+}Pe z*!kpKZ(3TqN0sVRa%4gYCLNXz^=te7gB_4!DLiN{m*zfHjs^k0RDl=QN<*gs z2p&sMgg|Z)F>o*-G(G02^3mzjv|W)j`(PN1e}2w!8HBS1Ir>-9fmaE45v91sbfwKe z+_A2l3d+1HZq4Vu{E(3Nk*RWqMMS+rKup%cM_Jm9I#Sm&x6xfF<5sZ8r-N@C{SYkz zw*-@dJUN%EO5t%aE^-sAml=D~H{b)+8hqB3lm9#!sDE(EO-yhBL z^6`Ylkn9Mf-FaVHMjBQgXc0eF``~G==ST{T6?=fpUEr>AHXAQ5sqqYBS#9!V*8v-# zu20^F0oafH#v2yUht?_fK;L^HZSGdKJW@7Z(e$5G-4IdTSwLBJLMAk z9Dgr3orJ>GMn}lV`sX+~jFR=`-t>1?I$6D;HlD|_sxoG!_lzrF|NN>OX9uVU#OcJB zSu*3VZAR8kW%7Y^1CP9e*m4v;Bwu9Ei?!!Z$$n|Lyy6a~7lz&ESDBqvvAIYFumH#Q z9{NdVmrEMYgqZ59)rrc#3|g5FwAz?xxTf&j1zjU})f-_$28XG!OIzekca6mdB!e7f zF&^mcrwkU^f}-rRg|82)z1m9%JcgKYmb8<(n&j>qxgeI7x547REeM0N1l6(j?6)I= z>9@dz5%|qsAivryMcYwsQ;LCVVqb&0@v<@%R)gsJ?3O-vWq*cb1$IqdN2eEZqRD}q|oMtIw4vp18g?5NtQOF5j^tw>IS51BR~{` zTd4!vc<&5cYVufQ#dOV2^|w3V<19N%Iewy5{Cw(koe-Ih&(?3#UCVsPI?GCP;(PYr zb3C4bPrxyr+FFx)+J8KjXpRs>dz-pK07HR0u&310T(#f(l}u^HSrTnbcW)+4huK19+p@yn{)xxY{?*^v0r z5V0m4_qk`eQAD0AwA|&+rk<&f1F>V0wCOT#4^QxWhAVuFZl)3O)n{@N@H}oXF zvp3@2$6x;+OII0?RkMT%X#`Q~r9%|yP&%Z$ySuv^L`tMv8l=0srMp48yBnnLIehmQ ze|XRC&Q3h@%I6?+x9+kba;OK#yh+cRy*BYCoYMRt@z+{I{Gp^q&_(G*u|uO#q{gi<+0DG)t>w8 zpASfJGM@it^QV1uQ=LyVA$Odq2OQyBV{PCCDkI>CkGVjlwJ~k+G7YeG>zV%b) z;VxERJ2|YPn@+sAS{~DUj;N-mvEa??olFn4+vPAZhlPr1NG(UI*i#@CSg!VIf6t+C zmaH5#;fmNMA`eL9fC~eooB*x)mw-pjtC?)G854Uvr&E5+PP>E~JK^hRsu42(5de40 z94pD)bV}~CeZuNtrz1**o%6Jde}5_QUR6E+iHIPs<3dO;w3?|HwnL**N(pf{vH!c> z0NY_JNcyqUben>n@D45A>T>s*)k{V5cJ`<{kGg+GP_d!W zP}^7kTlDv-rPf(>eBtdTi|v93N|#Xrvp03Z2b-;&f%oL81PU&|0x=rQF>OVk)$290 zzL7WCwta~RFJf5yDjo!VmiFPQ&G{|wbmn~*O(tYxLcTZq>xu5TZ1nQ;>PbEKJu%X7 z+;UBMF4S(J9olycDd~;h`7U9WjTN;BkZ|{k@8la>TIi>b!3d)9FyuUw(7!>eP)P*L zP)Fl-KIr*_oYQ=KdRuB`!O<}W%S@s8(Q+$x{X_Sgml z-Qsb3R#Up~X!6|d>4e-6dVZjxU!VB-Z>T-`Rp&R;`|#z6Cc;Iii-}dPxX36+dOOQ& zIwJhG2(EV1kFyrQP3L4xUjZlY^Qgi5K-$I^TC>6?c>h$!uvqwklVhnj}!O2PrQ1UBjMxDe$e|@yu6ITHA#SjN2Ro7A~0Bj z3zu2>bD&Vim~i+WO%^>-*$TXj5*2iAI-6P#8|XK$Q;4hLOn5__#xv29zwR*rwvjxa zH@cd~#Ice}F{ET`S8rTftUA-3gH@RRkf;;pa_mJ;Gqgd*O~u+H&~F<@Wxe2By!74H zNd=cZ)V*~md6M<)wpC{G3Tt0TOuWGMmQ^30WI=iv{)%}9YyV>Q|^m@Y3hFXFk(77&Z3sO3R2)MUxoqr_@bo1v-icZ%( z!kc+@vMtXWoAhl^nVNNV{Q7Xi`91nptSk5pK|?C1%F(gx91h^k$%Y01vVEjbAbuF- zK%}OBd^@+5#Iv}V-R-^BfqzzteKnd!nzTRRnvV9k|v-tP7wD10BRHc(Zw93SWUgFl?Bb6SMP zYxP}Q@J+(c*@%73MXB~#eA%LRbZJ4qZ^w$dQAJ8L^}G$Ksryk!6_2yyJSJrGD};c> zv9KwnP5At7J6}hj`RPz@TZWZj422b(+)56W*qP&ddCmS{D7-VSR+;s#en>zatyhP6 zG}xwLV{dcB!#ka(_lxl5ybU}WqOfAgTRJU&vgbEiOTZ0{>WLdsTIpMsQA|--ikbyS zl)%Q3C4U10ucc4>cXBcst|wO0^k0WsX}|pqD1Y`%@EN{Gz&YC>Toe?(_M=th>`{`i zO|E}MgREI1y|sM*T$7&G^0h$bfEAyYL;Pv6D%PfXxk+owt9X-vU|GCSFHPA1!H3bF z8AWIyJ`y8E0YJ`xu80A;^7Q3s_lUS$C9HF9rFo7cp`CgWmnx_8^mYyn*t-4H!LwVI zpM#%D-`XZ$YNAmiM+5h5>1~mtKcrC)7I{DB7k60HPjt!HbVSI=HebS=aA(_RXAV}n zr8%-zL=IPu{eYlA_|}R+kDUvE^?x$=M}7q5rmG*(<>-i6zLy3O3g`H}**Kt>j!6BO zbUg8N?fjGV;LVk?n;Yf)H3IMBkk`S*);Y6>J9SqJo;@x^_2c)? zk;`l{pOYrNJ>w6%gMnlr*eb0}RP8Nc!&Ae62+u!{mNwO~(n6`bc6(Jd-4KWOb&K%0 z%JHh{(`+NCGOOcrGF7|yG*kGYCXnsaKj4MlQBva2L6-^Ek5E3w_?RdneIo_@_1K0) zAu!{mSmx=UPJxtZQo%n*+=il8m^XnO*HvcASLUJ2+J3(}K)!6xSS7x`!tN9;IUV+S zgVf^0eC{tY|Dh|*%4mO-+V4ft3jzmsOYjzMOAr~;H(kcv+f z{bY?WAblez+x6*4_rZ2$hh0rtp&!LDG#}hETLAicsoh-O)8KL&?wnM|;n?&l`_Rpb znm{8*6vcvZ7H@Euhf%`YkzkNaQ{KASikMW_NX-2NwrwLXS4Oq&bq*R1A=Sv$Q^AZV zHDhVjAM`rU(5!A$C+Y%@rFh^)EHWlZFtpC=9?-Y7@kUDOIp{2y9L*Nt^45ITEJf;A zONk;<{eU;REA6=Vpo=mSYG<}J%>&_crYC$Kt~3e5C@0dQKcIkUNh^A7HOm->nf-h~FBPQrqB zWgAigsFGR{J`OnEHpA`JhuwN%Rt!}Jvz}zEo7g)oVNT2~!!?(4b&7UwK>ntL)xb8-eqrl%raBaS{0#zPD4<5MzX2eB90ll8PC~zSZC!E z%G67-UnX$-ikwVW(Y1B4_g5S;D==rlz!WeRrqgjfEw{1Zb=PP&FAapFEk~vwiX;ZD zg7v=VMX}#|XsLO|<=vRSp;VfBKPL-n)Un1i9Y0y|>lx*RP5PpC&fOq#t=nwZOHF>& zPK|sTW8;&@b`JwReJKXeL4fS^$Ac@OJx5pKUX!P;rEWrJ+Fz4z zuO0ua)o7obed&zW(T7b)Rop!&qIA|g{7nYU5A>A>dB@$xGPSy*qR^m|Orb+$d;Qj` z`WR^l2Io>ZsNVJ^VETB_F{tB%u4B}KMbN$evBbmrEjk-e*|$zDniYAlOy2i13I5Pj zO`M*?rQ`P==%LZFFoG5nx4$6tfk;Ubp*tj8a-c$XLX~Z~;tAJ1O=X=L@W6R*;(<;T z2PMwxWUGk8ysP%1)2~{lOdI`RS1XhBoX$R?2uqR29)ou&^Xlkmvn*omJD-siuUlQ^ z`}tZ2y5)v@nE{6#lF_Lrfi7FcB_`g`lhtfulf^A}WYE=U8i3*U%I{Q?SPjxV?5oLDP0p)25=`v!1rN1;?{n*UMlL*zgK4qOOs zCS`#lc^%dX%v!$qZe7o!m0`ZP!BkEjVOvIruEb#}(T|8T-tiT~u)@~r1rWG58! z@6@JsGntuQC33?763)Z`w@C z0i;2-(|T132VWi(mqmQ^xL7o9IIOznUiU_(u7KAy-n3cbdQ%ce)c!8t$H)C9X?e;G z+E}_z>t;usPh-L)U{e{}53j6_WLn1p9~=9jc>p@>f0=fjO`d$nne2KAtz4xStcF^# zX#D;~*or3&qMzq-F8(T?vkGUP)>CS_eF=hKcX!n--vtTE1wvfm>^j>yH}n}tTvUwB zT(yvZg2YSx7&)b^RU$ynZbXFD-(IadpqLoe9z80GKb-NTWtz#UddH2!4 zl2yA4%qZ=(^HsM99hpdDNV%BtG78jdcI2FR#uYm)ysuk+nl?4Qt`9NLEZ}#oVkW6% zFaS z{T!u^kx#1MqMU3E-jObQtS0N(RY*kn72qx(a``IkITM*3x2uuZgY7Vag4tkv+5-9s z16D#aH6chJpPFb@0mq@Da$M1szsMo-c^rkkGT{Tsh3wu{Z+SC6ki({j7}xS(1FcEt znsuGl_JLW(5?mTh;aq1^Db`)!>Z6E3a2^sIAaehldm&qUQeBx7EeB8TqWbD=8OuED zL7A1}dVV#w(n+Q@5~BH~(TGTJ(`+AK4UASJPc8oi~puQVn5U z=jM8=C1WTIr-kye+q`1ndh4E2pW61w{uKDwv38RI`6oOj+peH2t=LJUe{x?rZ^)U) zvDn%KA%kE@B@K;U={X7rf_&(Y1|7omx0cLf83>ezqUZ`TM)uilY|G#=*bJUGs#$7xu(LKMM zH78k6eNc%4!@b7gKi<|08$t5F70(BTC*S0_D-5&Bm-oZwQLQ(_P4W)|Oa+H4&2*#@ zYC`j|&RPt7X~{V#ofRTJw)h-zwwXRZT&7q_kauqY*o4y`pT;G0593B>xsv*hejwvx zt0p(d+0Ia(JRHaw0L&BZo3Ynam3G3D-yjU`JIwKtUO{mtB%9_5QUf9sD8n2&?m&xh zrC~t{%iIu9Ix@`^yPBw!3&yeqQuU))R8@0`$xg%Grst3CC%!n)(IG%Z!YtW|=54Sm)v zByPfyv|i$v7qgI)oIf2=rNG1@=2^nNwO{vaNCv~QGV8X$A_MO zUH0vDGw((=?!uA0RH-Z^08^}ccyw`94-21Qch0UGQ#<*ZqtdIf`tpe0bGfpLii3EUCG}L zm67`j3hUbDYHaQCj-yya18cE8DI{YM-S5> zzoBy7QUu&{vIC{d*r%|q+M_lzmCqGMvC4?*TGT3;{z~sedA(13t`%C0-qJmrwQxN* zDT({3LI+twk?Qii_P)HPj~T`BFP%5MXv>$4HwRwvi;@~}gX-P8E58XO^gi#q-j%E> z`X(@w4hX*NabD&s-flN-L5%WkY8xs3ff&nN?R=)qn5UE#BWld={PsqJb}4hzm#=v2 zIxfYdNYq;W#?W@n`(`kkJ+d14g$`xv)x_)sGw-y9F!!*Eb@F>4jv}F^fwU=1v0e0iM^vi-q zpA~&EBBazS*rew80B9+>8X8F_fI$C$i+CrO%%K>44#VKuU$MqqY1l^q*T-%A{YqAqc z308aiky<(@wy5VRc9L4WGOpu(1;O8*JZYR^jzhZAJ1$BvH^6teJbr$g+ei zUt?l*C8se{zHNyI<|9C2FB>bF(rC%KqZ~?>FJ%aZiKi=rn_*&Vj)@=o);L>lcRl4G zt{8_IpEa#U-?l!%&i8iM*9^)w*TTCYFP7ATW;WIRstbdrra%Z|LAWSfvp1)o1LVCA zLW3h7clTn4vYpRl-c>r&|D1M)f?WPmgNZw$zx&r=@J^##LVe*8EA>9 zyzcegX7QFRm6e$vC%{_Z52Wql;i%YKig2SSi?5 zGv`W=#!cFF{gKg(cBYgk?@y8kMAYIXWr-Spl%p!<==akyH1n+{N7bP@f_82r!a#hI zkt!Q*fxEIJaw0%-$et3ZLo~LNSW*R>OEp%FxPi&E@*iAHedj71vE2QDrKSV;dY@EAXOk0zam3S2fA*|HV$}-2G zX&ur2^+{zoXxrZB?^^QYIYO|gHONM$~>9RpGjV8NLZj5*IN7wfs1bNW1sZN^#1EPT*7yvJ+@)^;gj`nKiz8j z$C_)2%pJO-dM{G|zz9hrUDnNc_u+#GSwyA*o8c135dQp7k4Vj_LEF|`brYg}MCM08 z1Z_*s>av@n{r;I5F)_(Vw4QROsmwdJ!8z`)#XgYqGSN)3o)8YxEyOP<`o^36N^kpAp^>F|&>d6`3WZgDN|g^ZO<-_3rMYCP+fUmlb%y#a zSJTfRCSe;#tOZ8{T5$)ogjI5jhtFsE;BiudN^5XO#*ckooxQI;wN*@cd|k2>*}+Vb z>c77XG=*P1%SQOctN$GRjc+zjy*!Uaqh^>i$bkb z_+E6Z=_t3sHU~$UF#Q2I-Sw&C!?-dVU?FSk1djI6cezr|3V@sU1_t&?WhEhUail*~ zEG5PN4n5sMui<>=q^vFLfx58y(M;g%rab~S=S7!(yt1X%N+u}S^+Wytz=@;2MqjA6 z-Br5w;jti=5nZU7OkOEHPB=fDo_fZ_98Nj>z##mWjpSEI!h+?}#2E5_b8d?i7`KcZ zwVM2C2VtYOBhqy0jh4vmV5;da7YkYL=uv0-0PMG8b0=-B| z++g9O_=@0GJ+)G8&r7xRH;_y~?OijE45(PHF*1aO2z=b*Z+ML>5EKd=pGH-)!pN95 z8l5@I$ABTM`B97jMvH~B69JwRw)^B?m9HU(k$)GW-pZtsC$fp{NMY8$-WXi$&OG`A z=tXBAr>bQTZ9@DXQ3g6#g5_M=)0as695hzjhCYl_v^Moz+!G0n)0&xJ@?L>DTLVXn zGS&taqOy11B(pR??VwT6t)2>6isK}EM)JFw#?Ou+KZ|jIN$A|rY$nuQqVdW)^pV89 z@hv(w#gKuMU&>%|EQDMvi8Th~#bcTSXO^Q#Hwb<;m=+ksO|Jlu#@l|B7KpNF#lK&oc+>6x!2Xy-w(5}8g`t=ub#p7@)r9suo#8-26 zD@sJWkAXf&ZPRnTX{6c{c1;D&;1gxGYJk!zcw%G&)-eorS{>ylwcDI zV^OM9k#?a-AQ@2grit@wvto68V;u_udGmp$1l7h$z&2B|Lsc2J)--+>5NIui1x0Oi z@oDZnwl=@7{hn-9vvGIA$|ibXgdTSyp5K&=B^r*Ra??P{L8V5Rs^7merh(&0jeLbjoGYdW!P+k6RuJ;z!>TUJBxa z^eU9txgOowKhYp>P}mR@jZtu>?FWQn>tAP;H!3QXm4I@wZ!sf0qGQdD%9R2hj!%%U2&13+@BFc_nEX;{QN*_jM3Kvw& z4GJc`e#P?m02lhl6bV!NMlb`P_!zh6Eb7Xlhzy&1ne4Yp?~sXhA*#`ZjbG;P)n< zrq+^%S}KM^%>lI3^*^{qM4uKTeVN)dXDJl&G_7!AX#oRABI==&lj7!c=>erm8Gp`tkw6 zo}&Gejm<8hGg!W%QQwN>!)-Vz!mTjLdq`n@n-N|aph>)M%-}8}a#q-HJjgz=XKpCq@S zq)_VF4_E&V7GN8l zRMG5T?_zh^ZQ^MN*L+r)N#lsS#Nl{N1Nfp2w}YSh=`3c1TBMGE>oUXm>8DNuxJvui zLq{B1A;!HAeXt^A)4waXrwTTa(KDoB#p4K={>qIBtxgCXr0nj($E|HH8c}M@`@RRZ z?b3kf75V=5S|ih~+-kJC&}#M2)TV7WHma zNm<2~QWh|U29|x)32QznT2c$15}=uA1wlqG`xi1A#Fn=!(LoN!J^g&}jXkvE$S*(@ zzc3vOV2D=AYbY8X6{ts2_c`sSqyF+O)9wBpm*<0Z)k{kFqcEX-#^*-}589?V0Kx$! z+AUe_b8wU@E`DqV#Udd={VwmjJUkDwd*|KPhCU4uh5pD-I31WkEBFshW`VY-O$w|U z|Kcye8Iv3lnQWOMBXZkpfJ>dCx78{u182cp2J82py5_sUOqy}*M0$W|Q0Txa0w01P zUlD7d7v;nOz%ALAP{P_}TId_48pn}&y;35mWMm`!%KlJRM#KupXtt*wy@RG-0`S5X z(m)Dt(s5IppMM(Zi}rmxWmf)orgs>5inSa7>l%b}o!^AkQ#!)G_!xV*+@AvQi*PC; zd^@sZEJMtMc?l|DE#a-ZhT>ar-dN?oN5B#>(1_B#Z-Q6)IS&6fo^mPK5fVsMV?@

@?$|C(o~Y{^r!=u-!Sal>cWn`;G8L*32{0PQ7^^NYZ)G4PlVd{8YV1kGx8 z;4iwX*H5YgfUCKrr}mmZE?Ip8Sv}qPHU`O2l|~|@UBeZ=t3-I{!wgrWWpJt2{`x>z2!YrG&K(p?cpdTZ+k*b@?b#@DOH_6Xi-}H`u>!OX|II= zs()D66L3xe1a?oFHAr$$OIXx?`+h|H(1ux|D>~%G`BH&$El7KzOlW{gTKKz^UM`z$ zCV-j(&i2ch+!%B(lPo;;Jk~}3t6Y&8275Z_of-ikQQAy`+;?~oGErH`On<+`nNG0P zMkj)tA|hf^GcGy29x$rumF2OBN9-Q{DG&U6DfCS8@*Xyp8V-mEv>*{Q>^KQj9ERUo z%2|=)r9@PN%S)3CapMT7K79(YNQnb;!od>OOC*7*T6iun?mFvZ>U!zU&}({d@}OD zBxCSu{ki?!&MjwzVsE>QpDYqtRk(^jSq#D2}M=MpGJ6iulnQR`DNf1Wh`dSS9 z#RwF-+y408S>?5Y_!r+xuiIDDc5!sBV@zleTm&OD(v{)cN2PNK@%tdT7L;+eSA_Q< z4xah~zsjwKX9l2P5C*js7axuEjSMF{a8BVdu@O;Lte^j)PU!iR@EI2^s}dG-;3eTr z^}WFq19HomG%!X`yn|$Nn+SeI6Ew$!d=+tQ$>(jt)NpPPb`}#lWoR90MKThmAA1XE zi=NTf&Aw<+FbIGui=OUUC@|g}dhte9?vo#tmxoG_F$$KATdEBZ6> zfCvqLxyhtatwvt`k}pKcwoyxzHjb5WxW0xEkiqVUKxK0BSCogj?hC;Y2=p;A0L&n` zw9d!evbP~&$NQ{rB1)9G@~0dF(2T0nfmr|`gZg~$*uQeB6Wa_H`yKj?3KT~6*%6| zB*%_ua~1CA-NB?6J<6(g-A^H(01`hMbWF(R1;VM4t-Isv70X^_6`NhN7x7PWpvM8X z<>$2&RBkI$h(5a;0PT=Z#nv)WuNg3}M@)9p2q@Z6?*QJS{F6FOZE2Q9k88p^Neuus z2?mBix`@mRK8Cj_14p94A-57TRMk4VThNu1Z2B_l5ovVix*G>aXG`vlB?#^NFe%b` zZ(n0Cpfk-9Qd|YhgM#h*<$Lp2HB2QJ&svO@%t8wAP)e=;WT3dta2-eT`3%1;?z0nw zR5^|w|5oKHOhpx7S?lMTwc+fZF{pEBNcU%{12AO6jer_G)mvdNeOmG z>>$)12=isb@^kKEQr_ok_EriIs!wlNWo>~rP^MzIKn%A^;coh!9J2q0FSFg(DOQes zHBmCglOr6}5fPFqp?Xk5XuYZ2M_5VOx2~=cBFT+xC+&g6fPQkD|!Tj*#_bIX^dY7wx|Uv~8ev85u2IlO&DpHNhA*7UZ-X z5v};K$C;l;iV2n`UoCL=ickXOt&YC>r*FFeZFBPMfwUomaLsnK#kvs8&D!AKMz#3 zl;o#3%5CKr+aVPJ=R*dT&)}8c!!2u(@xujKqAKg&%|(o{|3ffLkg!@OAR2-E4f{$+ z_!-<5!AVwFgl^a2VUehLftitVu4-JMdQ-+e9Y0iZ5~4BnNphiV88px|D3k{Z7j zpL=A?Vb&ia^aew^nJ!H~``Qb2ZMz?S9i%+5Z4*&^mb$?~AGENjZgSDfodsH=4D&CI zE$&pOhk;Oj1=64wH2|?3SpAeMQJcbIAS}^qw3?N5qdIOs!()fDL0qt=i8ARM+u6>( z;qyGM@UXvuu!l`_a@h=millXBvd>hdfU}z^i6}tIE*sN&5!=gzz_83FVSuOqle=RNU{KzukFXSC z?HGLdOxz&vwc@^^U>M5#m`JVtB}Wn_QKDiG^8_dQMWK>&Ts~^HKwpQzfVXh@fYk|f zkz7aiXnNk}F!@-(^#YGlhY!rlM?^mb^k~%OL)~&X%CzXCtjI5s;v2*|GRD*E4rkqK zZEysk;g{V@czn{FCG4&>_K1PZWfVg+c^gR4#)a9$}6DQlM1j*w~JSKcmFIFrhz1vOn|W! zR+wFVgTDnCh!QOza7F*!VDt2Mlmg^s#kv59vL8*E$@-w+^sgK6D6UTUa||ujby7K36VeH(%M!Z)a~G)cg{s2yRlQso2tr;B>1OYbYrVyi}Yxm9pxDjEZ~i&H^p;0XAOnKVCul>Dl|A3JFou zSEpIBxqd3__D@c6KxGfZ{~Il@Ln^ff^X(>C?twn*y<)z)(_&*)rv;9JewkS$;3bWf z;SI6}8s?B@UtI#(CH@P2=Xpx#F1dk4y&%##5u>5!L>km5Jm%&VKN2j%{K%}6ttsbW zsSh6-9{X^ALwh0fG>qL-m;?t9Y?kWBN6c*7>V(t-89;9RLiroGJWuOL^w3wG@1v~p zl)^{9?&K_1EnYZ($9s~?dm%IsK5tk>4I6TVtlbm_peUA_HzZO7247s*=?NRcC1PIA z85Lr$j7tU9Oq z(%|QH3bP?Eo=*}}=+q}iX|zc<6a(!%Fg+tnzR#=VHs{Ze*VZ2nIHG`5*l<#6bQcb9 zx{Fp-mx7)o-!t;Rvr#SoM%s=K-u#5q#40Xwj(+{;rj*oz$YPAgJDIrQ?x4ki?Q;A% zHx*M&dRT?=zoi-*wm|T*l$51uV~v#a3F5ADh$tS3Me}@GPO=7s!m{G6zi`+Ty2plf za#D&fp5L_TUg3Mw#tx!nI7KGAeA}0I>nmvcn1#Ym*i*Aym}L;&69?yhHcL<=aB*a zxbluIgHo?rII*jlXsmy&@(Dny&q4A=y;$DN?o-_c7w|CvwqSvQB}3o|yo;NhZpaCl zZ3=!|K~h7=dq>5Z!=WYZ6iViB+lV1qmIdtR_NNaShz!aOAvt#LIY)gGUqXuMfyP)m z3WJpu4Kj0@b)aF7CD0!#w%IJ}0Uc$*G)2e#)FAG`r-rHD@0ffc_IEQsV{0ER!pOyT z1FhoQ5(|L4n3EjP?OLWiO25v_6(#`AQmL5$u#{fI{SdkBAd~6-?f5Ps=HM=x2m}*B zF!tL z`=)?zsvlxyqRWRLAvoiNh9F2JKYVF4<~5#?RL(Z1YiIw8>Gf9S$mQP{Alo~m9#ZC} zYk0%}F4ecusKCwCKr{R*q_8QjOtUr0*>tC*7UGlS~ZN4zNEZz-pt&o zC~YN9TE?hcU^faaO65LcX^-O~HJ^T%YI#B0Y%3;ta4!DK>#=z$8mCJ; zLIwhb(lYwhMe=T=Ob2l|VU)w$UGC_Lvl>rxrXEZrSNJNuCxQL?UU}vEW1rnPiiaqn zh?Z=XK^lwvfzO54XJ)zcPL|vWF6{j_zeQBS&dTkkR7}uQTqiAjszuEwBeg$MQ)-_1 z6>M#O?}x9(pFhMQNLxdko_9-OThEtNE@Y)X+x{r7(QWx&8C_rQ^@p3GP5x=SpFO!0 z$ef`mUz;N-z6&3%E1n*ar0^@|1l^|AzjG|_S!m}GAp`1dO{EeFm79*~h4#Bn&%hOH z;!Vyuyv@v*uHY9sX; zE5^RcfQWpq`d#O#EjS}xzU+n&RM)*&`Ek2jL8vY!A&OrQ@=E07=U?^pf}AHoayz49 zM}boDRFVmqOS+{_AuAQ$%VJvIi%*neELdtbM5m=Bs$DwHF6SCYom?uCFv9zP7SfS% zg~18Fy@EKLE3fd>Kj!5bnb6lHLwZ_8pg%k+RY%m5V zR(K3l`SeWo!-QDft8&&MS;<8C+O~|*>ehM;5H9e(8z1?M9&-f}p7<^IT7|=giLTdr zbPwZsh!D20j7sk;L&0DNiowi*6DPD&j}q9F3XV^KK0y(A%@?|-L){5J$1zPOj|pb6 zngfF{T4v4cMudN>HeeFssWgG~FMj)f z{%`)v2yeH-kzAfui%oK}qBOw%poZ@*C^YM22)e3X><48cWj%2e23V9m|6E&#DL#+Yur#3!&l5qU6d&lEy6LFC9BK+JCPFzHR9;dVOAW!Y?n{zc{?>=}?aZ(?RmVza^xcvg zf$*@_9hnm>8BRrXNtcX{>l(_e%;CKMgOl@3`$)+&`>^D6B#F`Gr6v^d1x3S>4>rP^$Q-0wgQ-go>i39c z@f(Vt#FjkJKfT2{n`+qc*)wtBJ$>%6lZNj7kj_v;Fx>;Q944pk?*PEm&3T1ae|e7Q zIFH!v7$cwmq7Att_tFP8&1+qERj?Qj==wv+ZRRU2R+Jc6+hzY|i7FBRf;ByZh>cG| z+3D&=j53WkNYo_;AB|LhLcEvwG z{lFD7!u7RdmZYxFntc8(&$mPD97YLw^v$O?$8+unHrScF98Oci!;qQ^I0D=AOCl=; zfbGrFeMJM@+_F6C7FU^L?=63|?0?#GZ7}991&duhD=>zR&OpD#?rqhhf+lVuq zqEoj;uvreW5=)oVJC-J_LE=hQAN}O;BqMGc)YnI<9Vo?Xf?pa!ee~Gw`fpB!kW`;i zoU}dC0`gA&>=B^3J(IzV#L)!ewaxOh6FXnqH5R{PC)e^D8{!<@8hO}cPSAeJ(WuqD zxso35-ZOX}=5-^}9Vgqy^Ox=L7)}#3tj9E>U(Baq7`NRtvf1-#(`O9UweCJ{t+r(C z)ka_(B!O^#ct|cwMcGN?Rnqs$b(r_o{8VHN0)ed7}EqRKS-7(RDjR(w*+XGVa@qRTfoLM&lGN#YxFg^I;@4t5muzK9=Bs2Hk1=!xMM~6{x_z1vv?FQJ!yuR69R`b!z zG@2)%Q7NkhO4+=6TL>pdC|T+Vy^unKNLs#Z7=dL0y+(HlWHzEvkB76wxw=+7sLy0JI~c)TEZrFs3J1r!s?ocdF&4EyjSjliP|a{bBhB| z3m*tvh=1gFwWPOQVaW3?-zeKY>`gkao<}pvD{u~cD=uY9GOvFpQhRqe@zWf(!5zdn zm6^_~Ena$xU)IlT6qarxN-ivOaBTD2BU=rKFallRQf1d7nmq1?ul2O)d-ChQ$ClF_ z_>d7-{Gz>2z|p?9AYQV&Zz~p>mj23Ghzcu{S}^{-+g-XTS-ymF^G%c##|_N+TNs8f z$RBrL-0qf*m6m;P4%ypqk1wLufVNOnQNUU2Ixi9~aU2IX1OE7BPQLd0lP4ASmS3HZ z6VD$`(!1FF6Ir|lIGIQ~+Obk-Meb6sNuTno5(YE*m$rxx<703Bl{+w^x$ZxNpg#^B zU!>O?T=%r8jwHLw1^zZ*&&Aj3Da>;_o^Gjb`Xm;enV}@ef+BJv+f)3lA6_z?jgI!F z)X(YU3}0|r^|)TZMjNf}V^rEVCN`sQ<4J?glK)hC&1GL*3BOEEXYCJhORpR|%nlCi zoPE-Jo>y=ge!^RM=CTCA2TP7;mMooRbrGkwwW&i~PAcoOjEk-k6ot06P6ba>-8;|6 zPr<1^b_LvdWUi|JR0idWjE4>zhvp_l%A0*BGqZrhtD6*4@_(83O%(}hs$I%=J-p%Z zBtLWQ;B=-jqbLUhs1ZINv1i84r*OLFozIyjpLf98?L}P?L0k<0qg8NeRyJxv;sv-` zSMgc7@g~Z6MR(41T4J?I&Cq`IBMCkj)yAxt60J3OzGW~kW!*1vsn^3TkWsaxO=~_~ z+_6q>c&ar|c_`P|{>c{DrGK2SOdploWac6gjA{F$@539IDf!-TF_9#;^FO=(q_l;U75j} zl;^Bzw^)0`O0haV1!`)&Fu3MtXE$<6Y(MaJ#9W5fv=jFTBXY)-(0@VE*;fDBWYq|| z3ptinrpehyet;@{%MxlHYu`}SSCydi*nRJ^cvlow|0JAuxZjP37tVIfRCPo#lG++9 zo6DBhX((i9@Co*npF1+^VQBeux{que?sih`h6a7WQIc0b30BJmD{fH}&d3n{pcPQC ztvNuC@}8KxnM?i*AIcDR;{1!c2zQcExH|7=qe)>Do;0SsJNnDDf8&NowP?z;yL$) zwzLvy?R`wGtGP@nve0oY6E>&Zfj{DKJ5EJEf1v(rm};Uh%HF;ml1e*kB&X+jxC!H? zamjzatJ;DULaJav9)!AgB??vFr#t#(Tb7c>N(N_b9|sn);&oipTMD2v9ikl(sY#I8qM2{S`PV^n$n>h%NB;XZXj*T|yCo`zvzQT`f}T zS^v7yZ;yN|gKg&jBk3v_;%s{D;_eQMyF+oe#fue+yA&wy?p~a-Kyims+}*9XySr1| z;qLq0Uog+kCMPG!nZ$6?Y=9-qi^+COitHzYNljaSpJn!IMAPKPEkXe}(Z1xU3_z9= z+$$t0=V|}$BqO7eQ0W`4&>7YnBmhTB z6F4oT!0X(>Y}_@oJYLlh|L=>a^jU8>8XsUR##?{)cQm`-HTcOar^D~ySu8elktxo^ z%b#e>gFyaw2)lOqJ8jgeY=f|*{%5Je1S!yh5j}(v#Tm6TZ~t?jbY5lXTL~lCxSP23 zeB6JH`v#eJK^dX}Us_z5N#-({)vE8mr56MeMg0#H0PT;K~fD9w=b#)$rtNsL1JT^XffCwb?7@BWGgjXD6^~ejnZfh+L zOWX|3IK+gJGf~)?D8Hd&8a}gOnJ}0i7M%oJp(vsjP03Rw#haoEj4^cTo?t;QVghQ8JSCf>S2% zpg1yM(I+&dyXZ5~qdxQ_Vq$z%Vm+HG1b>WE%>!k1(6b{e=(!NJSO)93&*5nep`6f? z%;NZOD(gSM#x2ybswlq#>QGai!K>~m;^yQxK!I`(ab~K!+XtKIH&H$LPPY@EkL|mk z5uIc&rPjs49(B$WYT8@l;JP!SY~K|M&K+|uJlkg;tBg*!81JY*Ka z@ToEO%9q)!XzCu92oqwIM$6CL0TZ!nuXukho>$A;m%5Kzm$p5%Z)M8N1_(cjT>`}} zFAkEv{%#fTKOh^x&T;(BCHDN-LjL-eQH=3UJ2k@#R=O>%?N->J!GIfYS2FC>6Sv@x z?g85Q{Ioq|Ui;)GHrXz!bW+A&1@WGZEEt85@}sNEkAL{n2YwCx&jX$`8|`QUwkNyYi=y0ll25~}(hyA%x)DB4gW_Tgp+20XBI+q@8q}DqReB%5RXE`SuJAk9)!)l3H>Bf46 z-uwsD2&U-<1*lpM1K(-gfnE9+g5JEojTyU4>EHgsr}0h1JuS*GU8F%;78J)$3~%Hb z6A2@WQvuJ{*($E9Xx#(J~LY*2?8Wj44Lr!$Pw{=-GmQy?-6&`{20JthzB& zlDn$sP#d%(AX*4T_*`rvuHB3MfktotI7n|=O%Ncyh@w<;d zosD0qG606CmzDh+ykIs*zeV~Q_v1-@Jh|;r?J#WD)Tw+lAT+K&EncoUzmc<=D<1uP ziRJM6gq@>$#p&RVFEHQQop;r7dUNI?lep+K&u2YvSmbyU<3>*9o;_o6fL-Ir2(e;Lm%eI^AXPA%Ri`1Oj{h3~4xm?_v1(6N1W@gjm}PnKgaG7u&+)4eoc*^UwiNPcs(eWBX}T*1^l^qM_>}v7+gn zFY(j>zR=M3t{oh~d&3KXf9gs!SK8QLLt}Dg`~-d|F41Q(4g-=|z1|2nKZXz37lI{- zdnOnsAt4n%BZ$g2CVxCg2m(|GkRn3SN;VaVIER&nzDHTltV)-f_LFEtFZHTAPkuS$ zf1#=cK1aK)&=qVaR(-M&d|yLI@Y{f|pF}K>`4@(pf16vH*xA{B@K<@n#kG`V|1UXH zEGxd}<3s-YTT2%KF1vHv1w~+3bu1q+-BrKnj_oOSst}4sf$Q#Ts?KL~w~5C~N2^un zic!8Vm1j@{SjWETiQ^)7NY#EbPD7oDTu0^$LL5#o=1B8PPG^!!A9GjN4nn}hYqVv6 znHxuG(b#%Bv$uEt_HaX~8oc3QnQm2(YrHbOc;+K{6Du^cgv!V#WvLAulWFn?RGhzrksATCwd_>&+%(X>ikmsf^GMB7`FZUOPqfyX&vn(>8j+~veY&*lYIAQyvX5j|BZ6P2SG!R zxi4u%H~QMOXddH5F4aqoE72vR0aN3#>6PK&SPtk)vZ^MV5izH0XDc_cDNFH_vHzEV z^~_ZbzzlUSwn83>4^=*ovuhtVpRO-cYBd>iQ)x}1;=Nb5#c$e@9e7%)y3jI8>_6ji zCkfK0PJVuWx^noS&slxg>T-y)*F%V_?4$WB=POA}3z~58egZ~6eR{C%aC2!Nk_@r` z#g*z04vCE*+{QdSFpcC|@20Mm2#JNj)`DJxlktLj6zTd}B<~7$Q4?I?DD!=HbV=V^ zqNc;};Bh*?i++=cx9MdJv(T@V|7J4F@VZZ~_~w*;cbyFQdD1AYJ47GpYH&6W^fX14 z?fGjO18I#MsI>ZMBjU;EOB6OBUe5T3d&F@od)=Ix=o-go+sFN&;x`kyo9cq3~=e`8HtX5UXK+1Q>xkFc z8wd++yzZTCX})iJyC27g_x?M25%l*tvnB;LdUhK5$u||znGS~e2JQmFH4a?&_&}^Z zbr#28;6e2@-dPK;cMio0+)JJt9HQ5@`ljz@h48YCJ~Cw;)dh&*o4JRfw45wWeHB%i zjACl=1^Khm79kA5kUu2gW4>;`rNGi_^UwhROq*wAf@pLqHOJM2n!^ijK(j3)m#GBr zk1l(u4S{Csr_$8UL2(1GUOog}v;Tn{EV|E2I~rs-vdVy#=l1oq&qZd-F*)&e7n9Oq zO1Vw|kLMCb=s^2MWmxONa>jvPwX#xST1a)Ttdkv0Aw(D2 z!+;=hP*suC3o3R5-e2^dEd0G?_lX^1?|wDCXv^ZY(D#!d6$hdRW<}Q71;%Aeh?(F? zM*VJhF;s&|Iwn_Lou%no(_U{V;WdosYd{hI`{bPbUyc~R;?s=zorVqbPwDg4`3be4 z^k82}&ZBJ881QKZRCM(j3;NslSq!FF?37m4IM&X;pdyL0BqhhvBOkVsZc|CMlCKl$ zzdVy0N&46~6+h$E5gyhf%k6zf`>!UbwH|t2secIhvs%U#FQVmbeF;_fvlyce(5xzIS{|28l}M3<#LVEER4;8;mu52}2alz}YBBg<}6eLbsDboa>DX|tus0-{ee@9J2yclkEbu!}A| zwAfXlga6we(!h;ge*U0XEM#8Nr9Ag&F;a~0SWfw06qFz9JJ0$rvz$y(=g%$Pu|8i} z_WGfE-QQyQF_;(S7w{IhO!96eOqz%IefNRDj=%k;-SO#b99yPwv1pWsfAh!80hBBj z^300x-7OKD{+h(R(vBpYZyebVDjNb+SLcFkLAn#j%k%+T(n~v8&eJgXjQz{RR9n9b z(Br=QVmmqkIChS2^;eC@pxAn8Gv8rG@uc^Emkw>=6HEV?>Nvl?>Ap)YV42$4f@YM@ zY$j&@v({Vj2eUS^+q<2mn33)Iu7*`Yt9aq`w{!Az(F6U{>*2nV?8nK=74O-_Qzths zMw?E9=FzrW?L#@gU=Oms$`)Q1Pby*-m!zNb>`n%Ev&{o9xu0tojB$|#L85!jOMhd& z?|2>!Muya77d2vy@xHnz=lE*gqT9aqkZk{C&tbjv@cuL`!-S;}DFRHp+g#<`U-hTl znwNkGvTQvEu8AiF@$*^_Y5DFGyXr?bUlFtcC4swra)?{dL(%g7buN)r?(Vh5jPvuX zj6e7mvOVJXuZ4Y{jtn-1pZWvtZ(hWnjFR#HHE+1Xv|J~Pz)my}I8C5Udy!mr!McDR zeSergql$XRJ%u4V`6u)bt<+LoL&2Sf0SfSjvRSjaorNC`4p`cQd&Zjo_+Q5EY}&Y& z4yMU$6@d{ z^UH!9b9;wi7iszGQTr z77pV`{;e7KNjPY3@k;D~+4qA}|Bn0SE;Vg`w}14(^nfv|G8xZHY(wzUYc$fVcKc}W z-=0mzi~4>Y%6(l`PE-7;w)?WGuY=FXh5W}C+N;S9XU#hDW$ph+=U+*GC&;i2cl^cX zcMRLx&VaFzt_~!l?|4HmUP|7($cdv2Qe!!85C2XpPCXk4shxs;*jqGz|Lz3FVYVEE zu+P6Ahf3-Z{x!r}se;l3B|2hk zfyQ}~W#CBSANuU4u%|FGg~DG<9QS=k`{EWl$o!`=J8EgkBfSy(yN8PsiF~`E*|PX$ z6Lxz@hu$m3!+0}FYKogkIV8x8_r_NanPK%A@Js0z7uuReS^clSqkqdl=<-Qa1bW>06F6u6rsks)HAooux$t~QV;5P)z!&Ne z7!|K`%nQj#PtLincWGn6U-j?!T`JT+$G9zDR37#g5$PAs1F7C{X~$v&%8)cnWr--( z_kzUtOj^uxg#7=C>cB^G>!qUg3LLq|Mx~E>OoA}9sD|XEkuq(oz2za9{`^DbPyv>H zFiF7HL(6Ru`_lEFT~F3dUx#fO0Q97#-ec@N)_Z)S^5Cudc|Js0yy^Yt;X-j+|Ava~TElN-e?b^w(BqHavwOK<9J1OzP(x^J zJicyTR8j&;`O*dJaaxB&`Y4QKmb$~zp2(Qcp4eK$;O-aSXn=$Lz@VGU4_oeaYDTz>KR#k-XJ5j~b<(|mtk@4xEA4&DifieNbM@tY-I*ShHN z>;N}_T6BnUjj(juHF=l0#Ip1Cpy~a1Q}EH{gCjP{!hi%NTrD)I7deSx@FlXJUL#*4 z>%d_12AzOdo5(3nwmMO3$sR+k@@!D}4`0QRAN!(xwOWef=|-g9gXgvB-7hX!hbWrx zu#~GYl6^}f5pw@V?nrRzDEt@re;YMED_w-L?f%}JT4**GZI-D0k;2 zNzRJfW|iTYesQ%8-=3WB*#14$q>+D^-5rsxSH$0yX2G$SGlRHfae3x)jF$5T_gaNm+~mT&NjBY%yUcBi68X*E_9=u#edRX%aGOfH3!^kzUO~i%}|2>v<@+}#q zg@j4i0BjJWqo|+d``|3F6-0lHTK|X+%HbZC(A;b#{)7# zB>6kj5d7pLVe@OTBOPnoO`5aKBb`!~Zl1 z4PP5JI~o7keeXk>=#jjEtW@ z(0V=^@lvD&1wB#%-!B9#{ckcEf8NA8&EPBv8P|E($A}5*gFbCv6X#wHSAI2eB6B}t5zgD@ zSR?$%$perHH^0Y5e?NTf;;CR36~jI(8Ov3V!xw9Fd2yoH41sH?qwum{OKh2_k54|# zw|+K!^)@3v0nxWt!^sfI;c2mf@{xeHAWl`(AZs^qI?C#LsXR==Bl$HnWNq6EUWe8C z%}fgEeM05@D^P|)jbNLah-yaC3p{dok6^4KD!-NOba&$0{;941u8rx@CRb_Dj%I3Xzy6??u zsDZ7YEf!>KD#YE82^on$9}o;w!rUHyJ~hY~Gm1~ntwl0K;eIECDa4_=uuaBTw50L9 z2>kD>d#7c+o&Lam;UZ62-jDy4C|d$WtnSvNrey_y&*+2qt>Y(ef}6#Zq~apB=h#T2 z7!Uv$wJZtDe0>--@OWEo!`F9~r)0v=^s?@EcfJ7UhW5Vu@&S*<#k+M4D`X?WLM3}Y zho}kgH%#U>w1#fHjbcWSnf_MuDy{_-MPb=m!JrbboNz%amY`^qz+PJzS97#fnbJb3 zK&g;+`!rq5qTm3zXCBX-jnOzNG%v~(wtFn^2RI^rm;YKE*=B&Ov@f`0LAfV;+N4Pk zuf5TvDb9(XiR;(+GXTfL#b?UwWH}XdiF>&FyA)kP+gutJiVR+0T8?s?fk5TnUVk;w z`srWU!9Wf#$JEbT4Ln+!=TWJDU<`yLr!_T8it^}Y{n)Y{Wkdz506;YT@Sn7>fNg$ZAfT=81Dn$G;Ua#m)PNPeh!S*|GM z4OU6o(tSgw2m|S)CZZrSoM4+4P*QRL52lmsVVg6aImtM5_~p7K;A?<^3W8}oqtY5> zLyeV?6*mZz4hV{_ENow(%xJS$T}Hn`D+;oFiBedqad7-jTNnrZ?4tcLCVJy;2Bmd{ zop-g;1#q)oUe#s2@cDMREkbSYPr~jC*%2;RE;FYFy3RPMh)qfO1d<>(&UGNX5_cFLsVF^)FC2tdR}(F9Bc(e$~?Lw1XkI2 zzlQ1p*`7g68F9V0U?OO4GQ?A;1&I}cqqs)1kXK&(=EGb;VWOI^fsxF0qLFd8-NVqj zLJ5)*WuKCwsLH{J4L$9=xq?~2JlJ8z-woow01{=+vnKmLs>B>JNIS7goGK}!$5C|m zXR$25W5b}QSG#T>y^0p2B0dmlRQLi0EEkm*#${+x3+E7HB1l4r9wnT3A&^MJqTi{O zUMhhDsMKYO_ zsm8I;tsTViglk%YY{*S2krrIb78BEB!R$(tO{D9int<7xU+j(9k|gc64#kq`1{kQ7 zq+~M<@B&Z;!1-nb;{*El#Gr=b$OsP^ja72|PK#j+m$i?7BYrEQoaGn1b+8Bz_p>YUhgN2E4jdPUmG9$LQu1Fi zXBu$4uXeYc57}#f(({u_V==JaMz}M$$AJjc*&K&Zn=7ZUj;bnVmNn$EO#;X6nG2xrE&&+Sa+$k=ML63 zQV+jtK+Fs0*P`#OKl?90d8dj-&Xn29rF~gBRt|8Wk=j&T+ZLJR-~5i`8eV;`Bn71@ zI(@O6NrL;&rL0vWm-9Nlx5a@hOMTV-q6ZBxYdK0f5FI|(d=~_^wB%iW_!8nF{ zzG3V_P#pG=?Qsv+w%;&8DmC*;0;;9BqPQG9>FtSh9tMDeSg!EK%IYk*8fh;Wll6Sk zwD6H1q9&2WL zMJl`7amXRASE0|>q*Qs6HLW8Df&>dm<*G4Vx$#OINPA}seM6l&b{1Cx-e-*M~VseX?dXv(d& z_C_n;#o8J;{H8xfWQ219F0kmk>GS>nA3)}@B06Lru$V+_Iu`U2b^g&0J19#kj}fmz zCseCSn#s{${dA`HSIv&?5R9#l-0pSs7^OKwk8B5bZCT6;NrH{RU@A+@|g zk^21ZBmLc1DMg!U{n z!;7&@_Kfda6LOM$q6*(>yJQ49YkST}bF%Fcv|YSvTe`iphPl=Glb#?BrcX=Z#NRz2 z4o@pdHSjow1}9-xugSQ6GWr!59C?ZrktqhI|CEddFM^wb z)tRp+ccvSrb=2S>rgQ^|{I3B=RdHMkOlzKJ-vrE^JG*R_EvjCQdjXFEHn4bXT6DE` zv;rxI4kC@g*0$aAo62RwAtI7ocBbU+(+@mxMgYF@PYfRO`C?b-$QF802!0^3c5E>$ zF5~|rhEZ!cA>f^M2}5mq*K}xs&ZkT*)>uXr>0kO@mz^+wGhtjMB)>Eqdm?eKRZO4k`G;t3eUm& zwOYaj0FJRLtqCPofw}Oj@L4}bbX|?egd{RdylnRj3W}H7@~ElbWeV+A zIMAj`U!0jdQjqo#qAM&Vtb!BK+dd^j-jwy~)3#FB_XVaU{@A4T(02Ynn2GpAuu>`d zWN?kn9)AjeVMpMP&Nwy!LiasEF8>A8WO=Y^@L*tn*I!ZSCwVWi6kT^Tw&=j?v_ z%TpRDf6}J4Xig%-eV`Q-`epjGVHjzE$K7AiLy@2WU*wu+g0O!KJmR7V(g-uqU=;+4 zyBBD?!6X&q*qad5JDJ1=C!jhE^;ufP!r08`C3OEF%+84j3nLWSSq7sABc_Sm=l~;g zdd9{+Tai#^l}5P1=jp?U;sK zPTd#cR6y00H%&H8JM*%nfm3%x-lxu1c1PK0gz#5lt#eQ^!wY9YCWNh5;!5 z&YKA_J4GHlquIvmE@u<6&g(5XIHV{^eKOKQU{vpFemRVJCa(T|E)anMM2iY1&^)q> z00L7Hpu=j=y568u>G%n$X2wcxnrc@7@XS7uo{Dr9pi=w*Hh<|^8tD}6MQ)A)0@)F? z2@)Gi6^JyNL?WGm)TeY;XH)jB3$8oMJt9+vLZLN|nS_FIxec)8FgB!wT!z7)p`rz^EC*%J)K_7XQg7;p#_=_e(n*8pGogpM-Gd+kFDZN`%kQbj*xBhP-X z`b15QN{R?YlQr@iZUGtzq11t}Ta`bu{yHyIveI@+*p5Ks8?&%_?7Jgo*0MWl3R4D* z9y4HgIw0=d;pO#%Z1So*?=TxsD<5RtfKAeBI#&8~3di_5Az56p0kjzSyUXS0Q$&_u zBhU6HnR&QDFxJLimiHSaBd zDUND_cfls63FFQBw)3m%G zoNa&RA^a?*>)(UrzLJRDE}mEaxe03AJ!cI&E*iA|3u(UldBOcw!=E5epnfGZo2fXV z?P9}YSFi9I@n@+XLAmQ>T<>))u($&4mFq{HUDJivztw=|qj7@gkyEo_@!iy*YBJ2l z?mzzcUoW6+Pn=D9nOui=v7jT19j7QE%*EBXAtY3NnTu))zY{`oa?4r+UC-f@C8G{B zM3B|6q$JSm>MD*H_ptbdY8)#i7?ZS{cE7RM=%Jx(E$4|aL|FC?67{QLV_|cs!4H1L zR5zd1qGVci4&&S^8xd#W-L=#VmEM2BF389iZPCjK7=nLGO~eOZrea{E10J*mpnYYx z9*HKDmT_f%K&^&B_<=bVL7X)dT2qbDT=p%qkn79$P`{z(U@S)vtai{#AMdM!i6~ht z2_?%`d^icH>P3PD&v$5u)BvNZOl8jZNhF&6LrP1~q7gOL0bi3I3xxn-USzl@pT@la z8D;AGVF9eTN^h^pw}n!H9zaZ+7Yzl?li8A=$u7v7%710P-)qIP z3EM5Pn5JHk0Q2D2v-AW>VjxSk)il4EFXgc=am|G|o1j7Kg%_M+hFNO^B(=<#*c~yU zBe@fpVce{Pf`Y@oK+iMAWY97zK*KzZOs8ju=yZ8AJx6R{X$Y|Op`|mZxKYHgr2iS1 z%Eb5ja|qZUuAQKT2Xf1kIh#Dxyus&-cH6w*e^J~B*}5PC7a+yIFJwXEEA%ty5b&i4 zIem3PZ#-u5l@UX<#gRvxELyaBaAbxrr$FQv$=kR|*oS;(qZfeJQn4Etd5n3XcT zCBJHTT?7WONT>uh??}G(JtiEHI03+fpUNMp23`Rx;Wo$$HV}5EQ=Bk9{&LbS5T*}b zrf+kqNUXCCgC23fkI!mnia0^iSR$jf4R_~vi91OebvxZzGx|U{Jv`90KHHgk$ae|h z*D`(W(8tKZVgTlqaZ$QJ8DAt+Xpd;t0EAy$&F13x4a$Bw8kxi*t^BjDTbK#^qc!HV zas72VIrZ#(xc;>*)N`7DDDK@L=Kb!AqE0```*_^@fFIV8oLChcF1A&$3{r?GGnI~b zl|uekqrgx*@z4=lJ}4yZC@tdq<;|tq5582W9|UjFkQv#NE?tK0{Z%!Zy>5!7=gl~8 zMU<$aUgh?p=&Z*wXM`IeK{FJP+KppjM4gbbq(=<~LNv?~>%AF2OMau5Xd#Pf*9QC_ zMY-aPX>E&YJuws&D{;*{{Skm53Qma{vVIx^TsOs!l8L0GKBbs&wL#%7R8YpDibwU( zqfcG2^T??B%h=1sYW@eL_BmNYqLloC0>+$v2&5%FIjkeL;7(}5Tr)_9cvzv=6s_RU z(8ILnmDcUQ5QmLlq;TPps?L74@l-4H?oiciZv=o!3`OJ!nU)ca-NvTZ#nm_=yWsyfU`j zXGfgX(Wi&G)U)BWYz3HL)kwu*S!s~26f)Vj&k--gjR}rhx%gPlkpr0M{CvGq@H_{; zgr}5^(5hI5?X+EQvHv8y)vl%U!fK$S4;?~Oy&xNl_W41KW%`pAIF#fEHLcb}Wp6Cc zAttbb!Bs%i2!Xv3I8=D*Kv-oPy)f;eBjyKccW)CV3}~*<&))=z|J3ngK1eN-^|vDQ z%ID@4hqePHyF?Hx+OVP}LcQsdm3vNTa^XH_isQBfD);tw6T(HN5%ec^Zk!##7Zwmq z)~xi;=3gJIszVp4<~;4Oz18$kwTF&QM$)011r2L|c1Tz)UW|SbZmNZiiG)H>BJ;oD zm)Bjh1dadoSb9}=2#SsK?4~rK%)`<};7b+y7jkWD8)E|i$m5s0;?g9?Z|sO4yu+yY zUhMp`yqg~`BPmR91jA^x$}y0yoQwb_230kCyQz3NO>w9{amF+-3_-y{s-2NasI*K~ z*bVc-jA3z)2`arop%L1+#%ds=9eTn9z=(K$ADM1rzTJL0_d<7XE@6sVYI)B{F)hO> zz=D)&ic*r43S1e&NnFE1p$UciBXGPY9kYfkD2IXKm*aLc^k-nNhdw_QLY~W%H)aC# zUl37E)YcJI{t`?KhBeOAiUh7A;dw7HMlT&jOgux%)XMMIv@6Qb*x=>R_J}yzMXaN7 z9gQbwA9!wI+Nll4+ru&ew(KB_v{iiw+{1|maaYr;+yXl1M7FSI-UGD6M8cGOmb2LXnnwj&9Vv2dvnK^!s= z!!W}wSF6^9T7W7Ks=hdy{3|8)u_k6hig*gpjCpS_e+|I8f=TZ#C(RPM3f2J*?GY1* z&)`f*t=?K@uN6&dU<+fX&}A+G+=%k@zV9i)2t=C>3kLlc0&&QI^qY~e8qaET*-iw= zs}nG&0JkLsD|BuO7G7z$=2mV3kMIfxU4%*wUlggKTw{F4-0Dt`(e}{Wu4~A?8&7p` z>N2U-1XX^N0-1Np`@uUgyMG8hl$hLN%sfg=ITPFhoO%!)VFY-KP2&o#N^xP3=exyO-#H-v2M zMCT-}x2IYU1H=8I7wT{z2*iFd$;y!i<4f?rvahRTw+9q$zhdb3Dx=aMNhAhod^DmU z7^(XmpT;AV7~FEXCm`+&EX$J;ZFRozN>uDPv{uS}2UN$vQD$pA|%J>bX`FI0yxCF+q5~%a)h9 z&|Sl~!_keq`|=Dj-V`l*EG!Oh)3^qH4#1oi(%uL@q_}ALQ<9D{L3O8^)dZ^)_;odd zi;z(#dDMMd>GVzu9d*T)uE#Niu6PP?NAyc?jjd{ZeRmQ7`t{91#tn{S?2cNusN7VJ5Eqn%4{5 z=91%jQ^Wjnea6;T1<);YrMef&dFjX}ECF57w7yqb0F8mTeEoVG&wG_+>upT^kdm}@ z{sIxW%WYvaqJ%FpBDne5O!hST$Z;1HomkKPn1572KN55}&f9fN?UY8v-ywU?0OjJLi+cP)qmdyZdBfsZ{O2}v&?AD0pT@CkA?bE38 zQu;UUE{O40*tz9VuU@M`^(2Hu9)X`fq=eRXc<%0Y!ahuyKS-fy8p${Ut{#jHp)men0^(p^LoQzRU^IeAY+tcDwp3euo)4v~e{44-1t8VDY{<}vB zFZ>H6-Gn+aY)L6cV>z4{X8pZyx5N0gS)Ge=bOg3 zp`IB~39Bl&`l)67L@P0zQ&>2GuFoY$N!*Mc#@pB5s1-Ib{Q*X=;rZ>TtLc8<(n-7d zQ+NZi2b^7Vt1yDfz}*zSqZcfT(q2T9rdKQ6quMt0VC`FEcKiEZHAkcFgLJP!!}#Up?$%-YqTzvnGC#a8DxvBy64ZBfR;K zx3??(T|TGivgY(~u^;{0!IQ>`XN3N1trGQoQyHGbPSmfhky6M{C9~|=+{#a2#6T7y z+e=4?!X}?5-=ogv{p0O|)rb6X?!C7sK#o5fGgBYpQ>!5YPF5c=i}%U(U<*b@@;V0t z^0&$2H}||hO!W1bN=MGbfhB>o=hs?sAhCzUyuZO*5IYjQa}w^OBn%v5c?+);eOf1M z?;<{V(g8-K6n5w8X>G3#v^?r~!8gx4Aqf@2hjE}8VDY&~_A0$9PEwLF9MKt+@c(Bo zIk!VD%TR@fBGjjoPkBUMdm+_W6g02^1aQxKYblWtJ4<(m2?|AEeI$jzS;1fT97&3E znrU@lca_Kb1K**N(e50*jhH^_s4b8xf6>UI+a-`g^1N^Lwux+`crqFDAI&LZ`s3J< zv~ZiwhFU5fiEl|QFxu*qakm7!i(AZ1NVO7F{(U`rbf;0*0IH~d6%dV)1=0i8+DF&d zNsm@?V%4{zF=n#){`7l>h6Z51hWo52)ogM37T~A(B45U-_Obm%f9Hh|a`-T`BVI0L zErxCU$7yH9)j%)uBOBy!Se_6-@KinJ7b;dBVfW+3g_t-0 zeT}^B>5e>*F>k2Q$XBQ}W%;P`G?7Jmy?@%6xP-hzD=OD`8KPW(b$)2rubUU!vuY(6z7iM$?UR zWkO6}42r&+k@^bLe4Nn;$=jjTR`Fw@*rs5hnKdmu-z@=`7&`?HNr_ROKB&hS_JP#% zl|6-Lj9`e5?Xe!$IgM2cbUTs^>l$@uVIAhhyRVxbR56lO8NdrJY@8X)t4GTFk#v%OJn2Q zuwG2V)-faZGRIafCmhb+b!4oBhTHX`>jMHxAW)ackqfOc%j#4^u_$`D|MBj^XHz$3blxG| zZzJN1vZ)K(a9vPjr0Q~fw|XF8&QI@dDBw-wbvhAy=D$qZ)lI_UUd9DXn7u(!`Cvf7 z3$YJhe&j+^U51RHI604z0_#ZM(s3s zxL3U#Y<;~=ojI5st$=fCsyWfvV8`6~a`vxschm`y_USnc5db^};5S=-nEg={Y(ALL zvFz*`QQYjP8vgwo#4U~BQ$SzPjPAHt{OBU)$MUYh7%JCnOOoyj8)%BCQG%Jxq4<_d z$$D!XbT0X`{=x!hO4}Q9(pFgL^_0%M|Jz#ngqUx><*pMdf20hGmo|T|#0V7Gi6I}~ z+%`|@nDA~0nZtPl-P+ zHk`0@Qy{zi#ZX9;W;`vXn|olUNKpG*S+}C{{(R7rWrXIY?d75b0w+ib4mUFjPrrOt zG|&H&GB*xcUX<}}#Kf=y$5f!1~EU3MFM|a1rA&>=;tr zJ`Xel8eYp2ypkdCZ8|MU*|ZnT+Id@D>VAJWnt|W>@&2a5qNOR}_)mu0J3_m8Mq*IW zYq;KR#8yywRiPhA!WFoAk$S1osOxvO(^ zL`Axk4EXeUBTXAoly(kJ@7O9cZo<&~Cf_;8@wSlJN@=}2r)nI- zV2){~$x&OxmY$=#$Qdx2s;mXxbHE90%aR~&9Y)4nv;*PluOI6$tGAa!@N(V|cy^BF zPPjGJaxFUrO!Ix&dDr7^fz)|9@phx0B>AQ&b(7G#bf=q-;)EVVd{b)SlTgs2&}*s_ zBzx7_u1%o2*1Qf8WO@@9q}^P^{)GAlvw}cBW0M1U-Isp~ja%j{S+GT$c3a|o{@K}u z&`X#$oA1t&b+LvC!XFGiM4c%dlog7VUy33^CbXeU1{!J$or>|HUGSR)&0Ff7*Y;l}dxIUkBCSj@E(%Lwi57N3OCHiE9WFU7 zrHLI|Fa(sK1_27%EOrE4nHv;*V9EPa?x+8LnMM0;=-Wn7LfTiZ-37eZX#YmBO+PPN zZeVtqmim0{_pk1Rcr-JfWGPcD6CLK=MMr9e3G4d6H4LRff|`^?yv zu`YW7V@>|+DN!Kkr(t1G3h{J@ZTPbqF4tNv@9IsibHlPDLHjSr>DZ7IEN$kevCdGr?NEn} zuBPEUSm;qU2z{G5o}6WxurNW+hY=FH+l+jk)4RIN4~P^k%~wU4u+9&B$f?pXLj*N? z(HKK@n^t}I2I+SvZ)2CtXDpi~)D_EvTDh;8Eq~iU$4*sKmoNtZ=VIq{^shNRU)eNy z*q>$!5cu?4-K;DNO7syA7C~m%_@(!shNaAHJpLiSpH(C5)b8fVB1Ui{nx)kN)D?7KUk!?!b^ijdRF|KVv0; z%O6WyVUOqZs!L|~4?8QW$D}&`NW)5s;D+H=Ygng1S?_E^-5&~Knv(t_9xbqNXIfe>=y=MT&YpbcE~%@^!^tCZUfk zQ6OjS2tupHxCA_V-m0jaeWFK%Dtr_TDK3?Ri7x*8QanFmWCPO=p+3ka-4bS>+?|Ed zq(~)^8*EJ8&KxerNgsFQv>i#|fuO44UPySgWH~7?}`zt>ExLYSRUU(nj*6&Mh@PDDp zj&y@Z;0L*e@>iWNLWe6IeJ^YQ^_G1^_$fY4m>nljp@CKU$vXfH_o_Ay0`Nh(z0P$! zSM6*kd4FDGd1mC1Hf{|Vv%qOH_vuk2g`U0S{JPi_@0tZ6(w~LCTuIS+&rAOdECKe*>|Sl4 zxwKs)yg$_bA4yjo7xmMG?*QRI;sELHkW!GAI8I8DF6k1KE@=*=B}D0vQc|R(k(LAL z5Co)=?rwOO-}^To_P)D2`^@Y-&&*D&l&mV&T)HB>9@{Z7i&OJJ*dV%44fBrDjCa@D z^IPY`0wtG}95%yR+scI+eZ$ z?A+b#NHyiv+CN`HJ?nfXOWHWbjF-T6|3ifHMN`=G3E_&B$w={m(?1j1TP7z9hzx*} z3WzqcUAiHsla~iWz}4KCp!(S*YaV_Mvf+*cA+wCOvS|nYiUcl^UvBsoLX-4%hJHCO z_lw5WebOR^}8OtRWTJPV4{UV629> zB(1^s$zqPGb>r{%;|OpgIQa{5BEdI@^j9$rBAuCj)qnfdNE9W&%4{}AoWRszJQYnX z-TLc3+DZ?!VjxMMB~x=e*G7`P-(ki%$zXFb4JJCQ8;?|6&Q=p{p33uaGq16>Jd9X9 zn%0EGx{<(Cf{*;tR-&=azCLw6+vMgy;#cmP{_#D0_2}qN0L#$XIN{Y^SWV{+9Z%cQ zr|$O#QhMPK$Rvg=kJA)Sxx?ABGdURV&Vc})k5Y{EU{P99s3*)|FQ_j8Fts|l38 ztw?!7`0A1((+4+=rwsHHyGa|>Gbh!pS6>B(y?2ealNArsqM+vY%PLi*$_o0<0;|ZC z-Y@Z}*aH}PmS9B_=PB?q(Cg8snoJSDEsq<=MFJGvDy(V$w3YNK1}h+VA8rs$*X|Q{ zaqt*rIM%wpxW0m#(409*P-8NP2shS>RSv0)d$!fTh594+ckF6(9NlByNqb?Q>FT1@Yc1ToBf1yz7a(9!P!@Ct6~5 z{fAtnSIk3hwmKJ`s`NuBY<0D;I8#?qoMiH~+kPP8u}>0-XSv%Krx^}hz;B&!$NO-yIL^AT!qZflwy#s2~aj zQGwwF({g^-k!_!uW_O!EldjgqSF>njUqaJi=(sXcvl5no7volRveYo^s_>^BRnPM0 z5&zf&lJ2j)Wi{kF%W$imP<6lEQ2qc-Ny0XE(R!SVrYmtB;X#Q5Pk;LRFjQK(~2}W zpOQDV=XXq$8w%5+BgE2zZ1BoJoW{J7H>681>a)_-L?k`dINvtUDNXJ9qwIzZLaT=i z*L>eD`gnKr$*z2VfB=`CK1LSEO64)z2iEcK_jlO$tIFAD*QpQ?L$GNNAG)ZUfiD6) zeP`=nYU0vOS*g=*JYduwDLt6=$$GuG_&yI?w_$EZ)$VIh$u&6U$t>Z$C*`^ig;$on-pV26jHzDuZu6438O{ z#)dJeEn34@VKv)+rh9^zf1CUf2g7$?>JFT`bSupe+t61dg!XVOFh-5Z5#fUL;-|mE zwr6g3b02p=S<|s99G0uD|3E%rSW>BvP74%KT(^)p;eCZ}V7_I-Q8~WAg;_+df9Wdy zwBkE0^Ala6!{*HdlFNCM$T!_rDMoAfrLSLHp7jMulv48$S;fcWi-pH9+CojdoqR(A z_XV~mPr9rcTydToypY~e00fwCyY5Wf6fh=p4UN_p4Tm#+@0%}5uHOH!UUAZu`@&+` zh)=sGk)C7uF+e*!&cHOSBv`@?;;`-3RZ9(jP&>k`GV`1ih6wylQMmD<=pP+=|24#)Q6px=!| z^nNjp8Cldwbk=ca*|w~w+zLWoP)*DzWW{QjwV?(}jnm-SSF($-evhV%LpaWZImK#% zp}V)3d~^>d?_XvElfJc%aDH?3E1SQCG#54eA2bk7E9^O++v4~P*BFI~Gqz_Z>ufD& z^I!gPGpx-q8%jXTQ7aTk&Adl0I_=(3Pbr5QumsdhHSUy4j|*3>d-K`|nPiNR1uz*2&F>TSG+=bn{7A7-jSU zl+No)dig}#gN##`)UY_Z>7=0VVm56aQJi5dQQqZNqdaHR&k$LZFKX?ma%Sm!%0a;Q zibKpDJYMJYdIMK_{XT)oY2+slLt-idU2Z^@D16T##UP~B(~H9LIw`??pK)~9@|~mP zmC^OrHEny{s;qfJU2(5=iMZ9|-2@zk0;Ckrr#e5+0fw3HH$y!DhIM5YR(H&nAOhi6 z(*gw20ekiH1fPh=s-VolWW>?}smXp!0UEGVzOt7Y7k%eZlZG)oQA_h(NQ)zEVzM_SfMvmNN*(grw&gi3m&kBJw!?A1dq<9 z#j#NqmUN#v)Vwz987wKi!;VCp*-_?LAZ1#T=qm?TyXh2ne$myMztO&+(GljYD}11S z@G0h54=>KstMc;nnCEWeIQnCZ^QVe+O(O=>l8%4pGG={#ShurD$RF!K$(1;uT&(Dh zLIrdfoH(cG!t6)T?!_!Ve+{<4D?NRzlclVPksa-qj+SvPzg&N#et#J>z~?z_ing%> z2unu)RntH}OmCw0U&D$=apOO)-scUb zqTH81gg;yzZ>Fx*98oB=ELuen%ITOANG|2HmhQhH@c8t-dGM+qhe*=>SH{$}o!z64 zF{lC)THTZMBgUwJ6Vd$c0aT|dW# zD>xcCYHqd!E9@xD-phy+okg|ea$tL=!w!Wch9g)&J-0GbioD6B2oV3AYof&z=fV6wjJbTltCi&no<>+8HL zc|)dS0YX5}v_ke!`Sxo0PCf7reL%^Szva|#^nrEyKL29_>>CyavM;5Q#*E0txofNp z=@-Jo58f;tYr8-8*`3}>8S9}K?QQb&*4|KkXuQA<9U35K@lL?J&lKzOQRS@GZ79x1 z#HhR+b)kQ87bgxqITVK;hQmos6XWk>F+L-Sh2|9fHJdU%m2(U*5GB;9g_!%#3GsDc zJKZaDNvwakwlJe&6ek#KFxfwlO2~ifCDg)r_T_s%GZH!}|LrcN=REqfAGcLwOiV+d z;8KV;bV}K#g{@!WGS?<+XAb&~C2e)Pn~cR5H<&scMd4U$t6Y?mtmkWV`F)H`itvxT zhk?T@}W_`Z}BhDTnG9X#i*{Qvc={qys{oCXttv^7Y&85!|2 z(6OhP9Pv7Q-@=lkJ6f)ULkO{dR3F(Gk)bi0GJr4HQ2lu1{F++Y#~%Ik<{564w$^e1 zsfrQ?hB7B76H`cU%ew>#g=6D4i~WE3*Si_gAJZ-;lw-%Z&2=kPSdP{Qj0#-y#jlqJ zuDG`|)I%QHeWPXRQNV~!svm(UQ4AFxd@2>vji6)8aCvsPz99qh`?=!k9rB`D_n_G^ zgQ>4yc&rt>-fVS8|3SSHpgi^kxh5e8uI#M%x8(rY`e|spc>hZMuwE-(k2&G}nu(IL zDB31hD8hNXwrsQ}d6JQ2GYoDa_Ej*q@z;TZC(A^}Za#nHR^BYt)ATskx$t~fbNXk= zLrP}KnuSfQb3-yF21CthbnPQrxMf^~ap(>{lB!#l7q{10J2%v`|0aL;cYzo@c@Nxh ziQ5FMd1y%w!coK1;PQ8{f5g9TBcsOocDp%3fx$(U5PI zx?T9@Va;+|TOXB39mm+@i=I{jm414jY{}E^r(}!!3*Uko`kNa!<|BoP>`X>=>D??y z+dmNcT61HaV3grPh;w>_1RNMH14Y_?m10LpQ@iZOlZmtIvbVu(y57xyCzrTc5?dA7 z{1|RbdTW>2roqv>8Y0nZxoqwSO=Zre7w@*(eO53)>X==Ao^vjy=|jvn^!N6Lv^UXi zM&*U53$pho_J++roaa@V_E9g=3SO8jSt;X0`jwR#zLO_StV)Ped+30tZCu@$KaM)y zzHGYdFnclg%jaNP5a0ZC(CIrVL#*7Zwd^zJYl3kmn$Pcb@MsigM~brtzS ztKP$DGBhQ`LwA!(53w;t)z%+7jI)wWv8QCg00%X8^mdrl9=GQP$zf1A=`G4TKlJLOwZrZhQNz>^bItv z(Oj2a4Be`^`cO@+QFfO(H5^k`)pM5>o(z*vs84iT7OV5FkNX_SOqveDG>ndD&i>tBQ%?N9D z{A{eyPrs#S*walW+WXaV>3gh1)ovwn^B-8&tS+_0qMx9?$XnZLNu-=LE?s|j_D{ z9J`~GpU!H_kc0aiH{wfNKsk9JVc9DupT4}ntrZbg+W}OC$3Z4 z<@~3x3|=LLqvY?1IbJ86fD_te>!6>Zn{SO(rIooOP5)NRcPQoA$?Lka6a4u2?mC9sso1LBxmg z*y7drTdOwDewz%(7yZrt;>{|w_ic2om!0b$I}?&IBw#L5MBFZj0Sc3WLAfjwN`H7= zEzOe+;5$e=UhHnOUFFXA&kP5c{I(L+Xd?p$G}v_V`dq^6PPS$MwY-`KOXVK|)EvNo zI}lbz(e?yF2KxX#OlyAUYY*eE_1d;~!!G`iHagsb+K2h4zjR5~VP^%wqr6XVa*Knk zr2jf!+)?JFr+X@-j~4rU~vm-~TDDAfC-am(hkOZ4@O1xBIN%kJx!Llnq7ql9Hw>H%j6>2zQLeG^y?A2oHX# zg$bbBv4(LvKAcGrJrcKVKNO#;&HbQ+^~lmG0o_$=W-OX{w1h>lj48h`JUDH}+IfVgf?) z+aiPn?w`4NzJ`(nZG6o>v!Cx?^tAU}Je4~-tIet$6&ORvw#M-VFC4kCO4CsiVNg$^ z$YrnG%N&TNJ_s@`gbu~Fm!+&885@BNrI9?+cDajRk?Gitfbv;m`bYjd5m20=T9BKl zrgr!5v#|C^za)~I-~Dr;9Q1IFbwU&wcR7=kqmityr)Mj0kL*Wlpgo<7lYzpRipieM z$;ib9>8L7iaoSa7`LVEq_+P)JV{Rr_4MjedSw?^;2tK9x)WUB%QfFJZ{>Q3W2)08+6a5?kGpu>MpF-en2g)v z@(Zt#??Z|2x0Dsb2D?z#E18*=#jac3BVFrux**(mL?*u&^Y^*-tnuG^myT~fJ2$3c z%l@=T&6k6Cd%k)P&fgnq{Zy;{YQIrt?^EHp7*gfmmnp=)aeTi}__ybT1Vr+a+I2~M z+SGz)c|GP7Z#yYk<~LDd_$QSYvw{4|`=s%E*k|8r z$|O^jCAWKAWM5)q@rBSGMuePt`Z8MXB9*T2>p?cByZ51S!3kEtUwT*Z1RzWw)M#&u z`IMjkd4~8|Vm_^MD>^Jd7`|lrp&S@t3jH!2FZTWF-vGg#5YnBAlU*14NAYvNC2|T2 z9twQBSNvgY++_9Fb{|9XjpZ!*jEduEdCaoCOHpflIMtyxpB85W)2QJqx<@Kb%O5qo zH-Dcf@oqT>tp%^-8pd<038ik8`i_Drs#Q~26xXbm>)wp^0O5{)l?W>9$h5p!_&2oj z5ugf*2@Thr(8r?upT3QTkEpiRHs!+E+l(BsFbVkttn_0Qd5qR-@#`>-#_iF*r&9IqPMt>pv#9}H^5skLTdX;R zK@dW#ZQ03s6rH`rQ9CS_EvEe*-So}Reqy;#z!R;x-G3bARop!w8K-uwhE_?UD>SVu zoImxsZU^o!Dh+`+%h;)1d&@Vl(M>1WR4OFugPJ$(^t+&!XsQt!9MW7@C5jJ&FcEI8 zEGXhgT|`8@QIOLkn*1B7(SDNk$>B682_fGXfN%DsD>exIg%@rcRCSPUk}05Rtj}ps zoBl)gc54tPeL(R#V?##@>Hw)dV>~XN2&!IO&{WSJ@0=AdQo6v0?q+_AS;XAU{w8nt zi16M;89%CQ9uQ9XmeYq^AgV$7<-BIxcv-FOGtsEjIg#kBL8Rl8vZciFAlX^-g0#d@ ztbK7+aEy8WbT=gFnYjP=&syKA-dry}9^jc3uE_sRn`E#(bFzAwVUBWrz-__G$2bVR zcP~C(Q5=_(i)rujnpX&_kJFY1)t6E8VTt-nfZD~Y%?&Ao2f!#@2A{q&H}wvhxU@^SIYaLv)p7)BErY2AXKX*SWE~ zA#XVz>rql#5U0TWa-oO!F4hg#ijQ+^&dX;AY<6uUxjJVv_XMw|Lo%-1BU0U|_^XCA z9UKv74Wu#63V5$X4W)d8;RynAUf(kI^BRWji}nN`ZFq~6Qu4g#nM&Gm;9hsJhlh=v zcLzCSvBWPvG$)l)(iSt;Q?#5G`Vt%Ve6aj8YUpQE?!Zx`HK;n76;N_c{@;j z%$H=PZLZkcyc^oae_8zM8|>`toez z>8DZ-!@ZmpOk$7(W8wKNdAxZxL~b0fUNh>*N_MBnzI`y_BBD1yRYw&lb6 zU=w-FZv@_&c2n^E5GS5s()BVi;k`o_+D8Ofb<4hbcJH2P9etfX5kj)Rkkq3u?0X_s zdN0Jmu1a$Z8dX&$5b*eL=6cY%RJmwKbt6~mX{xwL3Ftd9cg$3Lb|-2C)A3ZYz;w)} zj_!MOp0^PlChw^EpOm}l{95@)zTt!k8p904?GYx~ZrziJR)au;or6Oyx3(P9-N%}J zUE8Z}9*~fOwgwfOY&n0VY8mJdcbOOi<$5l*Rtx^Vh;%U|w`!rnbB*CV%;UBD2G7xq z=+2T}WObWVSqoldIE?pciF5E5<@p!dT^IP8f7&FWi|{Zh?D&rO6g123TeN&L!ouE^ z7h$0?@qzmp=PYY{K4}bt#OKbGA~`{pf7$$OtoQB($HH^=55M-RdYNfEa%V%i1$k%- zL8B9hQ&iQ!&AnjTV)t($cWocr+M6HtU}nj;Au!;A3T?huim|19$dL69oF)<^_g+6$ zFJu=`UoaRjoTXjO5*y6smbW5Hm9eo^u(lWYOuQIw2xO>NoqDF%mFl`DE)v3|D5`^;j z_{^l)kEbuIfK2Db2~^-Xph7d_VeJoEDt_2U5+&0*O~pShhuLP z0|{;K2S(hd1#zM}A1#y0qzVC>R?ceIb_K_DMd=TX;k`&)4s~Vj=47`^^I@fU`5a%a zwbP5c>U%Pl<}Gc?T*Z}$r`g5#hPj!lkak~Ufn*J#r)TyJ3d!dEQeFOVtgWSM{AUrI ztlY;EWnt46<3iirh4jy2L4liR`c=zRzaW3P>#soL4>8=<*^-wX*TVsafw>=*)~g9oFUfU}sDlgLM*g|NxTUbMW> zGc)@ZP__KzsrMInSd3{xSQ}oeO2%69v_2df+}A=Ug?T-ft7djT3Ln~P)uPEZN7+T= zCe#(^@o6)o**xzcIX+=9i2J38D_WG!IK5StUjn?kp)ms-PoC9_lSZG`B?d}ZsH4fB znz|up!SwBC$i-zZ{@}N?yj`e+tqM8eS;J z|39;r7p^zwITK`IP13Y4mfsEqJc$xpeCztp#&=4;Oscq-src$nu?NKe#vn`iDR)g6 z=l2Nq2V4ON$SL7&BI%SWzk>&Tq|jXXAq%igq4}q@(0`wqm$e6c&%e12+#Ix;o~~~r zGSi$$qCSM%7?$%>$ayJIVHs0_aqr9`VqlAOx*2Em9a1Ic;xtmqnalT zbraY*`{i3G$-8LqPN$Gp*pC2rMmrKTm5iPTOVl4s)GDIOl%4UOXZ+?r^%$PX*H4_m z;7ayof>8m%J*1l9G1wsXQYb7d+#EEiTSAZ~&JKE=18PF0VW(x01MlearQhwqVzy8j z1SNw`A~E1Toqgts8llhq#jqsxh$~XqYxOWSFgW_1o2tC4U5!fc{~;pHe|m}YTfHRx z8}MIFlD&UcRAY-f>ziys+KjvU%B##(UIJh1p27a-s&!N23E|;3++}=>%&Wh><3B+? zpY#8iqJle<72`u~s)vx5dc1I&$VKa}i{~jjzVwif4s3^Wbz(?`+sk>}vSdBW$XPTw z?^yxN#LFXNvU=Y&sC8GDC=vT3?ov6>ZHDI|W#=$-+B}Uo|Crz`zG-Lh#YFx#7L!j@ z`1M@$19sl%JIocHH&Xe*TQQXdv>v>t3$d#QrF_fArB5<2-aw+s#&f zH`So^dumz?2{Ew>)#v+D{(qDTkJ2IgR$1bKmsEE@ zy%*7r7U@#&R>!hWet1ouWx)27?j%6nCyxXKo;v*h_-e>D~5Q;F!D~^bcDp%8D z*>5ISeToX7bnWZ*NUi8vR`$wo?V{|N6NK0F2Orka9~mES= zCNFl9E4C(GtY>k7sXEeFur8u}T<2mmQob?`A69|`r6 z214{!polL$^0!vXFQ!`5Idb-Hg~kzrcVf)en6V&{<2Lsen1`S52af!Gerl@PbW=ZlcD2UM zkJ)oneY>C4%9yk=*x?l(?X{mTT>hyRZT?}3EZFR6eX;FS26+b^oM1d|++y9~mkfC< zYxv5j-6hJ#@D@kj@lcS^-!B)AMPv)B6R3K@F}mv4(qEZt5Hme@2yphEZ)n^N?GGBH($lAYY!$-Pxr2akD##cq$Cro>T_LSMd%CU2 z-fex!MxAtPH_Yws>7B*KXtRo;cfyFGs z=JIwr3nU2^`$29E?MH8Iho{p zQ9Miq*KAQ9aN`>*r+1N1Pf6ut_lMOLC+KdfeT9P;ODhdw_*htP$19ZCsq+D!sshKr z_zBQz}eY*iB_w|U%u+g(2E?4dWKJfmolvwq{q5cln(G{S3@azp&>j9t(f<`9ZT17FJf-KYW~%k;R}|r(<{6EWSa;_ z-U#mcdvGN1Rx*%ucyyuE0o%_PE2G+KhypVH-KT?R8%9fa> zaU(tE5rcT$(y4-lZPqulb}$$*1gb}&lR#|6fUMi&{+WUUHDi4C+KsYB{lc-5azF4% zTgYSE@`H(EaW8EyOHhLH!Rfg~bi}~^-k-G>dN#K36iNV7<%9@22hs0WKc(q$4`xvn zjw5Zs`%HC5;H_g~Xn;0E$jyaCxrnIgFSu3thS%chBr1q7T1`VBxv*Wbve$W+E|a7; ziFX6sa`s)zvD+xs?6`BBqrs6<+6&m(J4umY+G1zQ4F;;9dFI7DM#cf6UY!Q05fb*-qn0n%=gT;36BJ?~taKbr0jI z#J|NIiS`CJ`M4Vux`O-LkFcvrE(Qm7M z!u2b6QlaOq4rnZp+=;Zq$obW(7nH+i;jk6O&}@6nhI;V$F|SFua@l4Mc+Pz_1ZZJM z1g;&h2&84yJRSpvy=*3)h8{^>pptVE@73S=I&Ps!!%|EW*trD=gd=Qh)uNP>HAl{- zYx){@S+-J^&AGS*{{dLfp(smWv4|%6j7>axjgfo)HJdce^c!UJ-)x?0Rs|N@TDIHJ zUcdD3ypBh?;gLQO?Bc*<#}$7U9?POlccql+ZP{E2M*xVBz~_mCVzix? zF(cFK7?wi6!mSyC6NXmpVt$EDQ9!yMFou*-@OxalzxjSybcgW{a1aqO`2}zl1ezL) z9errGq06@}IeoLVEpb!WFu21(`#%5c?a_%0yBNcS%W(*^IE9*~8+(Eq*H8C=D9Gxs z!~7?3C^`8GuY2>GevOq`L)_^hwFzWpg=7b!!jL&NRx~Kc=3~Ve^KarwLEamG|4y#V zSI7y*$P@XQw@f#8Xpy)&A5CH3IFCTc~3 zvkfB#5+K5sHe^?;UK;WM^jRJ25>VMH_P(Z z3MZ1XObYGV#RS31eq!)#{HFiWcBZg)kIz$RJ3-E`C_q=-vnZC;$9XA#RN35Ed(b-| zoWHKZ#OJI4JSsD_1Wy^gDc$Nnb}Rzj|E`hL*qf)*zLm84LOP2r2G3ojhYi^rx^NP~ z$FX+aeq2%SKhCrmyB=x7-(KhW2ATxw`blP#uD7`d|LTV<3Jjs%KHc;)q*G84!0V>E>GLM%V;&3^jzZ}AVIU0W~pk=!+2abzZg{71NVcC3Zp-9%JXm9WflGOl4v1PAOu zVu~)k?e8~)?;a5j{R2fD;qa94{^D0R!!)B4xtTjZ4k8=&FGgN*wDu_gXtJ@>fyNHb z7{_mv1a8m=Nc%Eb3J{PJGa_jFVp(*n6>Bk)GUu+ZCcV~8LJE4v%RV#7+f&2c10H zV0WK60%JUFLwp$sbITA+Y~QNIJ)lQN{Kk6{O89u;Rb5l6oi+e1_9?hI*xBw~0*sY>w^eVk-X!NvL$UjGB1X)|-u$OmJM$sA z>=!DqOYUHoR%>7|Jw1?NG5@^N?6#cJjCy&oe!&>f^%GQK0Pjjwt)ZgF5FnH8O}!Ml z1Mu*U&JrZebGjWK*u9*MtNZho^1b*c*1z&ahDmtJH3-l|@Sz@ZVvIms;&sny(Co8m zXY)7?wWLfDNC-Gb0E6Adn0h$q+j)Cqxl0GSpFm4pe<_P$NKzbccC7bs3~1jJu!dTc zT9(l&vi!>Cz1(QAahRus(s`!baKzb2&ymh;Z)D6i_Oj*PnHErUU0uCZS z<|7#w#c$hzM9ogASkz*D@k_4B+`QgW`aUYXf*IKb`B?foVpU|fTn1VCjSpxMV!Anm z_^pa|iunh8xF;hFOuCm*`!^WH~zmtf#kF z>-_|yjU7tGTvSh&yIjiDEs3G0k1NgyYDB2Ns`>UPZJYEtelQu%b9sw*pMaSfs9~AC zAG6^ylY&>zMuz)l8+^y=93}iFBP1~Bn1qOFz}kiz)5Qgp5ib1J?mi|anbu_pdi+hpyn2{0w zDipN)Kpt}I6Cv_Vr~QEQ3z}bN$f|QjofxPdUf1W!``_2Cj>Q)S`w2ve$YxR|tZs1` zN`?2OucWRYue?dW)Ksm5xp(p2;@zsYi)qw*lJf_C=w%~E>2JHbypQ(50oJEM9u3fQ;QEq2BNLDh5Z^N&Vt0w%W!zx(Gt_f1j}rvgXAsv?d-?d7AmWSBsPJ_3Tml za`68|J>i5j7Wk&+H^s+sQs+JgeAkCJx}t| z4|xNH?I@YO`)<#XnUyId%gOs<9reTRSPUiE{PHD=i4Uyj?G2OJ`-8dG+iL0+Rq3UY zo|l;i$HB^yKM8t3LC!7uC?KWy+H_~MllsIj-jTjYbl^f;-OG81MKKH#J;VXNTETD( z$5hvu_a(`$^Ad(jk7<5FX+pz|MZn6tAz@m=3<(-DN7Z5!M!wD~R5cyK@_al_>^K0q z?}?Bs$GS=W@EA&Kz8({!_|ZvR(eRUk36vQ9_rp;EGECgimTC|F+D+aaea{IIza=IL zvf4Aw+kZ}Y|ITKh^5>4R(}cB-5a0D()%uQ{m$hJ*ByNA%lHnnOk%7#tnEt%ci{fU@ zgyAMb_1V*!e@~qu|4)6bmyzd+w)BE(fV+8_$Ju9(1aF$8DWh0OUEgpJ(`A(7qy>b> zoCe9m?tLaPTwB%G9+5_Y8K5dF{kPd|c`KLr*1*cgeX7O|j47-1pGkab{pp~yDq{WS z*Av5PWn`GwR4X{upJiczT|X%!@VYz;ZD)m72zI1%-Iwe^*AALKw)?jul;7aM*Wn*x zoXvYG!e)eb+K7N$6-BZd3y>*{4x9*a?2zZd+|oWbJAKWk@B7z9*V43&IF4^Q*g>q@G1x0dA)DKw$gRvqvt=sO z-xT{Ef-tdQamy}QFhU?M?B^IG1)17X-ew0VlR1}IHr~%TM{ebjv=cCkzrD4h2NuPk z^KD08;W_H8q|+NK_Pfzv-$Q}W@?80)rhYatmHhO9xWNolj?u z1E08mKgMPc7M}8r2hoe<{WM6^;ygHT{+FTsBc;IDBvaqx0nPqu!L4~NhC)ou9%#|G z7N@S=oKSQ&Uc3W6E@#-V;K{MXx8^NsVWuASwBV?y$1%lqo+5E<0HvyrbMekOf}aD7 z0WM?6#TYn7NLl!+lstw0w5H=N$4s9glnDEVvK1Y|HR$2(T$mm{0L^9(imbP;TNY}r zCic-GnLHi2zIKmj!op*4!J-N|BrH6H&>HHAY_Nb|y3Xt?No^7oet;mYa0X}@Lwq+9 zVHo<6q=$xl`XJ*;QnR1e$lINJIUkoJVa(!*w@X?}P801yD}NL*d7nSUYx(a$rgQhV zCgm*3Bv5h$kd1R>jFEv{eJl6#?VVBLYbtrOCWPpfMT>=L#H!wZGsy^fB1WjTWlitZ zvw3%BFL7e!%GR|)O7~q)__JPYfHLBE=A@sCF?$PBhEBk8?}-3y>dk?#*5ueQL05e2T;Ii2v`GX!$HTavgA16k1&W1}C~h?1i4&82^~} zi=4Ui$*<(Q88D3JFTY{?FM&s_B5FmK#ifsG$4PA3`dHInH+MlL5`xeQu1=Mx1~+j! zb_5LEg2Uf|K4yUDJ+4~uNcVoyw&%#Z5$nfC94$czPCmO~>z%-le4m-r8?JIvtbcGU z+U12s8gk#Yff%1ZxwbEoW?4d76qBV7ZNW&ZRXrh3e(Ed| z2tGGKy}9`1_+qGXH!?c{q?3kf(ZJiX3t12#NVD0rQ8&N(dP+}&LXuETywh6Lg!|$4 zy|?$x)kkGxIh14{+(&9H$MkiLro5KfG`bADp9Tqx?JhxyqiqdyKz&pWB@ONY=UUdu zVfARH-dNdO27|-Z(yY`}HTe57<(!{aBh9S*XZJIqthJ|68O;1*4x<;K%o`{%Hqg^plQ$t=HkOyl_34) zL`;KJ^(&{p`&~#ige+c3Kln0?fbpLKW9Hs@R;KoU-#G$}R?|l}(hFBJe>WvOVlWza zW;i;LLGMXcLLr(knp1(4uGyXMCxEI_tW5?9|+**1@)7v22$_*&Oe=mN={Ita24;p~s^ zMtvgtKQw#lMJK~F1VTI6l%`l29Dd% zavtUYQSCIY%2NiL0U^{OU>F)bOy*75w^*}TRbPN1f8`cq28*}thlcze1E+5xg17U= z(bA&v{#0bO77GZ{*a>cp15~g+p#5hSwVi4ralpSa>Newhk%1$1YO?C8;I7`^E3&xT{N`mb_Kv9VI|aMKh;B(gIV zVtRYu9MrLRseLgBS}5vfO#APn9_6mTnH@TUGn0NF0O{)>C=T(^QvrbBWHq-k%#|MM z<=NXx0|vjWi(i8BZIVFPTJmo(4)_W>XkZtTQ{L(~$Lq49rCJGHq5hktM8KfzcN}XX?)*v}DG_;w< zofb~MKw?g6VK!atmtXzuJku&VvPnOD|H>%DVf(u*Qj;9OeooST)({y>^M9Wg=9GXj z{rQpFZzAovTi9F+Fn4EK>W4^*mJ(|`PF6)74e+hR8*z;AR9HuC@HvvVKhwXP=++Jg z<{3{`6_dlNQs=RWRbGKRU$}AZ2LU40Is?#v^JqmSqMk+sU-F{7p`KpMmX(Kb&C@Bj z=avU0lz>9*36!0QmATVrs?W>gKmkhUUi3k!Eimj#HJ(kry7(EAg|9lYVl3#Vi6VD0Ex@E)*xflJVlu!t}ix$?)}^yQ z15J(M29bmEpC64T8~m+a===m44t#SFe2;-4HxFCCdJSuB3JqTs`)|THOjuyGIca6P zl^h(Ojrr{tACHRA^Bkk*%7bY5CUiFo<6@n@VE$SF`)wT5^)vig6t}cR;_tr3li<8u z6N8!BU27VgH}PTZv=t82B<~2GfI>SEBoJQ_Vu6uCVH=PMVy-+lX>fS5xR5zhw=+Z} zHCl59w95fIiXBvR;70YXatQVeHoNBx#PRw4HU@r2pfQkb!(E&cWhS5!j4>^fMGBDv zh(LyY6{x}0tO+#FWuuS_*ocnvLq!?WKSjrmu#OIw&TgoO?pjOi8*fg1$L;HV+Y zo*zYRKeF#>M)|hqIKB_AQ-RCa2}M1!<6+Lxy}gvK3RIKs3ywevC+38LG$}cpieYc}S>4}H62Xr*&8TP!LRzO#8xP}o0 zQr~&_P-u{H8SyGyCBmD>(a>q5XnC<|IJvl?98SR$5K=U{lpvCvIXE=%h}!(h9RcU!fGTh|<+3oR{=0%=sl{N%FG8v!xYL2S zVdzm`r%8(Q$SiMimZ%#OPR^z4Z(2x`+$qkr5MH|p z15dymCr-wylntyLma?d5xz}2?c3-Do&18@9bZXJ8d)fGVL%o1G=LKL5fC6C7`P|!P z&f5F=9?lY4tG!g!PVBk~#7r3n$Q|@-^G(ZQ5&<^LFd1RIR(jquq>y^%(HOG;F(eXH z5jE%t@z%e#T3q-_yXG({Sxdm8o?#|TJY;qoJ*`rDZeu0*YROpU_*P|Jt^MNdoc&*W z-}%_c=)7 zWuUI@X8|6ClXTVKczE(8 z2?6$m)nAS#fbzBO7OuxSTZXLiP8i~Y=ccQjw$jd+3ZZHO(w;L1vO_4Y z&Tff`oRn&h;52EmW?NO-H@6t0U0X9;(Pg&F8Bx_T0F=4uiZT~b%L)>Mv;ywU6;(8W z2oYHosMPV7xbU&bP5ZS4Nst!jf;sh^5H6biu=)YOpT#SeffC$fuIc}knt&S~+@@ET znltTpf1Azy#18qt3S^NgpZ{uhtc@S3D&*Ebi?}S5JNV+kSgZ<(bXI=_YTh;nOLJ zaP1w!-{3Ur%b>*Oeszuouxb(UxYM!-F`mz1CBJ4m8GQhIM_(!%Icfpr;pdfsq9*006T9(d68h`pwRJ z_%t4kNLJHi`v?XW)yQZ2^H87t$tqCr7LX=h8vpG!6SJtOFtd}XFL0ONCL+;tz;~69 z^Sx$AQxY?Vn$>Y?diD81;9oAX=Y+4j1IcltgSLQ8n^pX&2$`xJ-?jG^l5=z)V5k>Z zP+6tnrg<8OL(Jx){8jGD{c5%eMz2ixMU6dNOB2+7D)Y1sS}XCuv`!_v?z}2)4y^=7 z@c9|-_mV(zx|r#bbH&`5=V~5H=|SmcHhF8a8slUcidc$>;gWAyeFJj(3~rrUzZCJ} zDvQoDIA99qcOZXD*W7=kmZxlFWeyINX`mQNi@}3QIL%?-MhrB)(D@Un1C!#UbCnEW z5qR0I^{07KNQobh`s%;oeoJDPv%K@h|MV zKxD)Nk1COjblP*rFk0EuZxxw=e`i0fEypX~x;7{A#^@Zy^{)DDo(u?Gll2>CtsYo_ zwBko6cVp3wyWoH%D_;J-rBrk(w7)L5<*g?NrPleAVlwCk0+K&W?y|>66@9Mm=N{)M5Yf%%p7p_H(_u zDAPHo9EwcyS=jxKE94*!bbKFF%X!Z76AE=#pb)?HRdfYJ& zUEj}$QFsyYqBx6CQ~$HkYf9)yD7P{Yl{z z*Pr4W+}{Blp+m8fu273J z0n;|QOu`A8&451p)3tr^yG`3k&>m(ZH4-eh`BRz`sjq@|fIoaSnYsd24#hncyihlz zbm2_+ObTRLgw0sXQ&$J38CSdY=o2V!&yh|#dSc4Ko;K9iQYm8;N}UYZ?gDPC@KZR? zTX(iVE%sypj=;v8rh{YN6wfOVtC!+;Zcw846zIiZQCyh0rU=4OT>$PDd$ErP&wv=PGuh)Jiv6&XHmH}* zY+xpTDYin9F|s{zI#vQGIC#wqUVgb!Twwx{bw!M}Tpqnr%B3mmaf1}I^2NIwIa_+i zTVDg>ef_rHo^c}}A-5TB%{+5F%iO|q;R48N$Y-{=cmf3FV=V^a&QgcIH3S&=b$hIr zLb3Hf>s<5N0yyQ{BXPXT$kJt_S1(F}Z1k zDp#@pX%6p`Gd9TH@M(J~E=%a6_l4x8op4;ai58~j-e zjd7{=6Y`fGPJFswVe zOcrk6R2z7#b9}Jhl%0LNS9ny2CwqD{Z}(cwDkcYb|>m**{N`x*!F%<&#+ktpk#u!izTG32X{N#&@F=exwyuM_RlacMfn z=66VdFxVA z0|Gf(`|rN7Ec~P==_w_OSxU-b$jxP@hG@{;&QkLecK3Cxp{5L!cF_w zTE(R=EYMe1WBxH^z;1*e@>zwQ{@_hYTSx;(Q-OT%*<@~9FfMr2Q+D}aF(lY+zyDxS z!@rV&_6a@!EMGP?evzkJ@Q0ik$6G5bU}U?Z*cstlMm# zZK{EU-|!c7Jt(VNotPkQ9T_-P@9ef!*qg`l4`rAlfTUfe-#ZwoP{E72pp8jK&T`89 z^J4}_+A|zUo+Q-QJ;mh=?_$=nLpEM-7Xfjw@vlLrOO)&J!?T3=y)%?xNs2F~>I^#= zkvzm`7VzAbg05yzY%jEFf`)G*O@&fj*Jd*{$vwRqqjE?hrF;FQ9wvRGG~V2a|M7_c zA;`3(<}?JNc%`h`7|M$i?vR7JYWB*iU2FYKqg8YsuXeq+3JiF*UpR&io|1ca@o2d1 z=kHAyX$!7vF78>({GRgvK8k_s)F2|5COOU=Ee-vtz9veNM-p>RUlioYy<{)F+S_Cl z98wv)+P1re!-v_@mMyTKb}?h^!P|Stdh57g@04sUYqmVt=!w&iUr<&0Y<#lhO0Y=; zILldNIz!LdmzR`BUA&HpRq%f(%acET;h;;C7{T40v%!Pm7tr28^S=-5d9hABp3J&6 z11zNvPI5%ChWa-_l(m&M$#T41H%hQiIvB4-T@eJ05M(ki!G{gO$2x1XG>z-WKM`Kr zY<*bk!)a&b>j_^=I#h+ao&eQJ#dgXIzPYUcc`$?$2=dI+~5CdQKet$4g-ywLM~EV;9k?2Bl%q!v))ug+yX@SpK%I=oVMb%F~uj!k$k! zes2e*<+4(olbL3E6U+w+=JQ$CAj{tG_A6no>>p^&3U|frDQog`qp9?9d}YSQk&U?0 zbEH?$&b;dVgXOTGn(Xwv&@86Hy4ntfWQ|0vs}W_ZpV>O>40`SS9*eyaF1%N0&b-vg zL3S@s*GOcn*c4~ZpP$DEDm-X0HNHo{hK;9M55@Nd)RkYX`W+WMcvwNy-^y-TI@&~sH2d6BSbB(qJ#{y+Tn3gixz2?@HcmY!;pSi0 z!d=}8{A;f}72c5f;Y~g8#nd8$TX1y&xF(+pj@qNH(Y>wOqgStA2`5~l3RVqHCaWqZ z*ANP%_<>G+hB91&e5R6?;5Efxe6SqQ2jX9iW5eHwYN18z1A&~ zlT8P5?3PpSIYQ@c!a{7Vsk2$kfg(ufLiH3D{f*CS(N~y}2C<{nPb5}-1#cS-oExhe zB}w|;c--P^ly=!V^4)G~LM*X)#;;l{^>p`f z5ED?(?x`TOF@csDrKy=ZsdZP2vxLsES`5BXU?2bY4b#CoZzOboIm^O*Lx{N$QENi%DcbnT>_|UBm3C-Hw9a*i_PqUkSV1o5eYNTi!fx~Cpt<4-|`M_i1QkbVg) zU@Zs2#V8LZ+S07}WWDY7BK0-Prv2SWpIL)?g*5dJ^NovwxtG+1lODY)pR&9^ z@hNm54#5>LNBXTZz>eiRv=wwcQvBYQO@&t|5>{q+)|e)BphjQI`IMFft(H1G?$@P_ zUv+AWPlZ7sKzSiM5tN%H9-(`~(OS%B`&F+-oPBBRRiD>|3Z#9Jo#%!wDG}rMG1|vC zbjZOUq|8r!44L@pdiHx$vS@zD02eD-PBJhLrk?)99Tym67Xy!3WWLj``C)XplPxBy zlJPq6jUPO=`u)2&=Cip{?Xa@ZyelqCvulSn3PAN=Jn&O@*LfWse#hTSoPQ+T9fph$G`qth(TViOHw zy`R!WlWI6*oiIqerCWJC)OHS~sSxz6ycYTW`|l4N^^U;!Ca7eLqlOX`*5#t+JsY>9 zA611|M*9?lh9Sin5Xb{y;idyLqqS(UQP<4KK^eoly-%d^B{2K?YTiIALV!$bIkCQv z7NQu~VEir*mBm!wrQSHfm?_TX6wVf3Z7YeT(g^Uws`8+4yBY=X%|+O2)v&<-TNA)V?nHr~W_5yEjjQ;dE)J8Jvm zbB?2O%YqYR+*X%!;>Fi^#k~ifWtM4lenEH)pDlk}mqsAPOz}b>+yI%UPf@c{>R9Gt zzmApZnf@Is`h=;d{+u5D|*#N*%C_B#89CYY}ip1IYQ*2 zk&H|4a-ghar>hHQRqlPc0fwCFE+2lo;sUZtPHQAjJw?l7d7dbaU|lzO54*hiqp8~b z!|;;LkYQKi;7VAd@Wu zvm2Bqoy#umBfTgIW4jt|!$;58{K%P{TD-9ia0ecp0%idTjKqDSmMvl4zpM;@0`dZ| z+|Sh5N{v`)V=^ML6V}z)5l3)Q5Gh`2(Ayq#y<6d~EY9Auj8YWtmJnT#xLf?2o6B!& zpnWSY_3K10i2{t)99CQ2tzft;eK=4M6EoRN3{to1;8_luUw)fVg|@eLD6gp%SvI~_ z_b5i|Lt0Znlu+$Xy0^(4Gl{4uC`bBkfrT7D9$E6*het=Ax!(NrZ6{R+T!h+TktwgC z1~$hrrPDN9sF>(EC*|O5G{AVJU*t0N=d8?I*$Q>O^E_`El45-MFxpdF==cs*#qW8O z-*xnFs`7e7ATuI*YB*%7;G=|KB$URV{j+_hg-OSRqg<+y9F+gQobNCY>aN2ZRmfhi z4(sVgE6EEBuzY+F>tkmrhFGcQ&~o2T3Km<)T@GFO94}n@Q{>m1e|9?T&;HM>Otr5nr1I|^nz)Qy&osl zFX=~-^L*V;djT&tzx1m`&T>f&%zS-si<&J*5vD~$saR7F4;xGDe@4HKR6-dp^@m6M zxXM3Nlb?rWU7Itw5FN!zOYzRDWo4dE5$acXhJd9Qd&*mMsIxTOWAylVl70D+8b`(> zH@4D$Pa|~89q>JoA-RdB^nA zKiJ1Jn=DCUJuI-;ob{iGqYPZKNM=Zq`Vv`_7uhV^Acl4od1=iUT5C}7m##}>G+;{~ z{;4LjL;jN`i1I0fOOL)Vu<6?J=rWPQd$@0-WSjK`5jt+azS}H}T87n{( zOZ0?OvG&Hj4weQE)_wdH7nJT6x50fL9`_SRWdA5k-EqJ1wkXzhC6AI`P**EMa{gQ2 zKI@#Q)5*Ck)=CPZIJ=f`_ta}Y?>dfHmiZK8xF|C}MWirmfZ|%1#p3#f12lL%OPs1ZiX=kZj_KeH@BrFLr@mD4gEf;nDB@MCY$3id9 zJ5<*SY!?Mf+$|c29{Wl|u(eyHMw!=}dn7Sbrqn63-y#U}LH@J2pCxso6~?Srp%ilQk=y? z?NI117L`khGC{~=JE9rjVxZ1KE#oa6FnjWY(|#YqB_6%JSW|xL+R)4Mu2^4eY87IM zqF{F2X?&^Aii}WW*K!dpac?>J3KOx2_A^+#27!bSkKfPTqDG#C&&AaSesR)` z6&TMGfZo$bv*tAY3j&#>b5{CTqcbxwUTgy|0DXK81_Y8mrj_V68jSy4=6`FWIZc;@ k|H;k&l;QsyP#pC^Sn8kV)o Date: Thu, 9 Mar 2023 21:00:45 -0500 Subject: [PATCH 2/2] auth fixes, ran prisma migration --- README.md | 11 ++ pages/api/auth/[...nextauth].ts | 1 - pages/api/generate.ts | 4 +- pages/api/remaining.ts | 15 ++- pages/dream.tsx | 111 ++++++++---------- .../20230310013453_initial/migration.sql | 66 +++++++++++ prisma/migrations/migration_lock.toml | 3 + 7 files changed, 143 insertions(+), 68 deletions(-) create mode 100644 prisma/migrations/20230310013453_initial/migration.sql create mode 100644 prisma/migrations/migration_lock.toml diff --git a/README.md b/README.md index c322e821..9c2f905a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +## Todos left for auth + +- test it on deployment URL, make sure reset time is real +- roll it out to prod with instant rollback + # [roomGPT.io](https://roomGPT.io) This project generates new designs of your room with AI. @@ -46,6 +51,12 @@ npm run dev 1. Use `openssl rand -base64 32` to generate NEXTAUTH_SECRET 2. Add DB URL and SHADOW DB URL from Neon +3. Create a new project in console.cloud.google.com +4. Click configure consent screen in API credentials page and click external +5. Add an app name, do not upload logo, add authorized domain +6. Publish app +7. Create credentials -> Oauth client ID +8. Run npx prisma db push && prisma migrate dev && prisma generate ## One-Click Deploy diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 45963e51..b2d47412 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -4,7 +4,6 @@ import { PrismaAdapter } from "@next-auth/prisma-adapter"; import prisma from "../../../lib/prismadb"; export const authOptions: NextAuthOptions = { - debug: true, adapter: PrismaAdapter(prisma), providers: [ GoogleProvider({ diff --git a/pages/api/generate.ts b/pages/api/generate.ts index 8d676734..1105ef7e 100644 --- a/pages/api/generate.ts +++ b/pages/api/generate.ts @@ -19,11 +19,11 @@ interface ExtendedNextApiRequest extends NextApiRequest { }; } -// Create a new ratelimiter, that allows 3 requests per 24 hours +// Create a new ratelimiter, that allows 5 requests per 24 hours const ratelimit = redis ? new Ratelimit({ redis: redis, - limiter: Ratelimit.fixedWindow(3, "1440 m"), + limiter: Ratelimit.fixedWindow(5, "1440 m"), analytics: true, }) : undefined; diff --git a/pages/api/remaining.ts b/pages/api/remaining.ts index 667a9cd4..9301ebba 100644 --- a/pages/api/remaining.ts +++ b/pages/api/remaining.ts @@ -21,11 +21,18 @@ export default async function handler( const usedGenerations = (await redis?.get(`@upstash/ratelimit:${identifier!}:${bucket}`)) || 0; - // it can return null and it also returns the number of generations the user has done, not the number they have left - - // TODO: Move this using date-fns on the client-side + // Move this using date-fns on the client-side const resetDate = new Date(); - resetDate.setHours(19, 0, 0, 0); + // Check if the current time is before 7pm EST + if (resetDate.getUTCHours() < 23) { + // 23 is equivalent to 7pm EST in UTC + // If before 7pm EST, set the time to 7pm EST + resetDate.setUTCHours(19, 0, 0, 0); + } else { + // If after 7pm EST, add one day and set the time to 7pm EST + resetDate.setDate(resetDate.getDate() + 1); // Add one day + resetDate.setUTCHours(19, 0, 0, 0); + } const diff = Math.abs(resetDate.getTime() - new Date().getTime()); const hours = Math.floor(diff / 1000 / 60 / 60); const minutes = Math.floor(diff / 1000 / 60) - hours * 60; diff --git a/pages/dream.tsx b/pages/dream.tsx index f5579ee3..4e1da8ec 100644 --- a/pages/dream.tsx +++ b/pages/dream.tsx @@ -80,7 +80,7 @@ const Home: NextPage = () => { ); async function generatePhoto(fileUrl: string) { - await new Promise((resolve) => setTimeout(resolve, 200)); // TODO: See if I even need this + await new Promise((resolve) => setTimeout(resolve, 200)); setLoading(true); const res = await fetch("/api/generate", { method: "POST", @@ -95,6 +95,7 @@ const Home: NextPage = () => { if (res.status !== 200) { setError(response as any); } else { + mutate(); const rooms = (JSON.parse(localStorage.getItem("rooms") || "[]") as string[]) || []; rooms.push(response.id); @@ -114,44 +115,70 @@ const Home: NextPage = () => {

- Subscribe to my newsletter to - learn how I built roomGPT + 728,000 rooms generated and + counting

Generate your dream room

- {status === "authenticated" && data && ( -

+ {status === "authenticated" && data && !restoredImage && ( +

You have{" "} - + {data.remainingGenerations} generations {" "} left today. Your generation {Number(data.remainingGenerations) > 1 ? "s" : ""} will renew in{" "} - + {data.hours} hours and {data.minutes} minutes.

)} - {/* {!restoredImage && ( -

- Note: We're - temporarily{" "} - - limiting generations to 3 per day - {" "} - because of high traffic. -

- )} */} - {!restoredImage && ( + {restoredImage && ( +
+ Here's your remodeled {room.toLowerCase()} in the{" "} + {theme.toLowerCase()} theme!{" "} +
+ )} +
+ setSideBySide(newVal)} + /> +
+ {restoredLoaded && sideBySide && ( + + )} + {status === "loading" ? ( +
+ +
+ ) : status === "authenticated" && !originalPhoto ? ( <>
@@ -204,53 +231,15 @@ const Home: NextPage = () => {

+ - )} - {restoredImage && ( -
- Here's your remodeled {room.toLowerCase()} in the{" "} - {theme.toLowerCase()} theme!{" "} -
- )} -
- setSideBySide(newVal)} - /> -
- {restoredLoaded && sideBySide && ( - - )} - {status === "loading" ? ( -
- -
- ) : status === "authenticated" && !originalPhoto ? ( - ) : ( !originalPhoto && (
-
+
Sign in below with Google to create a free account and - restore your photos today. You will be able to restore 5 - photos per day for free. + redesign your room today. You will be able to do 5 + redesigns per day for free.