From 40fe51cc8ab617337949d365b3769dd1889aab0d Mon Sep 17 00:00:00 2001 From: ALWIN AJI <110730876+AKA717@users.noreply.github.com> Date: Tue, 7 Nov 2023 11:44:40 +0530 Subject: [PATCH 01/35] Delete tests directory --- tests/README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 tests/README.md diff --git a/tests/README.md b/tests/README.md deleted file mode 100644 index 9510d18da..000000000 --- a/tests/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Tests -Add the test files here. From 68931888f81ce5e087c26b0cd2d310253227ed42 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Tue, 7 Nov 2023 12:05:33 +0530 Subject: [PATCH 02/35] initial setup done --- .gitignore | 28 + back-end/package-lock.json | 1961 ++++++++++++++++ back-end/package.json | 23 + back-end/server.js | 0 front-end/.eslintrc.cjs | 20 + front-end/README.md | 8 + front-end/index.html | 13 + front-end/package-lock.json | 3827 ++++++++++++++++++++++++++++++++ front-end/package.json | 26 + front-end/public/vite.svg | 1 + front-end/src/App.css | 42 + front-end/src/App.jsx | 35 + front-end/src/assets/react.svg | 1 + front-end/src/index.css | 69 + front-end/src/main.jsx | 10 + front-end/vite.config.js | 7 + 16 files changed, 6071 insertions(+) create mode 100644 .gitignore create mode 100644 back-end/package-lock.json create mode 100644 back-end/package.json create mode 100644 back-end/server.js create mode 100644 front-end/.eslintrc.cjs create mode 100644 front-end/README.md create mode 100644 front-end/index.html create mode 100644 front-end/package-lock.json create mode 100644 front-end/package.json create mode 100644 front-end/public/vite.svg create mode 100644 front-end/src/App.css create mode 100644 front-end/src/App.jsx create mode 100644 front-end/src/assets/react.svg create mode 100644 front-end/src/index.css create mode 100644 front-end/src/main.jsx create mode 100644 front-end/vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..8920654f3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +front-end/logs +front-end/*.log +front-end/npm-debug.log* +front-end/yarn-debug.log* +front-end/yarn-error.log* +front-end/pnpm-debug.log* +front-end/lerna-debug.log* + +front-end/node_modules +front-end/dist +front-end/dist-ssr +front-end/*.local + +# Editor directories and files +front-end/.vscode/* +front-end/!.vscode/extensions.json +front-end/.idea +front-end/.DS_Store +front-end/*.suo +front-end/*.ntvs* +front-end/*.njsproj +front-end/*.sln +front-end/*.sw? + +# server files +back-end/node_modules +bacl-end/package-lock.json \ No newline at end of file diff --git a/back-end/package-lock.json b/back-end/package-lock.json new file mode 100644 index 000000000..d2d741cf7 --- /dev/null +++ b/back-end/package-lock.json @@ -0,0 +1,1961 @@ +{ + "name": "back-end", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "back-end", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.0.1", + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "mongoose": "^7.3.1", + "multer": "^1.4.5-lts.1", + "nodemon": "^3.0.1" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/node": { + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.2.tgz", + "integrity": "sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/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==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "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/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/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==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, + "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/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mongodb": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.0.tgz", + "integrity": "sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==", + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.4.tgz", + "integrity": "sha512-kadPkS/f5iZJrrMxxOvSoOAErXmdnb28lMvHmuYgmV1ZQTpRqpp132PIPHkJMbG4OC2H0eSXYw/fNzYTH+LUcw==", + "dependencies": { + "bson": "^5.5.0", + "kareem": "2.5.1", + "mongodb": "5.9.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/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==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/back-end/package.json b/back-end/package.json new file mode 100644 index 000000000..8649feeaf --- /dev/null +++ b/back-end/package.json @@ -0,0 +1,23 @@ +{ + "name": "back-end", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "nodemon server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.0.1", + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "mongoose": "^7.3.1", + "multer": "^1.4.5-lts.1", + "nodemon": "^3.0.1" + } +} diff --git a/back-end/server.js b/back-end/server.js new file mode 100644 index 000000000..e69de29bb diff --git a/front-end/.eslintrc.cjs b/front-end/.eslintrc.cjs new file mode 100644 index 000000000..4dcb43901 --- /dev/null +++ b/front-end/.eslintrc.cjs @@ -0,0 +1,20 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/front-end/README.md b/front-end/README.md new file mode 100644 index 000000000..f768e33fc --- /dev/null +++ b/front-end/README.md @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/front-end/index.html b/front-end/index.html new file mode 100644 index 000000000..0c589eccd --- /dev/null +++ b/front-end/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git a/front-end/package-lock.json b/front-end/package-lock.json new file mode 100644 index 000000000..1e94a8747 --- /dev/null +++ b/front-end/package-lock.json @@ -0,0 +1,3827 @@ +{ + "name": "front-end", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "front-end", + "version": "0.0.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.3", + "eslint": "^8.45.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.36", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.36.tgz", + "integrity": "sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz", + "integrity": "sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "@types/babel__core": "^7.20.3", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "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==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", + "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.4.tgz", + "integrity": "sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "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==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/front-end/package.json b/front-end/package.json new file mode 100644 index 000000000..326321d15 --- /dev/null +++ b/front-end/package.json @@ -0,0 +1,26 @@ +{ + "name": "front-end", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.3", + "eslint": "^8.45.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "vite": "^4.4.5" + } +} diff --git a/front-end/public/vite.svg b/front-end/public/vite.svg new file mode 100644 index 000000000..e7b8dfb1b --- /dev/null +++ b/front-end/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front-end/src/App.css b/front-end/src/App.css new file mode 100644 index 000000000..b9d355df2 --- /dev/null +++ b/front-end/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/front-end/src/App.jsx b/front-end/src/App.jsx new file mode 100644 index 000000000..b8b8473a3 --- /dev/null +++ b/front-end/src/App.jsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> +
+ + Vite logo + + + React logo + +
+

Vite + React

+
+ +

+ Edit src/App.jsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/front-end/src/assets/react.svg b/front-end/src/assets/react.svg new file mode 100644 index 000000000..6c87de9bb --- /dev/null +++ b/front-end/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front-end/src/index.css b/front-end/src/index.css new file mode 100644 index 000000000..2c3fac689 --- /dev/null +++ b/front-end/src/index.css @@ -0,0 +1,69 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/front-end/src/main.jsx b/front-end/src/main.jsx new file mode 100644 index 000000000..54b39dd1d --- /dev/null +++ b/front-end/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) diff --git a/front-end/vite.config.js b/front-end/vite.config.js new file mode 100644 index 000000000..5a33944a9 --- /dev/null +++ b/front-end/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 235eb3f2477f574be3523be21ed20c6aeba74a67 Mon Sep 17 00:00:00 2001 From: ALWIN AJI <110730876+AKA717@users.noreply.github.com> Date: Tue, 7 Nov 2023 12:07:29 +0530 Subject: [PATCH 03/35] Update README.md --- resources/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/resources/README.md b/resources/README.md index d1bb858d3..4dcc51888 100644 --- a/resources/README.md +++ b/resources/README.md @@ -1,2 +1,7 @@ # Resources -This contain resources of technology stacks used in the project. + +# front end +-> React frame work. + +# Back end +-> Node Express api. From 5efbda15caa3a8db584e3bb5624c95333d9244f5 Mon Sep 17 00:00:00 2001 From: ALWIN AJI <110730876+AKA717@users.noreply.github.com> Date: Tue, 7 Nov 2023 12:31:03 +0530 Subject: [PATCH 04/35] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d6191dd92..a4db99b0f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ ![StackUp Banner]([https://tinkerhub.frappe.cloud/files/stackup%20banner.jpeg]) -# Project Name +# Contact Manager Long Description about project. This project do that. This project is awesome... ## Team members -1. Name [Embed personal github URL] -2. Name [Embed perosnal github URL] +1. Akhil [Embed personal github URL] +2. Allen [Embed perosnal github URL] ## Team Id -Team id here +retr0 ## Link to product walkthrough [link to video] ## How it Works ? From 8e9b3c947154c1c412d179e166b8faa185e4aff5 Mon Sep 17 00:00:00 2001 From: ALWIN AJI <110730876+AKA717@users.noreply.github.com> Date: Tue, 7 Nov 2023 12:31:45 +0530 Subject: [PATCH 05/35] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a4db99b0f..5e1759309 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,9 @@ # Contact Manager Long Description about project. This project do that. This project is awesome... ## Team members -1. Akhil [Embed personal github URL] -2. Allen [Embed perosnal github URL] +1. Akhil [github link] +2. Allen +3. Rayan ## Team Id retr0 ## Link to product walkthrough From 61d348a381fa42866d7490d4e3eaeae2ed511010 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Tue, 7 Nov 2023 13:04:06 +0530 Subject: [PATCH 06/35] initial server settings --- back-end/helpers/constants.js | 5 ++ back-end/helpers/user-helper.js | 19 +++++ back-end/model/model.js | 49 +++++++++++ back-end/routes/user-router.js | 144 ++++++++++++++++++++++++++++++++ 4 files changed, 217 insertions(+) create mode 100644 back-end/helpers/constants.js create mode 100644 back-end/helpers/user-helper.js create mode 100644 back-end/model/model.js create mode 100644 back-end/routes/user-router.js diff --git a/back-end/helpers/constants.js b/back-end/helpers/constants.js new file mode 100644 index 000000000..f2dd7db74 --- /dev/null +++ b/back-end/helpers/constants.js @@ -0,0 +1,5 @@ +const constants = { + USER_API : 'http://localhost:4000/api/user' +} + +export default constants; \ No newline at end of file diff --git a/back-end/helpers/user-helper.js b/back-end/helpers/user-helper.js new file mode 100644 index 000000000..b9876ecbd --- /dev/null +++ b/back-end/helpers/user-helper.js @@ -0,0 +1,19 @@ +const { Products } = require('../model/model'); + +module.exports = { + randomItems: () => { + return new Promise(async (resolve,reject) => { + const products = await Products.find(); + + arr = []; + + for (let i = 0; i < 4; i++) { + product = products[Math.floor(Math.random() * products.length)]; + if (!arr.some(item => item === product)) + arr.push(product); + } + + resolve(arr); + }) + } +} \ No newline at end of file diff --git a/back-end/model/model.js b/back-end/model/model.js new file mode 100644 index 000000000..2d73b1d30 --- /dev/null +++ b/back-end/model/model.js @@ -0,0 +1,49 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const UserSchema = new Schema({ + username: { + type: String, + required: [true, 'username field is required'] + }, + email: { + type: String, + required: [true, 'Email field is required'] + }, + password:{ + type: String, + required: [true, 'password field is required'] + }, + date : { + type: Date, + default : Date.now + } +}); + +const contactSchema = new Schema({ + name : { + type: String, + required: [true, 'name field is required'] + }, + phone : { + type: String, + required: [true, 'phone_no field is required'] + }, + email : { + type: String, + required: [true, 'email field is required'] + }, + address : { + type: String, + required: [true, 'address field is required'] + } + +}) + +const User = mongoose.model('users',UserSchema); +const Contact = mongoose.model('contacts',contactSchema); + +module.exports = { + User, + Contact +}; \ No newline at end of file diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js new file mode 100644 index 000000000..36f3b2807 --- /dev/null +++ b/back-end/routes/user-router.js @@ -0,0 +1,144 @@ +const express = require('express'); +const router = express.Router(); +const {User} = require('../model/model'); +const bcrypt = require('bcrypt'); +const multer = require('multer'); +const path = require('path'); +const userHelper = require('../helpers/user-helper'); + +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +const upload = multer({storage: storage}); + +function apiResponse(results){ + return JSON.stringify({"status": 200, "error": null, "response": results}); +} + +//image upload +router.post('/upload',upload.single('image'),(req,res) => { + + const image = req.image; + res.send(apiResponse({message: 'File uploaded successfully.', image})); +}) + +router.post('/data',(req,res) => { + + console.log(req.body); + + res.status(200).json({ + success : true, + message : "success", + user : user + }); + +}); + + +//Signup Method +router.post('/signup', async (req, res) => { + + //console.log(req.body); + + const isUser = await User.findOne({username:req.body.username}); + + console.log(isUser); + + if(isUser === null) + { + req.body.password = await bcrypt.hash(req.body.password,10); + + User.create(req.body).then(response => { + + const user = { + id : response._id, + name : response.name, + email : response.email, + } + + res.status(200).json({ + success : true, + message : "success", + user : user + }); + + }).catch(err => { + console.log(err.message); + }); + } + else + { + res.status(401).json( + { + success : false, + message : "user already exists" + } + ) + } + +}); + +//Login Method +router.post('/user-login',async (req,res) => { + + console.log(req.body); + + const user = await User.findOne({username:req.body.username}); + + console.log("user : ",user); + if(user !== null) + { + bcrypt.compare(req.body.password,user.password,(err,result) => { + + if(result) + { + const userData = { + id : user._id, + username : user.username, + email : user.email + } + res.status(200).json({ + success:true, + user : userData, + message : "login successful" + }); + } + else{ + res.status(401).json({ + success : false, + message : "invalid credentials" + }); + } + }) + } + else{ + res.status(401).json({ + success : false, + message : "invalid credentials" + }); + } + +}) + +//PUT Method. +router.put('/update-user',(req,res) => { + + res.send({ + type:'PUT' + }); +}); + +//DELETE METHOD. +router.delete('/delete-user',(req,res) => { + res.send({ + type:'DELETE' + }) +}); + +module.exports = router; \ No newline at end of file From 2536ef4321f76694b5560fff4143529e616a7b5d Mon Sep 17 00:00:00 2001 From: AKA717 Date: Tue, 7 Nov 2023 13:28:12 +0530 Subject: [PATCH 07/35] routes,helpers,model --- back-end/helpers/user-helper.js | 19 +++++ back-end/model/model.js | 49 +++++++++++ back-end/routes/user-router.js | 144 ++++++++++++++++++++++++++++++++ 3 files changed, 212 insertions(+) create mode 100644 back-end/helpers/user-helper.js create mode 100644 back-end/model/model.js create mode 100644 back-end/routes/user-router.js diff --git a/back-end/helpers/user-helper.js b/back-end/helpers/user-helper.js new file mode 100644 index 000000000..b9876ecbd --- /dev/null +++ b/back-end/helpers/user-helper.js @@ -0,0 +1,19 @@ +const { Products } = require('../model/model'); + +module.exports = { + randomItems: () => { + return new Promise(async (resolve,reject) => { + const products = await Products.find(); + + arr = []; + + for (let i = 0; i < 4; i++) { + product = products[Math.floor(Math.random() * products.length)]; + if (!arr.some(item => item === product)) + arr.push(product); + } + + resolve(arr); + }) + } +} \ No newline at end of file diff --git a/back-end/model/model.js b/back-end/model/model.js new file mode 100644 index 000000000..2d73b1d30 --- /dev/null +++ b/back-end/model/model.js @@ -0,0 +1,49 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const UserSchema = new Schema({ + username: { + type: String, + required: [true, 'username field is required'] + }, + email: { + type: String, + required: [true, 'Email field is required'] + }, + password:{ + type: String, + required: [true, 'password field is required'] + }, + date : { + type: Date, + default : Date.now + } +}); + +const contactSchema = new Schema({ + name : { + type: String, + required: [true, 'name field is required'] + }, + phone : { + type: String, + required: [true, 'phone_no field is required'] + }, + email : { + type: String, + required: [true, 'email field is required'] + }, + address : { + type: String, + required: [true, 'address field is required'] + } + +}) + +const User = mongoose.model('users',UserSchema); +const Contact = mongoose.model('contacts',contactSchema); + +module.exports = { + User, + Contact +}; \ No newline at end of file diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js new file mode 100644 index 000000000..36f3b2807 --- /dev/null +++ b/back-end/routes/user-router.js @@ -0,0 +1,144 @@ +const express = require('express'); +const router = express.Router(); +const {User} = require('../model/model'); +const bcrypt = require('bcrypt'); +const multer = require('multer'); +const path = require('path'); +const userHelper = require('../helpers/user-helper'); + +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +const upload = multer({storage: storage}); + +function apiResponse(results){ + return JSON.stringify({"status": 200, "error": null, "response": results}); +} + +//image upload +router.post('/upload',upload.single('image'),(req,res) => { + + const image = req.image; + res.send(apiResponse({message: 'File uploaded successfully.', image})); +}) + +router.post('/data',(req,res) => { + + console.log(req.body); + + res.status(200).json({ + success : true, + message : "success", + user : user + }); + +}); + + +//Signup Method +router.post('/signup', async (req, res) => { + + //console.log(req.body); + + const isUser = await User.findOne({username:req.body.username}); + + console.log(isUser); + + if(isUser === null) + { + req.body.password = await bcrypt.hash(req.body.password,10); + + User.create(req.body).then(response => { + + const user = { + id : response._id, + name : response.name, + email : response.email, + } + + res.status(200).json({ + success : true, + message : "success", + user : user + }); + + }).catch(err => { + console.log(err.message); + }); + } + else + { + res.status(401).json( + { + success : false, + message : "user already exists" + } + ) + } + +}); + +//Login Method +router.post('/user-login',async (req,res) => { + + console.log(req.body); + + const user = await User.findOne({username:req.body.username}); + + console.log("user : ",user); + if(user !== null) + { + bcrypt.compare(req.body.password,user.password,(err,result) => { + + if(result) + { + const userData = { + id : user._id, + username : user.username, + email : user.email + } + res.status(200).json({ + success:true, + user : userData, + message : "login successful" + }); + } + else{ + res.status(401).json({ + success : false, + message : "invalid credentials" + }); + } + }) + } + else{ + res.status(401).json({ + success : false, + message : "invalid credentials" + }); + } + +}) + +//PUT Method. +router.put('/update-user',(req,res) => { + + res.send({ + type:'PUT' + }); +}); + +//DELETE METHOD. +router.delete('/delete-user',(req,res) => { + res.send({ + type:'DELETE' + }) +}); + +module.exports = router; \ No newline at end of file From 01d48462b1989aa808337e19a614be1cc1a11511 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Tue, 7 Nov 2023 13:38:26 +0530 Subject: [PATCH 08/35] server.js update --- back-end/server.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/back-end/server.js b/back-end/server.js index e69de29bb..deae0c27c 100644 --- a/back-end/server.js +++ b/back-end/server.js @@ -0,0 +1,42 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const path = require('path'); +const adminRoute = require('./routes/admin-router'); +const userRoute = require('./routes/user-router'); +require("dotenv").config(); + +//use +const app = express(); + +//connect mongodb +mongoose.connect('mongodb://127.0.0.1:27017/stackup', { useNewUrlParser: true, useUnifiedTopology: true }) + .then(() => { + console.log('Connected to MongoDB'); + }) + .catch((error) => { + console.error('MongoDB connection error:', error); + }); + +mongoose.Promise = global.Promise; + +//static files +app.use(cors()); +app.use(express.json()); +app.use(bodyParser.json()); +app.use(express.static(path.join(__dirname, 'public'))); + +//route +app.use('/api/admin', adminRoute); +app.use('/api/user',userRoute); + +// error handling middleware +app.use(function(err,req,res,next){ + //console.log(err); + res.status(422).send({error: err.message}); +}); + +app.listen(5000, () => { + console.log(`Server Started at ${5000}`) +}) \ No newline at end of file From ec79ea13aac6f86657706eccb982369229012c4e Mon Sep 17 00:00:00 2001 From: AKA717 Date: Tue, 7 Nov 2023 13:42:05 +0530 Subject: [PATCH 09/35] added server.js updated --- back-end/helpers/constants.js | 5 +++++ back-end/server.js | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 back-end/helpers/constants.js diff --git a/back-end/helpers/constants.js b/back-end/helpers/constants.js new file mode 100644 index 000000000..f2dd7db74 --- /dev/null +++ b/back-end/helpers/constants.js @@ -0,0 +1,5 @@ +const constants = { + USER_API : 'http://localhost:4000/api/user' +} + +export default constants; \ No newline at end of file diff --git a/back-end/server.js b/back-end/server.js index e69de29bb..deae0c27c 100644 --- a/back-end/server.js +++ b/back-end/server.js @@ -0,0 +1,42 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const path = require('path'); +const adminRoute = require('./routes/admin-router'); +const userRoute = require('./routes/user-router'); +require("dotenv").config(); + +//use +const app = express(); + +//connect mongodb +mongoose.connect('mongodb://127.0.0.1:27017/stackup', { useNewUrlParser: true, useUnifiedTopology: true }) + .then(() => { + console.log('Connected to MongoDB'); + }) + .catch((error) => { + console.error('MongoDB connection error:', error); + }); + +mongoose.Promise = global.Promise; + +//static files +app.use(cors()); +app.use(express.json()); +app.use(bodyParser.json()); +app.use(express.static(path.join(__dirname, 'public'))); + +//route +app.use('/api/admin', adminRoute); +app.use('/api/user',userRoute); + +// error handling middleware +app.use(function(err,req,res,next){ + //console.log(err); + res.status(422).send({error: err.message}); +}); + +app.listen(5000, () => { + console.log(`Server Started at ${5000}`) +}) \ No newline at end of file From 1695483343f7ed6f073a6299468eaa38eb2b6861 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 07:02:45 +0530 Subject: [PATCH 10/35] add contact route done --- back-end/model/model.js | 9 +- .../profile/654ae4b7155c830cb3ea4c29.jpg | Bin 0 -> 81453 bytes .../profile/654ae4ee155c830cb3ea4c2e.webp | Bin 0 -> 21404 bytes back-end/routes/user-router.js | 165 ++++++++++++------ back-end/server.js | 6 +- 5 files changed, 118 insertions(+), 62 deletions(-) create mode 100644 back-end/public/profile/654ae4b7155c830cb3ea4c29.jpg create mode 100644 back-end/public/profile/654ae4ee155c830cb3ea4c2e.webp diff --git a/back-end/model/model.js b/back-end/model/model.js index 2d73b1d30..15daec9e6 100644 --- a/back-end/model/model.js +++ b/back-end/model/model.js @@ -21,6 +21,9 @@ const UserSchema = new Schema({ }); const contactSchema = new Schema({ + _id: { + type: Schema.Types.ObjectId, auto: true + }, name : { type: String, required: [true, 'name field is required'] @@ -40,8 +43,12 @@ const contactSchema = new Schema({ }) +const userContacts = new Schema({ + contacts: [contactSchema] // Array to store contacts + }); + const User = mongoose.model('users',UserSchema); -const Contact = mongoose.model('contacts',contactSchema); +const Contact = mongoose.model('contacts',userContacts); module.exports = { User, diff --git a/back-end/public/profile/654ae4b7155c830cb3ea4c29.jpg b/back-end/public/profile/654ae4b7155c830cb3ea4c29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bab534311cf41d717c4faab3e55622e00ac5fa19 GIT binary patch literal 81453 zcmb5W2_RJ6`v-obqnVlvGt!H}BZ9UsG9I zPDND-GQlygUd_hJ#?QgQuOzWiLh1i^`turD!$dDnpx|+95V|!u{2JV!HwZ6+!{HD- z4p~V!Iy^lCBdFs+YyPf6aCmw;hCf{h3+O?|f#*OF+yn*f%7h?vSPo%^1O}9f{cxgr ziDfEmfFnU7?6Oh|Tda^^3ml1%0*MG6ycxn9tt*W`%2b4e(qT2$1hPcgVmx3iETRDa zMG9zuwFrQ}j2WTA0!z}u2d{^m~?O$8P3!m2T~{)LeO zDj^A3Hqf#rh$0{(2noH@9Dx0xZE0qv!fIv>3e5x<5R3>bz=i39>I91zi3)Nf;KHo4 z6v|QoZApc-f1&=T{V`2pL$on0E(u5BlK=rtG?Oe2l>&A zg8pD~S5W_-_D2<`0uG1~6$^Y2pDP@eS))xb`=Gcy)C-d!Z5bq1_m^8>4cZGLLA4_6 z;Q(1QhA=HLuhE9&U*>|K=jS7oUQ%q^d1VsU1W2BL2*aQ&< z7pmV<_+YhEKn95lF3^v_E4AG03!DSP|u?xCt<# zMJ}qtl2(UMR2c3hC-nv28y@XfHEpUvnreN-MMz7K(N1Vv$OA(Si>OpsL`fqcgXx8E z2BLWk6-{p{N}H9%pR4ttS2NB zNRTBHywS!OLPZPM4^27*iX$nHq~=X}&iage_cRnCiKrKn5L}g8a==Zj2h2@VZ=o|TL&p(ACPSkbf%)gv%|(|f zcrBapq;kj$wL98tSr)1!#)t|UP!U`sY)FAOfCOCuY0joer=m5G0Wy-To%(pvlRPy3 zTR-74h#!s1W~rxle<(gp7Kn4-ao6YRmuZQ@vQ7i@;h>KmF(@PfDgR>7Yf?Yf#zRcp3n|7xHLmxUIX^WwJQ>Mj{PV$X+X!# z6P&spCr5R(;c9lT&A)$dT{z=D%jcFcVqer->80^iStV|wVb#_2hn{s53nrR-o(Lbckzu1-ZztnZ6WQICaQ*jkQUmy1)GZ#57(YShdUMR`ilOm1k#^5(Rfjz5E#eHagQkui#XChmn2L$=0RF})S>|G zR3sfot7=Ql`>FSZb4RyuWY%#6N+6}IJi^HIslqYkIxDN(;&YzvuX=Z$7K<|7owDN@ zIl_29h2Zox;jhUAjqPPGVdDkr&xxllhbRE{R}{e#jAj}tmK2v)OzgJ1OVoq4-uQIf zzNJsHX~O9tcD#(b(fFs<)<(mQqem+1=6U+o^1op#750P|M zeB}Gc@Zglv)Wi%YbvQrYOJFf~e(p=>ys0xXpj2stX@m|SXaOt=pa)Pdphb7m(y#^O z{|$ug$~&SB=hwF0&N(I3o$Zw^g_rKzW$JNcULr|3A-LF0GCtnpKin**eo0S%8QzP0 zG45^r)by?}6@QkjyNRIiL4ov7qx@?Oqob$kA5i{+3z4DrKqKn4_ketrp)cFk#iSy# zTz)8LQ-DpTHp!`xk(Gkbi^ST?t(!J;|NgTfpddw|Pq#V5XYMSB+^NK=>Abs$(y$X6 zcNlUK9w_v%O*-`u}Iii@c`?uh;eYJQ}hLjzz0z%*^pnwi+ zZI+92$ys4f=2A7~2;}AvNAb_jr~1CCdY!eS2wv&LY>skY4wIGnA9#@M3gGg0TJa;G zF2TkV;*1KdFJ8Z(>UV+@Osv1uw%S+u#4E~vS73>w2C3^DqOe4FKsLNX7X!GWjJB6Z zj|@#cG}b=Io>rDAI$UJ0yH;{6;eWzGM+!jb{x=jfPlb2dKw2`7ch;(dc|Kr{`*=Dt zpsnFti}(CR@pt9rt!$c`8Ia4uvWGbNPu9SWbb{Bo7R6K3YuZd3oYGbHN(483YAI_y zZ|+7>(xPI%`7iETB8@;Ef2V&~2b*#w2o_T{cK3f0d#2_;Q-8Wzf9-qzX_4%GlTVV# zP;;Li9j}Nw3qJ*N!PUJ1-nzGI@#so$aiBf` zPuV0`^>@OIf*8&a2H8`O+;{Ysw`*wLoS}(D0|!nwz%?L2iI`Nd@&0#$ z%`h0?2eZ@XWKFTs*irJL_0AGmF+zSyZ^o1dc{n|>qD4FNm6RbXkBkO|nN2zx?Mf$D zVZPXHO3u%^k$#R>GS7bW#TQGyC*M8owSBZ~uvrwt0b$W_fE*QEh@m^YgG7%tf!USD zpnxKhZ;-0KZx`I^J^!L^y|>~PzM+flHJ#-xV4?KB$xC$Qw-*VpBO2|~c0yPZAqxai zQGT~5$SSn+^T`oQOUAj>yHg(SJBEjU3>|=0S~1DW(=!SPbqn(nC}9jFWO+7&0{$# znn(RuJ@jT#D>ZBIB})#j!coY4Xl(9FtNZr5{=VVuzCy|AHSMN#UmN1V_M(unO4FvF z=)fl*!5_?%PC|JQTvL9hHndC$2AvJ;cH)0w&^p&OZ|XAj-pw-uM$ZaBXc9DfP`nTa zt_fv<2ru~=7BPURVNulxs~WC<_##UlTBydcBtLupgZO^Re2SuyROHLZDsW(S&QEhE z`$4KxwGJX>H$Zf%u5jwCaA-t1(<@#33HCxIJNH_N)hPaO4T{Q`nx6R;Mey{qfGr@L ze?meXhdOVBg0g^jDw=~gG`Hkc2?U?*MeO;I3ATdQt61Viz79OEEiS&7L{YK$0iucf z2H0!77`xMSA3>`9-@Lr!uNxxvR?IQZ6M$J*4I?o?f$5# z8^}Qspu+wdjDQZ!BESJ|*p>+MJS<^3v>V#no!y)(a!_RGA3=r&k_w5ir*~yZfWg_6-%4$jdUV{# zjP(1q!pMvy3gfNuq31p27ZsxtrlqIPh!p=CBfW1oVXQt)d zT|9)8N>mSyHk~QX+Yf6<;Px+9!XmH;Ey`d6ngd}5GZi+yfD$3e&Dj3kTtYEld)a0^ zyzpAV`qMA;4!<(QJxM*iy?97zf%T#H(Hz7sh!rnZ%by|QAKm1ihzjJWW{sY4Ganl+ z8j>3tyz;Hg6MbrjHu;yCpe4XX*aHDD!P|eBiRM9sF6CHn!?`x^gksT-^3vXo31Gr! z*GQRk-|-PF5<8_khkV|-(i3rrNTF~CgOs6N6BTl!mtqx+yx`k?gIsj$MtlCF849FQ zX%{-SR%TRAnrSGY8YG&ZKn{gXvk)-Nbyw5&_uhOL?VIcRKi_8MtRiY(h(Gr!g}k`_ zy9Z*3DnC&+ zhYm&^4GKJepcf|aR5{Smaa5<>DGLEV!r(&F zQg|%chKi9VBc(r7`ZXRa=~r>`J*|M>OSH=bo1x;M3vL?~-%SlT-U-MfQ8Q~;;;MvY zm~gSt)M{p%49RpbihA0|QdLKrd5BI_I)3|?F@F&KFy(WaJJk$P*6@xAg>a~lhM5db z<=}r>!mI)cm@R4c!Pm$~4*L4aCEm$Ok4kzUFQSLAgrw?(spvj7i{DWx;61sN#2hwN+*mQad?h5r+-u=CIR75aeDVl0UT=#x4po? zQGr0zXizF988uo!+TYKtOU?p~SGpmHa%^~32l zrmeiy3Go^!?5Xxk%#BaG1u)S>E{kPYCNYEOB@VQN-e_h6`4wY>6Q4L2e2J-_*6^v3 zQ~AR`h7kuU57D7tiQnK}!q*;^sfl*ayxBAT!*T})dkyL0ZZj|t4IP3gA~825(~|5( zv|T6KJLZngK69RFNKg6j@&&ml18i~lDFV-)|D3RHE-qGazeIxa(UFFtgpOQ6$rk-L zNLmH#fcYEKYqFlh=regyHJOX-cPA=1n=S$2ma(Bsj}&%SUK~qEX%KLCH=Rl>bRQqU zktB8OGTAi42V@W_2MQ%qH=sGQzH(jP=Q~ZA4OvsuQ!Z*dM+PUSO{>`Ie1FY8^cc?% zIP;fHuqgpbUq*nx{Z||=SAY!d&!{QlkOC3`GIAa(13**%*?3g2}vFlN${-c6Mt{c@4!y| z4+z*RbCjktMpRn;-uhDc-S_0Y&EP~SwY*K=4xwg-t(LIqB+(O@?0DtYJvkTOx=P@J zLf_4q!uQi3E=KLt^HY1S)_A<6uDJM%<@eKBZhuX2*cgDaQTgzU4c81dWPhiB%`#|1 z0em)2|E%~Z`OALtjf|_p3^F)2Q7sWB4S3$ge^klc^UC;?%7OE9b#n`E#}Gp=`7tmh zoefibJTdjWaOT%=G?)Q{(%g1U%TIgeemkhFGSyfVSweR16j&`U5UDut#Ct(mH@Ig0 z$i?Ti?VskowLm;y-dAvDM$BrJnP#8L+=racUl5q5Kx67>MBh=Qnf zmNJMDiG$iNW7jD1`JjDCu-0~8PlXurOPPhCg+;45I{&hF4dFs@SU@URa-IQ`j6RbG>azRmP{q!#I5b5yU z^I)YE1JgicalrcDAC%^QxPcw0d;VPn$COGfPj^vMDN;+{n>@d*w0%^0aku-ukGS;D z&Ld+#1!Z$pu7F{S1tG8^EeZi?DKM6y3d3rcFePAad9r0mQAdy=@XXB?WuWp>>CSi0 zrlz6@U|cX{GGy#ZtJi%yUIK>y+|_qQQOUij)lG*PkZ;Dl;EDNy`_H~F>80;ei3k#0 z5~g)F@3(E!+sL%C2c~4pO4H&~X-UyT!+9m-sKWz5^rku z^L|G$M*hCAXH?nJo&38?-iIQg)aEt)+cU4um;7VlgKDl3J%x~w(tB=mw;M;_SLHLt z?qBjr2%Bar6p4w2GBLSSkb@V(jP5Y7?H>#Sn3gf3V-JP~L3_s4da4WP<0y0>SnF)q zHUr1v!frPgRg>HotWW2!yFsY*@^#ToF@l*F;9zO9TvukVru1AbA~RlC@=0oXS$bEc zS8Q&6(zNtR8wBAJFSNEk5MU6T7bUGnLI}6rC_pp@feLcV!G?hV^E{eJ;Ql{wg2V6> z#d#rV>x%iCvx*dizq_GjuIqw_*TaS2oY>SWaGrYTH86SytfgZ|>KG(R$YlxnI*x9G z!t1>kxFQ|rMQ`~D$&H*GF)v5Jh$~L4Z)q)xx;|Yn;Z-V(FtVMs2g6B)&-?r1VFdTY zr{KQ!^5~!fSpPySAPi{OPK1i)R)EuTV1%(~#_oQZcVVv1dmu+!L!j&Vyq}W6mB&$h zdKzV|X}!0~{Tx#klHC`6gU3ZTuzVs!O)YL@cnEB%f0^a?N{cCxjk9xV~XuKJ0upn&p%0a&qSv*MofdyEbiwbgkU7z=EVqbvmi93=33KRJQ(U7x{5w5(Scr(B6uW?!o);!-7}$U2VyMMes}S20sf?hu!1OdOMaC}ZLlPi zrbTD!CIvg@E!KL?gDpeP+`@KuL`7%&e92Bz{n6hBEpJn(EPP-z@`(hTAUJ(n0s+l{ zjV9<%%%>6rZ3-xW#6d-W{v%3Jo8v>Kw4JDk27Z$;g1GMab>!^N2iDo--dm|vZ8``u zIEdvHS-omoa@YKf+xt(WS;5)Jh1qZOLTUy#a#L?kyJmnR5PB(xMq$a3WXh6FfV}^J zgM6k19}Ntx?Q&Dv;GYcV16E_w6e9sRQ>sJei{!^-ubkMZYy>z_gR`F=yj%?s<^tzO zqtk_!!>8`tu~+p4M^#(FcTMWdK0_2#ElfUY|CNEjfZ%WAmc(Pf)TJWy=u&*~D97*z zf)YK^jswi2J-+jYfA)d>Ai|kJw5!(Fpn&%o1T_KQ{A-2Ri-Q@G7Od|Dxg$6x2mayP zf0+P_Vkn;Gk^c~n359~ONI_!@5pZh|Ndv1GILwLRKydmqzF?abX@em6O^kIE1PRg& z=zQzd>fIH6VDP1K%E?d)!oo+OdXiRj_?Kwt40j3w`Yxws(Kzkphz6C4gu|RoxceZd zNiU2bPJv*$q43FqGA?$bknNDux8eKV&m8Bh4{RhMBI@7>o(k$P{Qt5xD1sd*9a>Gh zQI`ssbSy>?_D$8yhoYNEpi;^P+%hjQkytr-CFqG7h(nWZN+6f-xf}P^-kdG5-oOBM zkNBI@uP}Q-H8EAGAO|nh@8IzUOmWKz6Gp28Kd8P4K4h}SP;-w6eD6WWPvQhW2;PP+ zfoKDAlG%>dM}|&MyB$>)m|GBd`U=5)P_m(dCV#1ldKF~`(MUD{;b;T&h5-awnv$4M z#JxURM#Dc|GK~VHg;1K9Kno)hqQQZ%@=Ac$hu^>(G;bv*#UB$BDUT(E5qz7%iZA~) zokKrHi9&PM-7}Fo-vYyApJyN z`{X>E{2&3x}d5;O)zcHm_|30fP^J1#9@9Z*ipJ+f0K-W zhwK$w!&X>YZVQVHio;2odnC14IRb@2{PLgFaiy>%*QocI`1iuRK zjDlB|<#3r8ML)PfV+zw0vRq~hNa&J8f}NLa0dp%Zf+a(Dws<{WDTiwHbg?SC42fmg zoOFm2!b$;6!25IXP&boeRlHSUw#1xEkwOp|gMHD701H@X{S^;TQKhld*rjQIsr^zr z&>Nh7;BA7!{i7*VAh^^&iHaBJMvz1PoK$pxiM(-}YVYz^oE!T#tioR``;3Ht=mYtn zqW(3OU=du{VXH7~MAH=JR-l0b9mQr+oi#dBhXmfiup~&5L}D3$r}d?nnZVhAx*qIc zQ$16Bw!~ojOQo?nb|e01s^FzANQdVAS7f6_AON*C?HB-)M{AGS2^7GTp6mS)j6U#r z1VDjYi?2jRCO7)7?^9yBgL z3kb7D-xih-mXKr(2(Lmoo79=?5N0^n8FE`4AYb`9>xD9XQ{Z zv}KGW#uIi``MknBiL!-yV7kB}8bWl*Aos6Cg=N$h;1{-1cIC*djpMA6Ai~$FES%Ng z9lQvTNC)ch`y%-Iyyw2PHuOg1Y7s zOtUrG(q>ZoP#i~4cwA5w6SG~DdhAKyU62?+K!Pp7t?vHfI!ljV!*|Y{ik7D+Ftg3Q z|F2RZ2#ouGzEl2(RO|_2EX9Els0-u<0);u6Sa^|AC=e6N-vpkr)KuKh-US1@^FD5r z{}qaPSyO}x8$-S*ZwBn^I!Iee|B#7Jnz&{~5U6+DWhhGqI;ER2Pset+~4WX4$5*Rl4 zG$zpCue78(N(osjkAV&%7Y&6_WB8FIL@j{9?b zxCajfyc8(gUiP4NAu8vFe?5^zGTOu-VStUH`))|A;tL3uckJy)VZf|I98T8|?e4_}FE9@Cky%Wa-o^N9?}feRjOP z_2!7Rbyz{_mifXh4uSHo7#JfsU(w6jRDnsgQ$d|XSkOl-DAW$LE%=yjSB8lT`OK(xI)-40_i|H7CE|>n%-0R}cO?^j|z_D|6?R?yk<0Qo2 zZP(Ce@I9pgXT^!u!br2R=Cu02wi%^?LvcY7+>#Wq3|`O@hD`rCSpOSD&VPRKNjt2- ze20x&Ns*qqa}6W;DkL7&D8^K+-O0JX=-t2e54==jUaBO?eDyOei{E@ntIqiSsZEM!I=flMl+{8yo*dn51vfh z=M$AUEqy*AClH*Xjt+ryv2(|Z#}R?8Plo#Q_!MRvjJWLJUXFsW3VxzOAux_GY0wy$ zL8u@HFVryTUroT>36?OgV{wR$P(<>4>goFSNx>A|T14fA*RKwlulTBVgE}9cScLuV z9g{M~pIdqf21>?iDg}`{sHmK# zuW|4f;z1>%5UG#^4f=QJ!H`=X02r<%>rp`sV(3ZiX;)4@Oxaz#m>OG{QatcNpmRYW ze*7}g&8@w|TXCj#YN}QFp8LXwg^p1PaJ~>NQ1c5sk~#9b379MNk1AdB%83#(w&JQ$ zT%3X&85^7$;V*T`auCi6BoqTI0;DkNmOerF`_0`_PeT{Y=JNDmPy1wKk56a*ytUln zn{y>vauK=7@kEkO=a>0>Y2zz>-%^vOrRR=HYJ**f82F@RF)Q}5rnI0{=-h0|q9yeD zx)XwIHS*6wfH>9^_$3Sq2nB^&0|m8WI#{HF^A7N{gzvwZj>WWHNV@Sk1(`3Awwg;# z=}oPF_L4^!fo~QTc$HrQn~l$Yiv~RCl@9;>anYn(G%9=QYd;vtx$}5we%DHixrEab zGe*sYSA-G7;U|0mhk{n39L673guX_@5s$8&h z-o$_>6a+V#3~YstvSlDElh!{-cq-(Jo#>!Yp#jkZOE?m}ase>ql~P19oun>;!X>Cc zPZf$^ODmBxR#i=S>YbWhn$=eAjA({s_kBxA?gmG+Q)llY1e=)}Y{)J93Hs_UTfrhq zqWv)l+<#*zFt{{}N+3MSK%pQeW+y6W0TXy#{(kn?6Q3w?JvF%!Sv$$`lSQM-J)Ve0 zfV7}z=`FJ4O`;S9{iDX0KcX~=uU4yXrU5hX2c3rI^%Fb6GzC9D|+-}d_BPl66; z!doHS6x?qHMI*cK_sz(bO-8F|S%= zT<|Fg;=njVJuzLWAO|lrxKWa#Fb6EJn1c$77#7&7UwKLx9OlV5P*F0ttxU43T77QR@Aj9 z3@Rw0$WSQYaf$>92!*z~U=3+qsR)~BgD`mg&6|zDZB?|yRh*Ah)`Ab*-j8wqU~>k2SLFXISg4>9UhsP(I`|8w zMJoJR0>S_b;B%zc?o7ZkB2_4CL)74abpSbk5QV@I{NCGKX}#AKH#aqfk)dhn&gx1N(Fc{}7Y#b|a|%{I1*2nG zbuIfG3tRH@BD)7JkzijaWknL|I2gDz5}fmd!G$Fh1jwS50Iq=OT?8qOMPrv}M}ajQ z$RRp}m7jta=b7P_nSb*2Ky3V+wSoAJw34)Pzk4xXrWF16%slT8%WgH0k>BhSrPN%V z@)1=XH9r+FL0y1Z0~9c!%y5!}fr}+{@WCt!19EsRVUZBuhS;K^ zBJk$}rX(U<3%vQfYWofff#EcDE`M~P$27iI`U%(xS$$AeIs9V|JSNOXuS{y_=%GTU zKo)wTqOpww3DU8l1AbAb!uHDjAqdM&SqB8X#$u3#{a_MdiKc+PQzXenNd5Y^)q9Py zI~a9S_Xcad4BN*P#dk(%_j5JR;@@R8op0Yz6tBCL^{Sp+=)U2sF8mM4SZD$gx)!0+ zG6seTl|n`DSS196i+u~u*aM=$8i4T0V3pv`WcLcx6`o|W%MwwK4IdiLFPfAE)?umC zG`8M6GANkAwRrAEE&#H@rS;j1GwA}8P&3pTs9;p9e~{>~zkG*wrwy-_DGotABEgGb zDR8Kvi=az0J)Cqiz^i&h0~{bC3e0w|WS#Kg)!zn6Mi#y(OADNyo$WQ^CzM3~LDHwD zDe})Elam}jkpCc>TRnqw^ZbFXKg~B83t8(kfgmLI*#r zwW|g|02>+b9)<;+mE&rRLIM?-nOqXC{5mIYuVOiq*AG4=G`p_jdoKA-Yqj%Q+l+H6 zXXhNV@-wObF_NLl(KtW{7^mQQ$QzyHFe+AwV#bG0k&s}XLQ*vamu>?bg$`rTnoq_M z_lATZS(35ge6rx^3H;&IjOxj})e5tz)~wfA!1oVba8>Xmu#=~qhGkvads94?2F5Y~ zR0b8WLq#&p%?#Jy^jf+eUF9 zjK&x4CB0}Uo1cA(d!yN$*^oc^sN<@bqKRAkx1`T^0xX69n>#RhP>|sgij{ABP?(sL zlnaHyx2huAHWU!3^ip=911C79;{X68s|;;kfdd&0ZaCq(2qts+GO7sieeUl}7w1;J z!4~Dkb(vsZd|qidxcI!>a9t7w<@?XDKylDWic7|(&;kVg!F# z9D&LhA)Wqll+IYO(ik3ac0}zH1}7EKePA@>V#PD`QY_nA;<%;Gihm*BOU}Ij9-NfU z*FJGKE`3Z{)*ed6jQ=+f0*MZiR}xx@fl?%Z8J3Nt8IIrg3Mr)^43c^rbcm5y2rCbR zNZL&)TzWJ|ABe6h8xXM2Z38lz;lUYtsn&z1ABbk00Fb)Bziz35`q?CW3pX z2woY=vfN})KpnzZs$<8=8Kg%?=g%u;v`<}IgQN34lMCq9Nda*R-t+MXU8=AfcZ0LN zqRCWO-}z&aR1aU4ZZBuZ8=4n2F$92`1H}bNBY*8kKoLcVfk3Bqn+{-#Dnlqs#)(^& zg;z3Qk7O*VIxU_tJbFN+f`qGbz%zo$$R8iw2wt^<00AxmAJRNEz34l$$ex;&V~>}e zXqlGY1h_-S7;~WPN_;Q?GJ*6DAS;dofCuA|SF%hl0VgR$7Ya^ald+WP5GQ`Kj9t(r zW+UMy{{$in;xK@~k&A#&259xB^9z}GpbikJu zT>$t~LUC@%8a5(7&;#tM!OL#2 zn*||SWA{sFtG)QTveuIyd@cqZreISgDu(*^go@%JfPW!p7dSD;1QVeU?iR^MFZ6vC5u9ub()iB(oX>%X^%Q;NoAJxGz(EUMXuEto1=}U>7 zdv4YuJ(hD>oi1UrwVlB3{(OhK)MKVG@v#FohVr_8Qa_b?Ya~9;pUF?n5~LVeUap*C zca6QIwZY2t$*x$P6S0Pyc6fpR(r*}#fib)eD8)esp9rZbXxS{ z5;`qk;%{3h@;~$5vrGPll9PfKzfq3l<|s24CVj(eSzQIXlpXH7rql9Mb9Q_+R`GTu zbF@BoRM_}p{TfM$w3`PEHi?y%=M-jEwO>$gU}cYf)~zUbYRk|_*>{m_vKaG|;dM>K zz1!Am95yOm$7<)cDw}s^)6S5df~Pr!{)MS0RSjG9of!3$ExAvh9Id;>uhqV?Sdl zu2T9s=w%(L>`?U+A2*9Kzg30N3E#gRkG-_%MHfDRT1>$VM}}PmIQSvw*&eiLouSP7x*(WL#cWPHYpyRY^~OO>ASVSy;-X@+t^_A zu-V4@Ayykau3gPOUH&@j4q0-d%&a=6ch$E{-YX(fZIz1IR5tx%#~Q0GT042aSyp{D z=@|JGZlo5o_1d*-iG3Z-Jf`K`)=BkcLbdu(rzfg$UrPqY1${A#IB;Pb`V^K}Nls@%ltxwtm?Y8Ac8y6Y|(Lo{h^92B}el744+ zeO!XgMfSUcep~ncL3S^GEMXBE_=DK{zJJ=PN`I(W+^9{~<)BXIn{apilED4OZR_Kb zp4oay`ySWFM=9NiJ0mgb{Pz2!KS;sJ$vP(yo5E*?v&hF5lR-VaxZQVELf^;h2}iFg zIgZS^@A+-&Q(>Q9nfP0x@=##ewRfKy29w{0RKDGQsp;|>jn2orXVn<57hY8fkH04K z^-|fRuD%w%L*i#F1w$-rdre<<-&1Kw9O{-CViOVC^usnxfYbkcX4t*emrfP+^Gf${ zntt*+(yF?C`;n07>hzpUDaCPb+niDQ@jK~teO_A^twjq)BzqMq*dm4G^mVG9-M5NK zr!M&4IpyO&_vCxfT??v{p&D~S_N$9m`g1cql)mvtMts-r>^!o+?tD*egGnp}cj4*Y z?ScW0N9LQ_%9;|UJ$z-@)?02+6lJXV&0$8eNF4guLA|(MMU(1jn-iLr^y*t(`qd`I zl#IgA8r?3!u@Cp+7Ww7zYHQT`+6(}O%$ZwF`%SAZz0SUUf)pdSXJE~PHn0)D7RHA^ zerfh_8zW(HZGjbkrR1rBpf4_`GViXPW!1am!l#9@(Mw9Iab}EV6Z%U9n z&7y4+{2=ymTEzEn_9R&m{P$bAG3(cp&snC3QBSvCRTXtS+MQctAtCU-Eq3lxxCQBC zqQ$w-#hzD=w-_9nWicu@l**ORj7>1}WG&&=1RU%?RVrWQKHW7iRB-aJ;WMQc6IaQ! z5xvps;&}z`jx80Z+y}k(9@5Sg9f;N5oGG|*D0?vS*ls1UbsHRsRG4ABnRzGZ_)&P~?_{_c7(wj~DSKansFkpQAk1i>u}^2r7g|bU zJl@z2Chk|~+w)1rAY;{pLgLH(VSO-4l6s$gEdX6jJo-KuZ$5Il^;K8MLZi>U-^MaY z-`|zDX0^{vrupd`h^WTr8C)5E#};lbME_p#{sX7+@0BNI3m2Re>~m9pZsAd@kowW8 z)ttD0_3H8*yP?%wF%kKP_RRix{$7I9a4)@~mg$ME4l|89j z+d_7!?VP=k5F-4!rhMV@_C$6jhwm@)neL8)8FPzdytKu;7yHZlT^Ao!cklkFDz~f4 zA#zL9&s-&w`J6w9Z;ss{dB^KMsV~PauG{R!d5CBnyleMhPClEFk(N|SsP?15W9Q|~ zz6D-3EIOmQAz78{9A|~(#;XMdI@xL4@&fCPG^!I-lx}%NaF%rX{k)@O?2~If@KSoN z|J8K`v*WS0Ts7sl?vlYud6SFda$vTyg27(?T*p%)N=RBk$?ESxsa&r?`d;Xx6N{e> zVHjmDdUY!~_R;w1_r}`CHKzX{9kIXK{vg$(IVCaR??DC#jKzYUXO7RQmuK=Wh+Wrd ze!b34#CNCDg0ccw8^3r1cieC5n>*6hDyFpS>#@vycFT}EX#+3UdFNX8hD;FtAc<{8 zi}R8vNB4ag%@hoOe&Tq!mT13J`=hZqd9P!qCsX-0J1wZx?Xmf?{#vq`nb{K!xoeHr zE+(9q-`_qmY<)XfCGyzenffbQqMOg?F}b=OFklb67IRqM_|Pk{(`27azvp`naerth z$foUV)qK3e^jaXRZZx-Je>|6P-+Mhh{?|SVBJG@uyI1FkS!Y~2pw9Px8~f#mq#a@3 zZ)N)FsuM@*lUWa)zvH+w*La=cL5EE84*$mrdmc{Ii#Z3S$oEKhyenl>SItTCRdg5{ z+%B)IkxFpB)xV*}|FL$QTe+dq{VpFaoeY0%{p_v1yrCy``5PzH*!N~+9gn=TF*l4k z+%pY-3#gN{92NEY+Tp5bj7J; zpO3jQcm`d!sEuh9&Z9>?noUj|ZkDwfx~@Q{v2MLm*Ob#Xu_VR)1J@^#3fm00J#)Ri z`FnA1gf-(@cU5I(To-6Ac+p!B>hAeCdidxnxG>AbtMEPevL?9_X2k9E?dgHt(agv#}-aywl#phn^8^EzS=5hCf#d=-+%5}6S3U|M(HCx zj;jh8S+<)ba_u6T-U=M{kU6FPuythm2iOM6+x}^Q< z(mX3KSF@bW$~~d!=-_cb`rF~>ZVo`!^eHc9GpnxAMx2rJ z50wM-(O>#zA8)IC8YC#3@bUYLoY@Ojx35eHaL(+w)Kt@XL}q(@tj37--B}#_?G}^Z zEupftw}eZ3gyI3WQIO%7X+qYDAjo@K?MrITYem5X#i0FmOdWB>X@P z_=d|k%*4pU{J3Gu<=vVK7w<$5{yN`f+g--KMk~u`U5DA?_-I9fV&p?d9q!vMpCXJo z_c4BzIaZwOQs(vGk%1D`_q6#|*~vnu(-k2nq^kMegg?AHx@RBTgY)~WN1sOWIDPGR zOu3kF^+i-?-Nd7?#>1|vGfk5Qcdc;K^Le&2)?2r#Z4l?Pb=z<|@gD1)v{ChkO_xTC z_@D1v!}nzF$dO_blQV%@JNKPlb5+Jy(sLt^U+#eXi4wZbKShd3UyNVmE2m)M*Yk}zK_1eQ@s$HvxmGaDbd`zp-r zQ%D^xaF$85Ki}cq=;a(Z@zh}FK0{6ayr>jbLv|Bg=Q?@y^TlUnS%Z@a74KA66|tpm z-(#m!4>qv;cV{eyNADM(-EDv5{uFg~?qn;+jhfr%BjujFoaZL~K}?hfyQBgG3)7iS z%L=*+2@xe~3-)q{?zUEwe)vi?-}uF+XT-ugtEUQ_lt)xm4?Yr5+qc_DZr?^%_gAW^ z#`PDYE+y-ujNLiAzcw7w(A=v#W4CALHXFURkI`~Z9&X&vD`%OHKSCs9aGuyFi*F*Q|@y*7EnM8L~TX7k_5GDHDt7Lt0WUswh zQyAZglYK*#g9kNu`Tig`q(6w-H9zy_IupU!-xe!0vA{AOAzoSKzvIqe+>>(dP{pp4 zI|VQ9nvGmOu4Y{CKHIgL$zqhN?hhg)RI_7InRAy{Ud|x5nbs?b4ht4`;~F=yss}}b zCuhyxt8L_(48kkt-!yu&e>30jo!oC1&AvU~uQ6z^eZOhY*6QHw(?Y)bIf42i#!}80 z9_!=&a^+MZ>)dYV9^Crm6AXQw&D*0AucgGfH+?jaJJ_YB(4vo;DZ;EM3_NkYE;Hd$ zHRsfm-mm;j??I+W$fD`N2YsFQ8#i1wITyA%(ROgdbbo#7R$gMTyAr!`!_VH=brZH( zigXg@iVvowT?41i2U(9+{`B>K&C6ULkUj~*E--9p)@*j$Iq4Gp2%;##>Rhr+f5{y+ z$#D0;iDF`C-S-F1tCMON-5qUYzCGSy;z=wdZk*XMz))Y%3@vK&XSdLkL_>7NvMT3HGSw`uSI#@eY$&(2y|Y!eypZfvINrJKly%neMWqd&J1#q&yR+HP zKyQ=f{*29EZSj2GC!Dq|Hty`2){_-bPlrmJrwL*?h)zlmu*dg0%qU&VLu@EmwZmZ>}<02WM8_91{3mBKSC6VE>(=;aE-c+L3;iGr40AvbKoLY>s{7GP(M&$zz$H zidv2pq1NLaKRpiIZ|YNHv$fj%scwt5^_re@SNq@P%bzy*>=5Oa9$Z;R6sOB8N?vWR z#dg+l+Z-RC<5o+t4_xboe%xIbb;wWbtAlfDFdf)GD4m%E2Do?5#OLX=g3oDDF)5DO zw~W_ECEHrB=1O^bRZ@&x-;?&cSyj+`V~A&ngZS#~b}ZzOY$CmmS*$@9&Q zs+pXr2g%%KvvH|i)~Usg)lQYq zBpnTEp363c!r$+HI>OzE4Ox88xj|dKY2LfeD4<$)7A8HUSSKUCdL*)Mab zx^AuCd!aB6LGe%3wcF+V4a{CHP?M6w$xe4+%HB*DbHu0M1YZPq3A?8en?_WP{E>(E zwWPAs$#Minxv8SI2EQ%hYFoE%Rodq^@0+%Lzqo$-7axJ!q7ntABm7;N6a}v9H$S=O z2gS(8Z`+)5&t;H)U{npiRgL?UY(&pd&!m8b&^&u}Q_k@m`eSqn<6UX-u_3}vEEhtY z&u`J@Ox~A0G8p%E^%0?5F)!bJWo}#5HVKGz%j&*SQutuH=J%`3nJEud++PoH5hRib zizf7eb+sWPIv3<^=Hn-a?amDQ@s;gAyw>%wg7Qz};N51AHrw7D^Ud>nKkHoHHK-Qb zQ=Ad^sbsa`#yxROJ*4BhsC8Ox zqUKYxo5sXdr8&v3#@l*$UIc!s4w2uVUK1nTGQ$_in11X*vb}mYRV3?0`0%*e;U236g_#O!wlfmF&?`4idU;Nw~= zqZ?;gkF-Z9sPoZ#5+kY_tjtHPybn&ndcYPYa z=K{W(-+ZNvv4LAPE^hD_VSr&yoi8lxx08DW!PzOoLeb-m-@US|!3!08lZd@KN?)H! zIPywovu^CPPBMEx6QgJT+>0_<6onzhQS?@!qt zqbA3?I62XKtp4pT5HPVX&#fw3{BzBxtEW`Nz7@O~Rg}KVx<|yXA&l>$UPMG)Vb5Ui!cMX8$1I#lcqaPw>-$R|oX?rGI@NM~AGza|k=H71iP>i2^w&-Rkx4J5Dcgk~jyx`O4yxl74d_#>JL*va8A8d0o zOq?Mxa*Ez~b5O(XoTaNq?gvp@QDe~|PLl~{({0DizF57H(=}xsl9eKBWVo}K5Lo#* zq;mN0rd@Wk?@V8;uTb4?D#9V<&{2HL%BbSykfvr=dMjgpfBPGY*us6~5|g2!>qL+I zsF}e%jTIQDFRxaTaXR!=iTfLO<4@+9^YIc{!?up6cfP;by zmHYdnVr$<%Admd^^Jmdbb&kyL7;{y2@BcJp*BMnG-0;0^6yGMqe=qx|fc&)9L?Nft zA7qVr=GJaI#`Sq-{p_$+wYJ>VD#QNHgj zB~>!kjg9LLYNdy5(I8U2?vFy(t$WGgpvh(y$C{`(4TiFE#8bjsIeSJ}#IDBqf)vfn zzW%GK>@Z+qeDK)#k`mzoux&GgzcMuJSVrsdZc-4 zxuuonf?n_3cL+S4r)4m?X*S~$fy4iGGX(D-ts~Tf*D7>mx~I}iNbCu?w02FKvk=XK zb;XmkY^8^Cy6HDDF_>w7jcQ)+A3U{&avF^PRVjhbVk{d2=pYEroeB*{3$>ZA!ln_; zqQtMBTJ4#64dM2x^)`lclHyKF4T03lJJ2U&dQ}6 z)5jiXPn}f}bHdgG0sXum9hYTuXxJ&SS>H4A?u7m z1~3!KE)|%DpttH(Y9hnO$DhsU0r--p09lB_Sih<{&Hh0M1vQP6a!lA7^@aFwjVcMA zs^P7CHtWgdc=O5Bh#jO7^@zi-oW&%&KE}{q!RGQnn}6ZZ(*xj=u~%~om#W2^IXQpy z^qh`@XF>@UNK}1|Cs4{ddwW}3QGwBk1*#tR*yVI-+{|JWEv!$mQ9C-1A_=(P;ACRK z45K_Y$b)aszFZvtgwKqw6T)f|D3S(8z@R34O0uR&C9*vh`yYp{!j`r&yU$b&%YdrD zU9+f})yT7}{exfUhW>6dz%19rrBS-^cBKb^3Wjf4$ur3LMHIoV*Qz{k-7E*Y z$25d}Qla)e9NAvik*h;KU~g7^u@PHb)xX+gmLp7U|YwrbhoK0%b)h`9H9Aaa#y9n`P)f# zI-{(E!WxAr5d_v^YxD{-luJ+dnt4oZmdOqmxZwQQQPwvifr5KphwC;41ZXdZJ!!`md(dHx@AzzB64tud&BZBvbt-~|esyu=}@DzW=7rsQLD;_gRzJLWzRdy6kSSq-+jn;Zlb)uA2WrQ1`SNqz>ZSr2dX* zB(_I4_>GHBuQ&ERC`RvBPbd4^@uh;L;-m)XDKYiG;Qu-B12n;6M8vUZ!P;49=v zFe4aWmXt-$A?Txc10!o9QJgI=JY+M-x>RC6@8>6;7lD|CcwmL8b2qY8x)I?qx7YRV zom{%gGF+bRPFyH8_yAA&XTc-R!xW2rRJqf_r=hv5+p^HXmZ^jgagz-Lj z)9klo&u}X7q<6^?f1{aRekrh=BWj_Th}HcE@r_YofDez00t_HYXHd=^-d0)s44qSA zt4&37d05<57UW#PUe<1OFqUhzsj8_d7ha8bZ~=`Pxc+3q*QIc9$h64$ld^#(%?cuKn1`ud zrB#08`5g+aqzE&*UQ-Eh#OG2~3Tn+<3t7Zot!z&UqKBUM0BEW3ZgH8i@Fc3hPP~j72GPFqa4Njh!fs{;$>c<^Nf2b@!3-Z5`{A zh2~nX6UCjBlgn#=19`pgwkDTX3r*-x*>Hc{S@9-w7iS83zI1F12=U9L=!&qNHeg3P zH>ZsDBy%?drPbotyd5J9Ar8JdhtZz#l8TGpa7AuTet|T-^mkXP znrSMzZ_0jMQaC}oTUM7iFlfD|tE6k5Hz&_#@A{6IX};m7b<_haZLAM`r7szR4}{3? zBgL#88k?%b*#DUE_~3V~*QHsYpvt!yV-Mx zcZPxE%M81an@~A42CoujZk(j{4`Jx140P?pF~qO<>P4B~|3TnYFAj7NAAZWUHgfL# z-Mah%tK0upSw7d94wcoWk6m!RZ-=w=BRT9=y{gFkP=mGG!;E~JN%;z+XG2j3=$%I8 zE5(mj$i4YvHv^=`KI6B?T(!3_x?%R;*VU*}^B5o~4>S%9GY{BXVKnFYFyhb8O(NoA zZ7Po=Pd?z2M!SneHiZbH*;O-mZ(9b>gx^u@v>njy7qU)_zbK5w|fJBEsBe0emZ1) z8GKFjbEEIa;2@|Q?bbeE zCkoT?ZWEe>Fw4%5iMDtr^fA0-SYo`XThKjGr2Nadub0)}AEG#4u>+$_{$HloPs&-j zCSjUJPBT(wjY;1zGCpFa<6087*u%!|Cgf%Pn2)y!#Gm`EdTpk zd@O!n?^f~s0u^#m-K?E=2t(Xlblu7)1t?hI0a)Jifs`9*W`yF?Ew=^>>jwytXm)w|e$ zb=A74-llg!z$x0PIA$cJXA|t9lt=QMW=qn>xv%lS2S=FT2cjw*d(+5CQvqzbZFiOAG9b-)d}a-+?5kUFK@o6mn`k)ymI+x&1iu!J8U2q4Ntzhd(L5Sj>O!alpWui2W{Atafjd z8_MikL^$POhx9D$4T|P$oimkPLcB!Gph&wvJ*ZKlcF746TIOju+7@5S2fx2bljLtu z37b9GM)_0#iOZ}nIhs3uGPgR;h4p(YaKZbCn1H0NS%njKrI4nE2bXI)R>sy;UNve2 zcB%eBv{Vva%S|QNt9DG64P2nkQC#dUYHr$xHg$&#>-WE#44VeKEa1by8kppL%H^Nhe-;H z*OuQlX_ws9-Sqtt9I1sz+*b2S2EGPX`Tn_Wa3qcf<#V%wjO|Y)FKc8(3U;KULl2(~ z9@|XbfR1)kc(~IhIzwZkrjhZy!#v!px#Mti^o1T?$h+kb#dR?}cO0jWD0&sxmG%~&AszNu26^Lji!jKoX1hss=WAVenCcTv7c z8u`Bwjlg+1pk9(u$rWFF967yMys3uck+8P1x^Q1H_=%q*1T*gZgQ&c0s0)#-OV%8K z-9&92Nly--P(1kgULg!1BfA&_K}m@ftNZig!E;3TX2M6_?rNL=EtI?zFc>eD(vvZi zH9gO+T^r7=oS+m)Jp7Tu;8uUg+XzlTiX6xRGwl7t*9(#vl=+vG2Vp>flD6R~Y-JC9 zM6TUr66+P?&e#Rc&`-mun^dxp3{s$o(;i~Qw5N{@)3if_x43jwqQeN0%ySS=)K1e` z{qHsDsua&kskttiHxZZP4Fe%Ffd08zQh2N?i_ncbz%@y=W2S6V*Vu)&0*YoxV|k0? z_&Z<)&oBFSiio&iX`J6#=$XL<;6n2p4>WDU*o2Ju8%H?IPwZl?%ehct-hhP3r}ioGk#bhLkJ zXR(864xW|1bPGUFvo0`jEt$NUcKBx?#7$Ln>O6kdfC5?Uu1;0+YCY_xFluZbUe?Qh zibadCG!nc;Yg(3nzwM_)Vt3uE|r4WTo*5 zB0Kus0H6k3*%>lpX`u!Ku>Ae%SX-eKXE0~fC};ZDbE068dl(64Rb1D{FIk&mN)8xX zDT#3?%m_-);bWp>GOGqWq^AyA4fuD|n53A`Qx?Q1eWz(NhSgh++lXNJ1^|>nCc#OfGd} zi`=}54XfS%SwKg4J4N-M4uxGS9_x=dRvSB~HQ_a0n-e?$`b6pvf;ALjS}pv$;we|< zTo}zzvSv9s7Z6U6MFiYi&k9Hr%y`v=4)wo~8FxlNXj1Qhu?zYZVcA?`VuVbY^BEIX z;~WJLl%0_E#B=cg&-Xy>rpSKG4jq8Gfb~NdMn}z<_g1(nSVoLfCMz^HNeH_n z2wiWmEm{sF+kEhIX#b$xJUg60Z~;{lo-`K=j}mX7kwgb&u26gnOyDpQ)lP(6&q_`B z00O6cI;gbuhp25`o#KL6+?tcknuT{eYjBfI#YN%%B2N)+sN9>W0?!tYcXnlE#&`#+ z#<_P6=mscW*H?f$yXaCWyo>R0Us4_?Y;Z7<>H_V+cg^Q_%Yn`*n-p9IJ}}bsRG`KC zW^1x}t#sSDhzk!^VAU^Oikg+(NH0ytio~|=KB7Q*!L&(k=k)2$+-Z}I8`#)AAY-#+ zgme!k(Us6O!4MAXF>;z~R)i zpm94!Gk0t@E!O+515LXdA@gx}VGa(g)>==cAg-80%bo-MHk!eI5ChM3LR1z5jL)Gt zXn%Jxw5>cN89!v!eon|@ceG|ox1(24TpRF{ok}s8?m3DfZ=4 z4F7S;0m2N#Z#XWUfI{CS0n{baV7`Gx)NQrPyv>f$#rn|qW0~>k&>Tb|9BqXN3iu12 z)2k6o%n0KS-G%8x#dVy#r>s23_Wps=2vGQ6luKHVtpNp&-KC3s4-|(&w<&X*GA@Cs!nXoYP{ogr$K^3ktfV9RuP5MN_uSvc+IUEq_p&S%ivZ>7;z@W9qH{)uU%>Hh6Mh%$MSLsRgmPZKl( zrv-u&O0b(*-Esmm;z;03HX6*2{1&^87^&vqk_cNQXDIe`h)eJ1;M+SjCWZoq&noa+ zPO0Y&f(V0VzKWNya1P|HJpgJr^^4?4S(5DNzqMRDekigO$MNVs!V46i{EFeM>Lu>2Qm2a{p%PaZ*2Wyrt(b#ySyNkbZPZq zWC&^<UJz0xt^`HV}H87#<3huPEW5n*%d(!6SRrt;^yj0TfXx8jIxkor}G36j*)= zJA%oy5t%{3oN(&&g+w}c09ZZO9{ge>J(;7iICl4VJP$sv1>3SSL_>}RY%M{GR_dVU zJK|v3e!&til`w^yQ#y{c2ro^ipJqk5U+jQ25sw@?!<`c48`9(NGEdXwPhL5m^cm}#07@9&G<|z0jKHLgYoOBSmK#B4CJ7i4bcs|*?3jQ zz*2flZLdVHn$pKBGAu9BGYPUo2^uVQ(q#lvSpjH&hn3EqT+BvC;yzvt82fWG&ZXPE{~${K7j5AEuS@{~9vbYwLV@cO{&Qc! zF91WKVUUqiuqm^O8arZw{ntRJ1P&D=le{`gF=uE_@!FmLTde>q46atVNci30(bn%T zgKD33iDi3-P3l~G8_WFTN>SZz(}MwO;%tt8nqklb&_=O0iktDwBy-24(P#s(nR^pD&8{g_#xu8j9y$Jk^nJ~imwV>MU z0X@lDdZnY52Rm%Jyi&0LDQxV$yOryPJwl`8V>OC-=_f)uB{7zO9?bdXuX) ze~v61PK7)>c9U1dpZve98_v$@l-GHE%!h-<>w0R)%wot#liCD4^P+?0^Kzkf*>=^k zaNB~O z9Qm=W2T z8-F@nc*e}9UJPtlfexq?h&{bEOG^G!s+_fj`(mTa`y^tgfGJ}iuV8Ydu&Ui@v4h^| z9>5NxyMJX-_w!&wbO8I!i!hOu9yQG~DS+Z=zUk<+%Gu4hKM{y-!J7Lfm|`-0Vn5ex z{{)p${;}S7L;ERhhny|L{A?l3$YsyNcAKT-I8%e3ZSUuokHVx2tXUgb2QE??7<(p} zl9)D$7O2GCcx&+8NjUTAU2h!-_Z?Twp4A7R|AS~YYnS=xsMfL4m& zM%ZK+joro()bIoAbmJo%GNC@)jKQ%uo=)iod!^{D20PtF!$8OUNBv1;VB zDwU^`*K?lNhuU!993@vI8V+NX+SHDf+6dP?a=EMw^vYCy7Q%nlM?QhYQZXkivq?6- zEz!8Tz*p=GH*;>34o)IMR>oTqrDpOF;Ug>yK?D1uL9nNeMN*Jx^)-Y6?whdVt<^ML&-}01=V6~g1#}R(d>wa_(1=MnkDo2 z@^lVCtnYPwaS{I@`U;7CG;B}~bMGWeQc!f%gufIrYD%Wc{D(@o6|&t$CVC<&S!BR- zpqV2*5!t3S>25w({MWsK3>e*z^aXAU+`r;;4p=p=dH<5i}rqs2C`_Q^)ul_`@nITEQF#OOu85;!yyPUK>i0s;zUNO`@`n)nzr#>g@ zMrsV#xg$@?$*?{BdiCIQ=0dqUE)OSDxu5wn9>zR{Ri$5#_lHJl*BBASJ+N29%KubU zJB+_-tsAbtkoT5;gQT4)YBH5685?nv<9b!AVBUX;@D|NcJE@sYE0XZ_yH!wr%4Jcp zO?W8d#M(1HAtMrTGW{a%swkQ#2{BEtMn*6o1)j@DgE!B@rU9dYh`Z9gaw|Bmm1#_a zLh2KYviIWs7yY&g*3Ek`TU{37Yn`lYK& zt=a8gwi;6_%P>0m|6!2DxOkjy*zCXM3rMXaG7na8r2AKV_@DiQSUhyzXn&lb{+@H@ zFLuh+YLsc6e89lkA0Q3ppQLw9RE#R+L)@Zbga+Bb%?dS7{x>BF5|pAJuJ?v38fno1 z)o=!j?5@CQh@SlUv5(v;gsSg4!UzKW@Hdri>+I?vl>zT5y5mpa#9Vg*&I7S@AWJXu4m&gPE#rwj}NgnGAo=*OD!;1jB1ES1R9qBsBwMis}HABiSyp~WgjZ}L^h-F^9* zZ+~<6{QuNB?eAY$I$qwTLdNQq5|wlajn*@}!`9PfKp`>G7pwrGQUS8ZyQ;|zX;)eO zXyS6p6c+WJc5&xr8por?gv$-7#%b>By~e+n8z_x^EnS8U~8Sy-Fdcb?TVmX+}gZYr(_Ud~LY?;{|MH|%i&m#tVEiY-L?37g=*P@lY?8VM&YaV3|w zrD1!ThC)YF{UuCtB>n8*=@-x@Oi87N(w3aU#l1f)?eF^>)ccF*Y`>l+| z#?`0eY9$N^=41?*LNV_9bKN_*BpwzSfP%7C8ht>C9#q<**x#Zx#=-IT z*!cXho1TdoHBL!+|IZlr-B|;)gQ}Uu8NI-0KnY=@t95#==C>XV+FHW(-uVZ^eOo^q z&FC2}T8d5IPP~f_x>XFX4VL#6#AN*F?jq)a4Z=({80_)*zSVX|R@bl8(M`&bWPCXY1>s*fxm6-=J=k=qsg_5 z{fQu8bU@<*$D=)z_}bTG_zhSy`q6_QvWT6>RFN;Y_} zF_b}P-)_)rQh(rFztbCc&T*#A&w}I&mPrWp=cFH7{V?VU4T~=H1gvpa4QKiVWh(aC z?#8{a#^bF0J~tcg*^MT(x6zY=I1IYd`6G-KSZyTM%%%~l(n+PBor23&$CaoYHDR1q zljcq>%f9-(+K&HI9c1hEKGn$`w#NY#ODt z{Irfim5mZV4-2h8t54?bMPe0l0?By%HtqawPzL6u^jf*BiN$|u#ip4ThTCy$^ANhg z5>VBqbKAOCVo)Bg5smZ7>8-X@?X;i7tb5T9`CQ3RVcySgoA|GOOV!l+dhnrxx2!Oe zf`@GG?UCV9K6=BrvNHl)>czLWnbj3F{8q36)peV)22Lk9k7_ZB)pKc}zyZ;(RMIaN z{B?VG;E<7(f~?jVv%y1kGZ3ekMH`4^)>7K1MvI7rylPc^;fLjmM&M= z!3E_3bH^@j@Vt8I1r1KGWF)5GtcI7)_@py$vBuT14|KS({kKodE@pYVaEb4R~{k$xMSB-;R+Kub9w!Vrs3>` zWLMp0(vnLG^S|33dYpy=SxDVwOWF{`7K zNMJ%O3==r^nk}NR33wS-!&7>CP>fU1H_&tde6t$vpRReVD27&BqA{vzyH zF@oo#1VDH6<+ry{E9;TOF)1quZew%E@{U)HD=9v&8W#?ZJPWw8&ck{1c}&^Vb*}lg zs>V5s^6~g0iLiLAL8%h|5u$lupS}j!^wP{4x=QrXG2YoZufzn>{V*;l7v&FYPzg8* zKCbN%|5f!ll9_DB^vw(Ddt^;;VpPr!Z}_~e$99y97xmy}(806(m3Sp%aKWK!JQh>a z2kfw3Razw+JNTuGcq^^>lP26rp*0y+p~E4Yt>8#AxNLTJ@nTyoh(`ZImk_@C)ebSj zHj(|)-51^%qINQR0uvW>t$A#&XSZymWrClT`J9)=ve!tfuup)4VJ{B`O74&yQct(l zOQ|)m@z=r0%(Rnd_>=;<%Ym-*Ze+QnTJ86<`bfzL17D$)ct9$P2z~YEM2+xDCYk4c zoPK`?aPf$&d?>BZ(gSMo@d=AroiGqmr_KQyvb_I={f_XKh#lIPE6)WwfydCD^1|Ai?b5K(dJ5{k1A`b1il}-l8#0$yh)%a-75wQ&ThN2q zpMELuc>`hsvXBYI#sHa`PHY!dOy$csff@I1pN6c;t=^<;wKcpHc!DB@>!UvOnt(Pt zmV$g-aH|2S#LO6-Qj~O(?MRE}!-`06{{c5^W+bny^d)Z1akN0KF-81*Lk8d)AgWTa zl~^X08MA1w8!fAMohYS9z==+FbO1zdM{OryTXXs*kH2{Fn6=VxIvyCBWXZj=M>InQ_hy^K51iupZp`Z-M4n*Ep+ zq~rZ~bwGsIINI*ZDxm8C(L|pd14}k^<+-GatZLz#&U8W-Hn*DcsG)RvKHk)9S9DRs zx}*$yP2ifewT$tW>rR-sbAwczp~!c&2FO1w8t4Eu&|(CWG^hcatc{_9u#xL4=M&8 zR{+v4xoU0VbJyFZ#%tTjm+2z}7mO__m_KME`a<}JT16`JN1h*|TlfIk6!cz{SMM#@ zf7DHXeu>=ysVVjxF{JLo$N4p$K<6_lq7QGdv*^ck0~Nn9>gV0TY1y>Mn=KUJ6Nw@o z(Eo@||#E$(snR9cWXerd@ot@!epjHbGVraBS8Dr@dvu_}VPT z+c|ZyXL9)t6aHk%a1-{Ap?92K099?dvR~>YGnQ4W{lNq+vunV4D|UpCS+XswXu7jE zd~R^)_3q*i#kr&=PF^{EwD&ZGG|jWLVuFB19iylOqifV?7xF-B-8%V8sqcDAM?q@k zEA+R*L#w$Kd9med8OaL!xe&shAQczRY5kE!((7OAPd;WviXEJ>wdnX(#p|`Uk&n~$zLu?Tl7>@9 zU0nog97Q})mctlZnBdsZ2`WTzI$%=+e({gk?4%q;AJWmwS>KOinjpg7aEUl^|5ai0 zm)5f%Kl z1`$^A3VppJa(Cf24vY9BMIhc@y%JY6Uku%9j$S;2;-VQi6rroj%IG!?ltPe0-fmSJ zn?o70O-fHaH3Gm)eU&SK)JdGqpY^WV-uBE=_-qy(fKBv2@UZY)3=fG!pc#zWH6%D;=slKVfH~3rsh$zP(e_f zRC7rYTxlc}BsesL&_1AGw!JPJsWL&El_Tx}B~V2Bc>%o9(f3tEs?Gco8`tmybgt0i zW=q{ryt&j#6Zw8$=Z)r~9^=HjXe2cau|F$2UxseWabbh{&neDj|bjxkTmQGu`jx@FrP3@uu=`EF$LQd&ooztc}^0J z_sy1!f&6iZ)66ubk(@0Zw__QLY;P`1e&^$)9Xa!F^F{-_^XZ{xen1PqMr!xxc>>fs zc~T(tM>m}~P`{{14yaM2shVRu4=|Bc(?ya0^f>FJirvP`%oqUYHHYiX7fi@tDTKCJ z#NY^#+7K!3@p`VIM>P}vw92S7zuiD{!xFtpnDeAUj=YH?+wDaIYM^(-#@%M)g{ju# zJk0I=P_e2PdU_>a;(SkdQIWpoI08*?W*N3Q(8Bh!w%X-4>Bv0U&H7Xw(hP3Oj(o@W zqcT`QW`Lag#uM5cuLZ@ljJCuxP?XGRwr*yU(tp!OnFa(IZg5G$jACeI_Pvx{)iefl zBIEx$WDe{ZF}cEOoQ^_Xtqed2{ppq&{kO51eQU#&&AhZxHerqqj~p5T5t1sZM>w}D zgkvcfX}3y7&u=`;E}-tszP2|^Rok(L>UhbYWsq@>`8`3@G~%kIoT}Ho0UX$!#QPmc z(y&|;Gf7qEnG&sqmXlv|)5$i!{@S4ZS*X-gnVa}GmCJfXp&qx-Rvx5{aThKB!+ngI z-$x;y<~97%!TKMB53%!X0Uf_sT8Hz9$>t*FPaQo1vuMm)(E&TtE82k4u_u)h&9QI;|x>v+>ZW1DEVkQtPd;k1-NK6nUCKbH$9um*&lC7Sq|*9kVh}L!Okw1 z)n&&X9DBj1G3zaM6g0rw-#|-Jg(0SM0n%P2qJI|be$}1CcMq*?%fxp$WY7^VU8>zJ zu6}P4#Tc5#bhH1C(P1az{vBK7Y%KSdWEo=q7s*b?It+kEQX8o%Qy}8L|3+j|gr(Y1 z3Q(GJn`SK}<`11=;TArzZ9eLGRsh+7GSS{4kN;C!Tf0!usmK~6N%DjzSkWrK(yE() z9mGg{hr4mI6B?4UMkwYeQsp58WQ6i1a2##**?a+O*4$&9F^U3?ge4 z%%#K3b@GABL3dRe%9F;}^$B#rVmhyY!CgDTZRteyDYE04u|bTRZpUb)!YitMk{dNe z3Y@VNA(sQ(h!*6u7175(0WZC5f0-s<`f5H@RJ>(L`9U;}9`v}XyDAsw$pHUqh7vwf z>#&p|16ZCIlo-M92?VZk1%O~Z`~vNgF&+OO8RFnX=ccby@D$qI%8MO9xIj$qwX(?k ztkh_61-_24%N$?%&1fr|S+7zn9D(Wx-Zs+psguWyO1R1Eu~>1%Ojo!YB=SQLnnDNs zbZ$OUa`ic+HV3SssoTX-$}_Yz6B=C#0$EP@+nS`a7I@+uvy2BP=gtg8jI=JjP%v|e6Ghgoh>w=_tb zhFxqXye^nV&NBMAmC(>$RHQwGgO?qO55xC$ zgVYRKAH%NKKm}%dylHp_*Mo@ouhSqpe=cSN$}DEi45K*5dL3POw=dy}T10{SL+OSB z<2jA?GL;UbEigjL^kl#5cC{=!#(CiU!_wU165*am$ynESNo~n>nhhXYEJeQ2RdGDf zHE}DFEY5TsEwS7tZ*YT+Va<~i@DVM@IvYF?F3Zd+3zrfG*F@bwW9wd|=G{B1L|p@+ zh$p76Afb5&eCA(kmoKQ_=G(TZv$i0Qtqh+nAbINqnKKo6m2>o$L2X@5{#MOG9hMtm z^U-(N7_!}U7ie3@AOjv2{v`y81&zMe7}gb0`sg8Ak$9voMGh;Evnd`HWUDS~UCaIE z$dOF;{;69*&{~$vC8-`Dtj_NCyI&l$kT6vPN`=(ywn?vlENVjW&1Z*naR2U;SdI3dP zd)cTqa{l0Mi8cQp_`yj-MaY*og!cEW%Ke~nd>}0L#;}W{TV^v7@jr-RnB8~cF=Nqs zo1=bga^64@DMMdUOat|KD=!w_(mZbYxyiYk)S1l0%y;<%+ZgfgFOge;=AQo`e8VBK z>m+V6At>K4 z@j4~a_`)T81E$3%+%ZuHXbmsxe+rEMl#@A0d8h=d*_}{!jd~k_f<&(QM z%z8-KR}_Y=O4Mfwod=g2|G0$8jQy45842;aQ`x~x)PT!KGom_6)9^!TwRr^T4w;P) z=fj|jsc8ibq6n=izHTbdr)ZAB&#e~Zx8BWfy;Gx=@mCMe|W6RQkUcO9dA(q zze+jfDLro*0$z-$G#jl~qQ$d|O#O6@-DM0iELaQO=;I%$^n|`Ar3;Kl$K4*{*o^){ zU@d^o5byfxFKz`sjd!$#$FKPm1vtD3h(On^X5oAx&-?2Uqq6(00lH+72iJ!FS-_$#Z@xQ*^4Uz(pnCuU4Kx9_tQ&Ivg2+v!OpxK=YB_52Yu#j1(A|G^)o7D#PB_?hPh(udR@yMJUFF!AXrgKb{isplsa8WBN z0=1Dav0k~!Dd|-shaChl8n-}`0qqfN^yEr1Jx^T5C+*t~4D(1JifWVF`nV!u8Mja= zl;FWHR2jUu-d5;1huI(}|1&v!8#?2Kax-)geX{HW@+!1Tm~Ki0BmV#_adx;ALF7LO z0XxXi?1T%m@mXTs9%cfru&~`#7_LYqB<37xe?ol4?@&zRBd~nUzey5Ru{K(t!*s4W zugn7uvzIKhc7S+ih)z64b7D*pUGe^eB!R#V4W?a5BR|;H#>EhPTL3YMb{WZ%4xh2s zqod%Y3L=1*$lVe70}Ga!+_~a7y9KqOyz6>RN&W$FQ0?{DG=hv0^5q)k*PO* z8+sSD8y(fBT)DKz2zN?^`|JpXl@k737_M!PYQU0KjYHwb%7;=_%}Bndq+Fn?dYXK3!?<=SoMREAWUiny|ML)>LJ&`~q$MDKqaLWY%3NHZhoO}C z_Xp>sBNc}$LAY1m2w{(CJ+Ywi15x-8_0vZ}LvDuTwHqzvl67Ck{wG{x5(}SsSraT@ zeJUVmr)7=kP8w7C7%}Cz(IM@7#_SC@A3=jM__jT^ETbz<>J@HN(IZ0};W{FEtjW2N z<^jsWIbk&Yd{)NZpY5~svEMjlBR)A?ZJ;sQhdi&B8Ts%E}dsSqPtljQHJR@geuU%!{gEzJk z=3%X9%3Z{PtI+X0FrN-d%rOKJQ5F<7M)b5c{Ej+2zA}eBkcq^_de_KbTHrBt#vJV<4b>16 zj91&4c;8;eDxjJS|JYoZER)&r1S=5cuan~-Mk;)Da^jI+4mQ_7h>l@_sYZB>w$9yr zP-;>K(j`QfTJZ^1YTmGdV8(%kZecCRc;ACv%sKzqK>3W-!%QOKNQP3JG3zbactTK+ zib>qVxA)$lq}Dcv!c8|;FK33)1!>eeK=$c#s0G5{; zyjgStKb^1BjTNuI<=O7qC+XYw2OQ16++!M}t-mGkqYl(qbryQ&ObLI~8RZ_ds_;z8 zTzu-m^&?Z)`o`AcBFh915JWpKQT*Z`5dCS78(2+9p3nFCt%8Yg^@eNi>+!;Nc&eLV zISh!rW|!d~L~6EGxKrKqPm}b?73+^{(OG8eqcq%_H3x=>j{Fn+8L=G<0d*&SWkp}g^5dJciPTNlBirenAh`xt;&!g>emBlL}hWTENEF)s}%Chvh_osJG znK`|_EjlM6AZD~<*t9fzZp<`aZ_5*@B*q2lOE3;Kine7|M{4u$@*(>lXKFJ-YW597 zCTUpB-a+n@{>m79G_#!V25WV(OEkyxbY6#7I7!XxDf?bRzjcw}n*Ko;1*DY= z=6qN6q7V9rH7%8QxA4=ysqLGU`0e(CM2e@It{01mLup8v1Fi5(TgE=GfT_x#%8T^d zmUPoxS9ms+_fp;j2Xc#<*>huqPB59NYQBIFP7?wIY54SnX(wCTo~VJp4# zo+RO*88upQ-LZ9Rx#x6-)!s4V@=qGgP*N>EF4O_Wi)DyMy0NjWcM7;AE%|?h{Tk`wp?t>IEAUDMy1+d(Ld!ixQ+;hf^9XJO&b;*O;;O&hiI|xRujZ~=2!X8p zgBElLfROj&=e$~8L7No(Mb#9s8DqwG{Jph4qi#`kr=0ZZY)qT6MP_Q#;XangKCMgn zn~;tr3oIn$zy)`Vh11knwi9Ih15*ecsEPTmZ&u%g8M_OfF&dj$-EKqpcPX&QbT&z- zLxns6iDiM}Ikt^UAJTP`ZaCLMrIs4&W4tB(izI`}!7xsunUszJx;8w3`g1ug#J%lEw};`FSrxhHl>z1VTIv=HH!%`$ zdN^3-(jC9@oHsqD9LZj34*DgVQK{z=o8Q1YW2Bjlc*2^nYZ0L|qT@*Ow`P?b_XqPt zeky0=K)#1bXgX#GCvBaDi%!KRx++?REtf*rYzx;D8K3J9D*kb=sp6e!LfMmB2YN$k zPzK~4-yWnvK2;}Q(%2nmx-4I^8{?_=LPI6c49D2a{?huH@9)#~@(tSLw^Pj-$1A1< z*WWidaodE{xkD=bZt{W?9vJ|?KHZ#ntEQMH9}Arxmyj!Ex_#+9ly)BtZanQ!XGdNu%wO*!hB3LYsa1YOC(n;5J29u%2!gN)4l~7?3&^4!>G+=ZC1dys zD5mRYbI`S`{nt`=qBDcZ2m1K5g7ZIx_b#Y%el#7b|32bduuB3~76@V_w%F0VVrz4c z_1&^AS2>T$Eo|0M!+xTxyoE)N;zc!`wT{>HCQjkvVn!^o@r2$7s=T~B1~shlt?^79 zV!aZuZmOQnMwg+5?L&InFi!R5uKv;Hh2Gkw;Knh|lS+9rqDAgf*jd|APt>xC$=uo?>t=8$}yYKjG zQeWI+?`}sCfsPw@(Z223`9qS|L{rcIA?r&3q3pi@pBY1@EMx41QA1L)WUItjo3Vse zNyrwZs8muhc0w^)sjQXWvbL$Lk!VFKT15LEB}-KQbMK?x_xtqMaXK$?dcc z8cD6JK6+;GR#DwD+Z9$l%a8L`^dCg6p@09rfgHP1kp$h;n6mO!M&1=aR~sxdnQ*`M z%*m!LCMuH~e3T7G=j>`byiWL%Tt)otYMNBGm-}$w8?zrmE+Mp&;uXjBna5WUkFSi? z2YyyIxgf5m6r2@*a-{kFlB(1d(nFE~pFD1)Qp??MM9`$1+gD2Tg=n2@UDC60yYQj4 zQ6r|2uUGZ9#rV67{yge;v26dDCwrGOvj*4pKQy=?wyfHcw)p$BoylwRhno#wNy%oX zkFB5hY@hp!D-%xUv-k@ZsN9HYpq`udtZRQ>#KBz^#nRzHyPutyzl(Lr$6dJmTlDmm zSKA6tEjseTB}Dpee#zvehncV2kDDrnemo<4Xp(+MwbO{<(R>e+>=Q>nHf4AF2P>3v z-BY%|59HgcSFJo^|Gk6xKq~jSZHX_ zOuowS_NEsTbDDP@x@{7x-9~+~EH(DX?b*ru9k+xoET_q2=eEn)RtO932`yV>W#Ypu zk9d9{Vg~o^^R@nRe(pZ|6ZTblcbpBb2`cSguWWvE)j-Pns#nYE3S>7-J@QoXAIALK z&lijINiA9F3x7by*iz>7e%Ey|9%0_yv!*^+YF%P|H}_P__IT4Y(-i%Ok$W}e7q9xD z{7ZR<&WbPl17nXYRfvBDQ6)cioW9v@rSF8mPt@jpH>;@PPU$nV1fPX(o~l~?PNHq~ z;zW@prH)FQ#SL`yWfK*pq{}?2_a%fDJ@7g-Ht%C`Vrof=Z3$&_aEfaP{8~Y4yLivO z`pSbUn$1^j7yC_`!glxGKe>C6Llr&Lf0-W?h~vg(0ruAx@AfpB@#Re4R{!kZ#6Rn* z4m~}Rb?nAz=Q#^flFp<}>0YTJ)h>QLnBJkDSg88Cg*U7Bk??h1MR2zIqj{W)RZh=s zJFa9`?Dg1Fb7Jf|t1J19@Ra?2Uki8E+n!R6@f_WG^1AQFkJ%^sGh?Seq-@t3x$W*@ z7#psAyes)!SN$ww>mc`=_g0)0U$QcxZI-c9Mad$|`lYj;2%AU$koU6M*Rvt}bHTZe zoYA|-^p#XwYL_eNn_S;Yv2jUFQ#`Y$^^wMUxi<zcvc zdi8wl%ASlZDvGLynRgcl_?FD8nC!$0>uS6*H@{Ys`tUcA4!_YZ2LJmu{J-1qJMatv z2YQ0ZWAo9KCg2i;B|9C-Y?z|*&_^;*c`SmCm2@^AY&dupKD`tK3R?inVHMc_(ZF(; zf*~{k59tvyfM6REnc%Vbpysjpq!Qs^?<5Waq#;1wxPV=ZYXBbuB8JeIBr=l03yDdP zgs}l4z$9@vq=4w*RY;)znSwC+fI(p+&WHd^LHHyqU_u*D0vHfv$Y=^B2M@6^ffnMV zA&;c+M}v?#G#t_R6e(jSWGw7-&NxHnpH&El{_igE5v%d#NWfFjV`Rhxr!z$-x|$ z7!Ves4J9>5AfebelZX;_N0vP)V+1;z54H%OM)HB4Tmk|HM1@C&2AaPmjqp*Vu$T=7 z&~S1{Rv@!*(#BJP4G=zw!^9EcC1g<85i9`^fTCbPI*hOjxZ<>vtPlbifD#87gCa$Q zAw?jdS^6J=$L5oo@hOB8!-1Yf5Hu1EjB(yTgAn+D$pI0k0-1r502@A@1;1E81kwqN zBZ>s%6z*%%hJaWQ0kHY2ArWvAh&Z$m88A`yFb*P&BZ6AOtFS%R@YujA1|#z^GV}Azp+J zdf?B80ZehojRP5S#fnkz28p1sldFWPs4VRCUmIlnzlXDci!|dI_=Al6f+Nm2TjYhu zl6plzfK*YoU^cP2lh4Pg7+=mIm?RFYf(-@xzZxD3#y|sEQh*^E0UEMFB9f(^u?Z+J zkmt4&Kf;kQEGKbL1!A+mr3g5%9H6is3I9Qc)WF^8!Ygr#01#=w z=Kqv56IS6;AxYx2fZ;eASrVjEDwmd1PsG5h0|!3SN+pz#OZyKXB8+$HZv`R_bchk} zEIV$(*xS0S7de<~RfMl=vl3f>yzkp}rhO58wZAfBiQ z$xM>0h?RxH?`TXqaKkfO_@W!@5Hai>+h9Nn8vxO!qsl?Z*cx?IoS8qqXaWwR0e+)x zXs=qv2_riVK4W_q6%#`?WCemimNfT|@PCj&4;2NIC@sha$q#6*&7h}2)uBc^)het9 z5AZMrg#qI~0@9$uAT{KEp#>Nd^b|H?0yaDrvf&U^Wj{MNf^SL0zV;NVw(TrhYQ zR1OXYo1>0Bo&gjQDjq%o8$s|L+4^t;(pgl%$8F^!p=dG{7>6urJ{cxj1tE;TPa)`d z0mP0hp~pkKeFTrjB>WzEvl(2d92RLOtj9T_2Mk%TDSS}jcL!Kt5qLu(gmlnD0~_2h zGAu!P02@dkgDXiDH7i<>3ndprA^6ygvUbW25k7g3AOvL3Mgnq#@{i+%3y^1_3krwL z$2}T=4V($w#e{faUl_<2?m`7|C0uv!#^a(hpodjNfqJHz#i2Vc7Zk&G#D9P z*GMP`2N^)mfmw)%c7jVV#rY~7C=W3_lnQ=u@E}Y02Qolrc=u_r3YRni8Y+*4rpS~6 zGO|Q8{s-C8C?Cw|$0o}10htNW!P6k+-qJc^E)W1><2VTLZ*4;|$8o>}NFqyU;0yP7 zNVQ})z9R@O%Q8&@Ua(>;!8I+$v3A)LVmC6w8Nl2S;c)?&un{0OK;Fj%hz@O#0H{Kv zvkh8MAx%HFyNqB{F;9Y06Wtt5!v;)PMQ8KD5@0F+3J944TEt{LEeI2p-1v~rHkt!N zT88!JXFV)_D2t%5VitDChENQ!8A>Ugoem4=2pJ13J_S9=q;o(E4I%T9fH3)xPrML} zCzrw-Nfv{6wV;w<%ts$U?xmBY=P$YaFI7k&Xwi^{cp^t^SdNe>FoB@>=!)V3*Hm%{ zG$i8Eq2xHTIdO*6X-{EZ)h=6%!g@c>5aA#|3c^PM`QU*;Kndd*9(D~9762JB0sB-N zuon=lbsBoqiH-^cF>T`84nj`p57ob?JwoQf8X6MFkm)QKBR~$iLOA1v2QqpZH;v(d zL@)#6O^B&A=>#P#*^NR+2uP0zpnb%I#|7?RWHuir{vv}hxTcVf*a9D4cTt#TF~pSG zIJCFse2P&Ug9DmB47q^Jf*}*#ELec20 z9*Uy`cM%jr7Z-xc`9l@G-$eN&&r%S8IpT(M!bevU5Cob4yT<)ufm2JTQXLpj3A*Fi zN~TjEoYZn0FdJuxXwcbwa)<>KK1PPBfLsw207R~#fxt)jFw__DbZ3Mn?ncP8MIGN` z91p~S+(i%(eDZci86fKf?Ee%DnGKAC{E|b=88GpXI&4KuDRtUwj#kmqU2gtzNccz) zjPMxYTYovT{y)wv5{gXwzdJ}FV+S#@i_=N;MLD+sXm^r>r z2n9#W#Cd_3A>(91(UTb({wX_vhQ0jbfMLnreahs;$3iGvf@di)V%VEYFhnQl*ZtWi zF2RJ1khMYz2pPggDMtNYWXKEW?~ulaN4h!ej3uWpa0v#%7Nr*!3=p8?L%zTa_lPZQ z3z}=+iCPnf~Hvl_;@T`DOacMn0H9P%uwtr;}{4C9Vn5 z1-Tp{fETcb25I5{>48!VsJO753LD@(5}kl!BJ&q|NT6CGOuTsrioj)o1c(CV?O){a z%m4w5435AE?5U`S=osiF%@UG8WBMHMCTM(;2{IdZfnLAC7)61OQS1fAz={PIXrznr zA%)FEIvNBru?2s>2@Wqu2GY@yYbLCsu=yZ?BTO6XQDx)IATt3@K6XLFJy?UD#Sp~; zSSG_-77VDu%p{a9BqL-Vn@@woStA$0s=A@w8S6HA3cx2oMD1AKs@n`feQ}8$3sL37BWE3fu6?XvIum0YCFIZP?D7fB*6t}kU)dwSQy6y=6q1YEGGZQ z5gW`ET4Kb%eLO?^A`#A|NG_(pwhpGbZ4&;JN2#C=BgN*p2DFFvf zASR*&l>-{|Z3rqP9E=G7kram>kU7`}vWHy2?7sq<$5};8paG^RqCp~)Ibp!@0{0!} z3<9#G9L^UdP*o5(A(%Wab@Y&gs~U_@gKUf=lLFw6>j8uX_nLqM-{8P1*ig8Nm=1#m z?;Ykq1AClLv=9q4(wfO*^GOLK|4AzMykdZx=1LdsF0Ex~2Kg?u3mZafxw6<`69 zgNJApmBRvhd=xur0!Ipq(n3&0X-qJtv-zN=gFOvF@z{LIxG#hcjlzNsW-&6EgmJ%A zOSn7WE+7COst#(Kps=Wu2`U!?#870&qzmvx=7EQqBTTZf5i&T1CD2gLA;};hv>4bL zqy?D}Q;37NE&_C>q3B2#AfPJ6E}%TdLC^w35{wZt^vIsgCuneYGw}Cf7@|mt91(>5 zYXVJiFcdBZgh^J#A728jLDtX!nS+s`2Q&0|Lrdopd{G+QFAO>hX)(SXLF41SLu|ov z+yxCNjl1BWN=9?IQF(aFa1RO;4s0>Na)2QbL(rgy+J+{A?j2e>*q|XB1SS?BU08rf z5i%bpaU+qLD80}ye?W!|z$ywWoxU@F_619XO zi!5m>7eNse7~-|a9t(6R&T&4VAu~XrM#Gq7PnI0;XAv*;(=BNiL|IfWj#Lz;unSa* zY(4>zA{QW_TM}mv8(=RS&_ZJixX{yZkIm37DEMvPzeB~vOq30WKkR!t9qkds4rxJ9 z2pMfOpLBr*bk;$NC~Q;%&`5zSX`Bb_%T!)FhF3J@)TNgM!D51*f{+0==1+kkWF89u zuz-9aZb(BLM+Qt$L_@%VNo)pDaI}sWF5mk~P?U6m-`xU>?jUxWFiEKDYo4BF`p$ApzWBvvd#; zCghw23T%d!i-D*?P|iJWB!mVFkHAM0kqsRVWHHnK3T*!0s{YF#?HY;68b?OKf-lw- zK4q;PkvWu5L=dgC0ZSGFhJ-KynU10(UGV=1unK8NWG>!2c#`2F4c=}XEJ7yk^Od^m z2${X`od+U4>Exyj@C`76fu~?cK&HZSI-5@dk{Uq9PB9b!0y0Vh>X8}F443dD#A7+c zBnhOX>~7>Ke|AC0Gy#X?hP;m#Gc3f&%s+K502hcV8;rphN;?V`I;8O?lr|B>TrI4e zCqvgz_uxP_*y$XMiCti0R386VK*(T*F~>^|hA1L<=Os!|;2;u3z=Y7YBU{*ltXzU> z$xeqQT+pFaK#~9#I7OrePtlk>HXmmH^st0v3&>EhX!NI1^B(OlWZL)4qSD!Xfa2in z0U#Fs`a%L|@L9*l$eT@Lubd)PT%<Wh)8PX|`L;|^MsN`rUy;zBp z#v&*zLX-sx)GP_g3tGAr!QbC(Mn?~}+d!!eHNudD5W~r$5EVPiF z&cSTK1qcv02xK7mE`u>y7?6Z?7{Dyf9?0Yu`FhQ#5PURC5Qh9hUEN?m@QCaM98h5a zd{Gb|;7@AcLMETYN3){i8Z?C)mCG8JLE@;RF(jeNT09QbU z8+kk@INR_Y5>Ug*gL{HOVevV5A1N%Ud_uqyTGFC(T24w$OCAQKtbG~7jW1( zKL{CYP^!rWXxu+Cy3&MH38Bz=-`M*kpzwHXK0+RMf%pJ_(ia^~fg?zTfP*9|$^(s* z(fEHF3XtkX2(dFR8w!qbNs|95=06%B3GVo4ElM)V4`RzgjyOmrs{%^|l>=8A1CZ(P z$&~3rVS+sjSdNq=4oFN6sUfSH^#_oh4s&E4D5Mt@7cAuC@&h3TMv!gzQN6ff-Xa0K zZDRsSKpxK?7XG6l=|Rb1WEvXs*nC()u;7b<1e65SfD&+qt#M>{i?rLyj2AOPMt}%` z6i5x0p%^ejU<)=RGOh%a5ITm14sJ#clnR>=^U8HpTB^rJG$?F7ri}$0EUFVUMIxj9 zg@%inJY-Nwh$6OB4#H$`2tGkJC}T4QSAjRJ5V)aYAWIGeO#82fIgZIf%P?E=NI~z^ zI7kPL0gwHn@N-9aD+D8e(n==`9i;sDFybL(EU^AR0p|g1fF4FBimNjB3UAV)DX}x8WNC_ML^OpCesq_7Yy+i!4w7NG(IRO zs25N)S=6gAVuCSRg^@`C6*Fc_hlGze)(10c7w9fzTKZ>o^oPACNg{EuXwqk?^nP zFLFBM_D}M0fuZnYfB<}-oWde^iXaFkm~jZEP_rnV%_l=f0u4L@B|e!?9vl81poSFu z20j%U{4zfJReWd^DRq5DD9ch0K1glj>OUW$hCcX~@tb&HyKTpzgI98r59zOZRBN-T zWysiHN20!u$3$x{3o^wa*!9B|TDFCsrKTscdjqY}N4-?x|oK znNYd^ctx_w)zw8#YpTUp>MguuU%o|eLhZ={p+oMA{UsIDZ4~FH%@CR|esGOv<$(`B zZmnK)bwu1uv3S#Mhv0Ro!4k%69{Nx5b@=f1RC0wBYZ*7+JnCd$P`Uaxf6Ck3a`DKg zrNUc+ySM*Sc0sA@V~St6`_I~*uLYteDa#Xf^-tC>>{;VI^gKS%#cLbYM(FF*p`Iq$ zj6Ex)MvWdm2!Cejla*LoM}3mwC>a^Hq{+x?k??ufUzbPKq}GNGSkyG-SJEvXrB|I4 zuA1GQ6jJi@P}=gC_JM%;zo?-<8*>ltGwr*vMcQsh>u+M!_OkP82_IXZ!c3X)gOxk0ssvaK3`Qv)RbNDP`Eb zO(o4`M}G-xs+_e}P@egv9klI++Y+xyOdiuYk$7&3-KDoxbN*qL?{-((d!}ftv44fA zuF`zDeJyXL2iNu8-YlwrOP&$PCSC6Voq=mwq;FsPFD-_9cbT{kwLHtyY-bosea6|Mu0$ zxzGQR@e*zFX}To3$>>XO@C!Trni+35?{hknuhppGI`=}qZe4|-?L~d++_sZvJC%cj zANKA~ORAD^H%eHiRbr)7QtV=H=Rc-e;oM+r<)2p+X#3Hm@BXeslamc*7|yj@-(jq2 zUTk+`QO20)nlsx=IgQ>5RS%zQy^c{z@NTkNdjIhaxt((=ot~Kn`rJ^A9kZ`{-5g&O z+?I8?D>EUdiGNXcYG-jJC-U&X!bR$`M3y{*t??O3Ksg3-D8--A1hQ=Er- zPqh4aKGApeu_DR_zH61y&sgfBy1j_FB` zar3h>a&{E>DkP=`atEfZ?pCwQc&iyvljJBo`!%2c@NL2kdTaO3QIV=S@s)DrX%T4( zz8=LtYShn$FZiZuvsLrlbb1>@u3>ri%>!>WdTg3s$s}mVm`7AcUh8r8vdM}w3zf># zSMEYy3Z&w_h)^c;RxuUMJ^$)TvRbd2{fEkzg>HJ$O@@Kzoev_Ra@K#XK^}u+plem`ePvdnqLrrG8 zQ|SrC!*@HMO1fFM^4Gn&>$6_9EH&eRjI6}XowfDe-_=jnRAhMU_r5(rUhS-!?Pawp zU+a9virjlE`vX_=Z0?2!ACXe(ck@}Mus<(N0XE^)KKQyV(dM8eB7S5KZ8=(gH(=8ef^jmNE(d!D%&+wYAuOsa@aP){r`R<4=$;hnaz z_JCht+b(5iO$8azwFZjfMisxRj`HiWOx`BueKy-7kQJy_WyT+*(-q^CEbq3}d*x+M z@?7#VLfoh)?xt<1OvH@5hvrLV_i-Gve6zj_{EoOZTg(&Il@W5=CKZ&MQDaeSYoK6g zR#@H_wR46CTT@tGHYff|^g6|l)(e}0A4)0MtUeKcpW(Zbozds!I`NBwQHc;2{Gx${pwOyls-7Y&{a=O6h+YUdQeB)!Xc?F?{ z5lrI+LvJk$x~134CQ0m6deb^2mB)IhGrZ1Fk>O`({Y1WA=W@kPU50c6b$#H5rd+#g zhOiH62qhi1P$8XWu0xiz5Sk@Uq$-pdC( z7nk#oxoVC$=1)AwnJu+-hoM5ufI??!LH*cs=7R-JdxBrANFHT;HJbcM=7WtLzkXLv zn7f^QT-nR0HNS}?^Bbpi89bk=b?h1|V=(pl;6E{Uwx@|dd}Q)znhN_!d-A*z?@H_D z1M@Bza)bK6e11Y4UA|i+_eybO%SlPL*Vc}?mRcS`3qJ)MYK&$Nty4aEs&0PC$4dA9 z<@3sCg7`%Y$i<`eSS=N*2Atm&QaOkh5HR2X6#N+@KR=( z^yNOb7QJa0a?VfZg>aC(-s;Q(rMEl|NW+1x%gmT zewqxE-qN69xNPX^`p{<=`KOzv_S_O**iyDhSXEhb>ePA_@$Q|*Yeb4T0lVm(n@1kL z+&%v+*EeweJhiq%r{nfsy_MCQuO4UIefN#|ZvE9(bEfm2D=qWB*qd8vqn9?J%w=}D zf4PxV)v%etIqigFH+toUf5=r>Pr3M9x8;m`ua=R|T`h-aLTf#*mYqH}-Bm_rMX7v? zUGJI1&+EKqm9I-oa(G_wQ{<9DS0_WRR_29r^UA(ccDp3bw%$s(FVgCsQlHOQ)L~Sy z#JBYPtL4|krbe09s3v@vzf=Ehs@gui*5XFd$Y-rO>g6ICmq!*#xcS@(Z#m$c1h0uFRs}ean}ncnoji$G<+<5a>I${7Ac$g&s6jc7RNmky(~Ajq$Kos2#D+xcw;pzBH*Gp6lm1llonofevo)jh z$4&>>EU0j8ifLOjVZbiNI(U8XVryes-j|C-xe2pqk7OE{)~as9jzuvYD;}R_3#mz1 z9RDe{P~WuQ=qlr9jj@AzZyMvlh@JY^CONy4Iudaqk5e6E#CIskeW)5eGTUpCSWcRO z#lsDC(>8g>Jlvx-?4xPtW+gE9v+UUL=8R#;g~fXg819{!w^kvc=Ws#iq8EbD6@oJg zO()me%0+G!7mJXNePVxXWVf{K%ZI_!`sTco7jtMy6Zz+BdZnM+`fXx%3DaT}0>r;2 zB)@(4L}$sKuQiJUck6F17nYE^yU{J8O84pw-6o?=8tj`-=;yC_tB!eI-LiQ?^ou>) z#PycnX!=L%v)aH;v(AphYx$QxpSBfAFx1a`momRCzw=c|aI#uh8#m~X^y(6&!WoyV zJvM~~`p2)koI89VHFZbt+sccVLng5v=uWpex#gs(O|Q*wA`ySWlIDLOXvw!B_<`1v z6$*dhnzPZxJNiE#3Jg!QAJpfmUB7bA=g`kbL(wu4^N;;}?9WjUgoeJ(o*W;a zZJ*Bz?5~$stW}Yl|KNfSJDA4yN=t1qa!op+nmTKxjTLXt_fKK2{V8XI@4i}FbT_U% zj&9SGc2ez{bnoucb-xLZHHQQa1JZVh2QAOFy1I2HY)TL>Iv2KLFmt1)PSoRp#oTpe z`_y`rZKp1&YcIOKRI1)OI^>btVs^{kd)uXl6s4q`{1isTl7o}Ol^)n!{5Z&4-ZUlF z>y+bEUxneAAZ>%Rx2_6<_Mvq$fzAOXGtN@kUd094svm@RS+m&>r~6v15G&B{HOg)G zyy1V<{x{)sVR{-vr0`sg=xX=b@lPV;Uqs%h7=B&)*lAhIZLzF?TiLH>ZJmGG!(YS4 z!nZ87|%ub!uSP`K# z@}}I*-aFSl#It(ePLamzI!&)9Sa}Jk{DAv=XuGI=z zDP630DR?Hc`@oBh9Z82y4>dy+RA-m*?| zeZ_op|E>EnuMQn&xlEV4v!<5#e3UvluZMSX|F0QVK6@(^cdnd$HF1C7;c3g}d%uc4 zG?trtbCTD5??qeTzP`>8r2Zy$AIfd@ZctgN-}$NTe00&R1DmQ>2W=;>Ouv0-SF3%#P@PT9D{jWbR1-o<2T)*6vnA;FJeSwxO+B$8Qdy8Jb+fj!*Nm+YS&*m5wPQ3L@GI4~hQbl*7_OkVVl&eTG(ti^Ys}&QE zCR{rcxGSnfYx>%*wc4$1H5zyS8CY%=$;xKMCR|C4%0E$jbh-S`oMlx--lR0lG?k251^-ha59u7-tZ=GMN)fBhaR(s6BHQRT| z_icme+lI58#TK{tX1KMlP5!}}xGwTn%hcx2ax5q$S_C`tE^01T(Agj?ARM;Ix${k4;9; zge{;`e=r9pAG7n+a%WaXJ1=)XQMtY~DSkvl)_2Xf)P(28`s(IhHMNx&ENtX=rGCpx zvytxNnKaGxa}GKE)nCuH>&aNfM+eu;MZaige6^gGSXk60iSJ5Vm9u&bbGd56MpoubBk$(0YLBA5;r?0DPD@7)6*Yz{?$c^87TNo9V&qtFL#)``Jueum zJ;h3|_66)4k-i&!DtwFeDmAOu+r@IP%N{BB=QvDxalfxFn&)@-ZR6nD3t_{`wkPYZ z2I`(MGIMwKSyy&PQ{;S{nXr!4v0dUqT?MBDhLYm@RB}7}AH?sSA{RI0S-xM2_QY!0 z<{zedhGhYc)h#D%)~1jI;Rt2OQcxk$0fW9@=7xn8tdOlGCr1gK7O`{ z=CLZ5GLHND=sb5XX_d*$VezMv2E6jp(YB295tIXm~{Gn$GuU*AE*DKtZKgoN=n7-AH`$+6o&JU+=HZ_+rH@70qfnX7|QAd8W+L%4ctO z$oVT;r&&+E%vf;tQ@E2kJAlesIqY@SKv_JK(_N!@VD7mER^J_@qQujGQT8Y~iz}wz zv_5S&Q|5cE*$Kx%cHJ$x!wQ46lWXP~*lt~Y_`CYnu^Hlu`WM=cZD-o##p*uzq-|o+hq!KVI&Ey4RbWDKihBX?~I-a=s@;CpA`WR{R;IyX6<(lrSvQb;}f%8Fj*6 zzq0WNq)m@GFM0H^pKx?qhhOQrWsNdlbq?)6KdQ4dlOfv`Y#w7J-__B^{7nR|ly)_| zGrWGn=|_z2l}h<*1~-7W z#p_hV#07C)7cZVxKAN`D$Fs@X_@sCTcToQ7v@MO5Z`23eWiRMib@CFTOizV8*0B<4 z+Y{iq=k;9C^x{L$&8OR4uu)u5C9dYTo_2f3s!HRoN5&rFYY#0-7Neijw_9jzx7%ZS zxKi@wF{7)V63xB^nqmqsWWK20+91lDqCI)tZnuf2^6zoC$BtT*|7_F!EFOa zhnM+`z?1o0gHIo$N{E!5QnHF0dy|cO_=Q|AkE_E?vha#C2v(KX*CFSw7Dv9&jf-8!A5d$ZE#I`LHIV8Viq8+tX2`}#YmM^Zd> zjB~5?*|oyv%Vqc8y%KX(-}T#c(arha+>SK=64Q+N&|qF|`J!odRHC1q&DdyyMyN*I z?i!if6V?=UJpY#AJ^zel{=3m#>y&9{8g|RP)?8ufs9-RBKQEs1sCXc? z|6`4WRa=3FZnNV7vuiEW({3wFIZLg1>@HVy>-?(&!_!M_Uk96+>SQqrZs^7wi2rn; z%$V!m{JJ))@uFS;hRFB)zLvL5t-AL~Hug zUU4^xGJ7MsO^lMtq_V52Ll^hG>2sx3@Fd@rOM3SFy{#pi5q(2AZl;;cz2{5q>(NN#$0 zZ+*X9m9+Orjd$ynmLpb+Mq@wPJf!=1>MiKjFL<4{)OxAFYDc2ks>oW3(M@{a?3&&~ za$gK4UsGM&e9rQa<&NXDH}S_)*H$Kq2h6`~n(yRiFX)@H&HSB1r*Eg-YJq~!<|(^6 z>Zfp$Bh<_+ze(4;waG~JQ7W425%)rFN95Z=_du@R&X)MvE$3o9Oo!!8|5Ae=3TVTR zW2x{{5c1~&=uH%SNRT>9Pv4T^x|;lqptkznK9~OS&!vT*41E0%MLaRe`ob$2$ceFD z`pz(iKQ|<>ef_eBE@2Y4-&YHDREuOj z^L4}SW9PDdJos=a^x-%0gir8JR; z?jg2cx?4^R9v!MLTMH4cD15NiF#WM%c0hscdqaT!5ctSAO*6YS$mF(&z%!Qnw%Vld z!G~=dlnY9e)*5;BDsR)}nLg5ZSFPFk*2vQ^y$u4$KA1nS$1qznlXottD##?!?_Nad z_6G}p6WZUixDFkG>Jnky1;OnLc!lk2RWu)lwysxRwcazjBhc8%F1kIanr2dJ^~JMg z#INdo^*!F1_PGmOi&`DpgNz}A;gE=|knr|-n%Q8PeXwHPmU;5S+meEeva8otH>|iA zv7=)x;AFSY+m_otZ+Y$`^%Dc0z~4AAyghL0sjVuH4-Ur}9uwCraCvX!VVISc@0s1c z*0{7!Jp0}^$hXKyMbM=Pan1X0zkF2_Dj7=ry8TE{ZGE*}#+dZdch#rw?O3&5*)HWM z(9r!lw>>!3aEthchEw0V&w6*PyHhe05_&)M@f%(d#B6y1n8=HNTUT7**Y@mnmeZB4 zu&lIL@3Gk~pEsX*WTfQOVEeur(p1 zXI$#FIL$f>J}7YK#9IaqXKcfRw@+2^dl%h#a*guA69Y=6U&YUI-x@;EM`2BCH0NA;PdPWCd{2u?LEya|4~tsYzE}|9B#?-8dS|$; z;+IfGu+nWmBc(5{!*(UTg%4dFtDMysyHbxg(#^of_YjtY7!s zJ5;4??*Dkk2ld2i+RdLcFRs{GXzNn=GR!MMcaT}7{;@$n?M^PWb+2#!K(<}mx%Em; zCWWoA2~OGfb{stQVEE@}&yf+k(+>g_BQCcGh2_p$aWtv-H{rJM+=3fdJ3j8%vBn_u z=its+RdH{UOxr%mP48PFrL4ZSa_`tI=8Q=%n;yw~I-f12M(Z8Uk+PKLefuwYVT7CGq8#gH%KcZi;WK3EBIb5ItDfvDS$B zy(@KKj_=_g&SMSP+Yc}M1>dJ}p_zWki7HCnU3^+D=}rBi{t5aG{bGIQi<*7Jk2#ze zOPaVu_LuULf;Bp+HOI=CTVK5v#yLOcbeR7mov#)X^JYt^?faNV-M#InIiI}U zD88>=2Urh2-|re6Qi4xV zoXN|)BvIO7Bf2lS@v?t`L+!MC2Fj_EGdrd3{qSk84N#Hu+ts8s{hhW$@3}}y#XPoQ zmUw~F+sb(+aCcNY==uznsHKKmh;|y^zIQd+MP%uF1NS{@Aw{z%Us^V!MyOQ&!dJEV znp5?D6S^DMFF)9DNM1LVjgJgIJjMvmH0Qj182 zX`iear`<8o^rYmFtg!L&-$dU049V#O*QuW^-E~ts4T>zv9MnrM!nyg#xRiHdp!@ba z70nFDQ|xcz@)eO7ua{X5mZ-kCVexW*<jr0p~EXDsi`}RDp<^~GQECj`OH9_ z=*$B;@>*{9N0W^X$V9uvMjjRU^gcjUR5A39%h_&$Xlc#}V_8fi|B0NP#TO|m@cKI4 zDSnABD>UkcrTtXdsA=p9^M#aO&&^i~YsOBLXmUL|f6hKnwUr_nkE*BY1`K40vkjH# z5excmYhL?UdvxWA{xe}>)dB7M3m#S;P2VUtckiZalNqj&^qKzV5w;O@^E*?g6#X+c zys6QBlK(`DLuSu9798Oy)po3C(iD-J+1bz?yLMu2E$d~2l;6*{bGDclD%qr-$@x5S z<4pK`hAKyiLW4k~r!u{xn%te+YVPDtIki7?aG}iMlAMwk$0tl#oPV=T>u#&5|68e# zt1m``^ozqOndKys>C|9(YD}mv#8u@*_!gzKfXtf{_I{EzpF8)^o7ls=#>ox3d>3k| ztVBZM(CmB9ewoWFy!I8twKEFG+k);+KxgJ~JmvJr-v@C;SVCXbxAmYcAh^p?2|H&-uTJ_pU58-7inJ zygRw(%Y*bA4=*y0M#?8de)r5=JCOYvULMV|N_l6yGmo0QI_l6_9n$+`c2VN1?l(KS z9zI)D9_aHXRwSg!e|D|iYP-2py4`-%&oI~0F{rzttQhKR(pcZ6C3NUsi0bo~<#L;B zHeD~;A7MB*ps+&FbE)C^^fju}gL)J8f8G$8DiW$UXTIp|Qp>dpEbiqQA2`CQUHcmS zO61#O+ulSqe%IUT=VX{XtgwDZ{H+&}1KBp!@ahyX7{b%_8=J6t%zD)qr7tUrI@YOZ zc6^swe{sewx#f%A|LBtmzbctI>VN2d@=(Vbr_&*+3tTr!J`ukXBedUVPQ&!&r7o=s z`jsnx#2T$g+r6Y`qSw@dNslCGU)((zJ|2gXw?w&Cl~a#=TWBs;Wgb<$Kk?2t^J4{P zOWS_zKDboMB}(sh-;rU?B2Al3j#)2Q2B)W~sxKGXTkF0keu|%+3iC3Y&h2oTYG%R% zoh}bvncD-6uk-SJ%RYL(8y0CfF_gIUebu^JR!i>9jcrf$)TC~tUZ2phayiFz@s`o& ziw>k)*!lLj)bz;Qn4Ljee)d%K;^dg(!#b6Ew8|5qH)jakOg;bcJox&JqDK6Y?3fr< z^HGP^{-}LJv_%&bOTUYkdHg1NH>M^XS|FHLVSM9c^O_aS^-pKQ|CMWYbIfdT*Zhp> zCzUKVE6*tZl?M+k%hB^>mgqcm45uWFJRb~MIjniMe{W-Dkj8s6zsXfer$^lG7rPlf zn7Ui)++|52bHfRWa4YSmA1;02k9Xe&lZ)8ZiO^A_Z35hOVaKgpy$?-tt zqZJJ{o)cS&x@y(D_62)3e|}=5EFw@!TQ1J6 zkChtTdZwa!>yW{-Me{n8NBi_&h<7dh8Q`~S1+(c!)S2*UOSLMSb*}44`FChUhq#(f z-*NEM-HwI_-m_%C3x!si=G-|_-!f;}H|iu=-mG^G?LV6|o|xBgovMbOb&I|*r=3|- zFF&Pmla;fG@{d|QJ&%g0sjsIPzV&G(T;1woW8l@yy4P2}9ysC{T~luUVvIq_ zoK_l_bG_B8Xhg@}z%lx@#@Xdh!(~OI%jfd#WGyEAywN{F^VjV;Td%A#7e9S((_o_I za6&BaTyXY=lV2t4zHCYO^#0Nglj7FpHYaDfX?E|js@aq5{LW5S&(*@e;dXR~TIJKp z+P?|r_o1k7FSV_XvE~SU7XEm>ZBF~6&%%7c>y$Be_&*to>Xz7+?=5nD{PoU?iSZpp z4Jms~-kZ}W96P+xi?8$H?5L8cJGn%8ie`90S% z*`WHqr=)?rakG=N)JAp6!Fbd;qZpLb>SPz=BPi+oGdgX zMUCI9?Qf~Cz-X437rk~v)$}!;s)`BJ!k!(eIol-%&8Mjb7Pns&j45#gtLTO2@KE2bRM>ZDU-E1DS?6jU~;qeJ<;)U96kudw( zy=FE=yADTNf7@lh`8Pp-xqc@{>z1^r*P?te_q+t{C-$*Fk_#hJY>R12xrG#8vEU~C z`l}7B_MJ9o#r1+m`eGIf);#y_S|iz0@@@5{(J}i32Zk0>}1*6@X^R8N6*YDBJxxd1cO?sXgtNoH4DVF3(9^_gSd20$E9U z9q=Z-5T0HN+XJf$c)4MM--OE7^*Q{X4NE^NpZHB&dzCq9iqQE(+ehOYSFUgKzu8!I zeye$2`-#Nb!(VupPnJH|y+k|n;*V&TJ0`N?7U`8EIr=Q^3du{WsvV zj0~r*zxQ+YsfJhYub9_}$$KB3H^R!i>NS*j%O*(s`1@UIVrJc^TOIDSjmV!54eO5O zysO+^TOTz%?S<0qn+Lty{}CHii``gR`u1F_$KqT1H#caq&-ab&x!Uw)O+Z$FkA=lR zT+Af7eg-R5)m&_@f0N$WvAJIN41}&3T$*=C(tYXNxiOS^G2b?;hfp`RNG&;h^!gCP zezR;><8cS)UZKlbADp8$oso>5d9Wo?b@`8!#)y|{&-R%aPe`hd%L|Qq#3)kyvNKbN z=hqYN8RH36elH?~SNKfrs*&1(^=ik~nj{7NOuZImGFD(Qx?e)qcKF&tX=T$>8b*?P z`B|=f?%f#+XFgZR$1t7u{6_Ea>K)Y&M$9!zHt$1p9~tj03TD8qX?cDJ+sGm(;_e-l zZAJG(is{)2waqsaZkk`-XV`CkPDkFuvf@<4LEi(acY152<%f?L6*^s6saEPJ6LZO) zdrmx2u-ar6N)Ri4MPs3_0;{xt1wDiySu|Iw3jAUov)j z!1;b|?bDeJMW&;36D{0jgd>tpEO8hTN@46xN+6DZo)VL4_%gwPH8F?tS?Z)@?2Us@ zWM7DxO`i9Z68Svg;Wy#vQURscOx3wlx8whHbX8$dwOe@TPU-IM2I+<&2Bbl{LrSEF z?(UH85b09sp+jOMgkL%Yq`N%ZbHf$S!{*yFYpu7|$E0w}I)wJ80#FWYHYpTXBl&H8 zlhr&f<{m|HM0x)m`Kem#b;VC1+Ni+WJLQ49&W(9DqjS}0lY`sWH#yfRj0@YP+tZR( z^s-cnkR1l0&m#uYV66cH#z-egY-*&;vpTEy%3^4b3CQIB(&Mp%rTtHiCSqLyoY(AO zA^b{AR)Zs0lBt}@R;0df!4}x)ira%IEDXb9Nz+S^dSP*7s{TSB6@|<{0?oZ7=if^R0APmf z>H6kJ00~h{M;P~cTlf(1Y`$0)0A+w6d zbujEg7w3FOr@0DYqpUWLzsDf^`9QWErt>`-Yjfg#X0WXIlr27Zk1_f?B*5Nuub1wT z2h!DF79M+!AfPOQQ|z6}eoJc7xtihfMoCz!zyTWdu$_ne0Gz%1HC_28+JlYrGpYg&)|qWe#_D(+lvD|E{-`!YC>9Jm zyTKaeXRjt$Fs@YytEpkq>+)07Czd{%90BL8>f^slyU#@7;rW8Lf_#yRIKt9oFY+rS z&t~n07Jg^>tniC-d8*;1okp3=bc75^6A{-|#(nHACV&X((7N{)V8(Lk&;ZhkWvx0J=bDxvw|Mp7_Qhd@agslYqv;6Zg zpPoWw*DEWn2{K5$I6Fq#wMI*4MQk%38g4vo?hUeG>a$X!F!8sg?jI=3c|v(tFwf>9 zYfd`)v;GQ8(iPk8j~*c=JOE(VEO(sqTM_oeV_9hZ_56a-9Jr0c@(sK&dLNR@r@B0T zv1h98!ny`QC+ztw#L3w@$^=|-$ETd$YfUGhNcplGmAG^qN6whF@epHmnP!9UP5c*h zQ7PF-G9eF}V<+^6rXKIm32dLX%~)_}tWlQYu;`!<$M>>=Vq4tv6}X(4nWKz@<7Cl3*~R5c zmDic2;&}*PSk*{ztfZJ_oV_;bXLRc80AjM}|*VlkKaXR6~78vD~7?8j=E=Y=0di+fw_vC2u zSpmY>@1F@O{f%t8;mK=4<|5MxY43I$dWK;*%ctx5eTiw)!lx3mSM)w7myjB!<0V+` z7Au_OG9D*0D=ITs&3$K{@cMOTVO$JwC1?;knV442f3*k$4pfaVb+yWru< zDbEoWASEyApH$YPwZC4U@KS>CyhmHbZAhI*x6_%+^kYRy?@dJM%WgWrMYhmSHIhO) zVFW|E;Za3n0Wnn`sC^Rm$=eXc^?gmGX=35nWNRZ42=Idh#r@8RO8M!djD{_%2~d|vXvh-E zaI!_D-K*aho6@cw)=$sDorHd+Qz8SD{XeQ(u4Q%FpHBoowqzZ2iUf6UZK>Jv1OL2H|qZk7I=B*(r=CVNhbFU-MYx? zO8f)`>?7!k;K+(Rb`MYKnGL32zqGHZnyWAIn>VJE#w_~| zu?6h*f&-FppL4DKDIzwUdW|g6c}b+{z%6kKrP&0U{EBZVGwbIOi?$#;*T|#i+o^7M z1uPgYB`GSbe?g2#6FwRo#^r$hdocIlyXp=>$J-Xc>$^g~S}@nTK3+yAt$6s{_?ZDt zxFf)Q_)uu3n`b!w>_Po;{F?fOpfx1?HEPQZ+I#(;B=RmLxJ5=4cBT`#p=ob+KHqsQ z%vcedqoObO`u#}LQ7)HDzQ^;#{EHQ6HrItN zpnef3*DHxBA~^p%Koxrj#w;cX9u%>fXJrW}OBPBju0e;GyAPA`n zqEG_dkwhO;g;8j1FrX@TmONfGz2sUmTE*2hq2Z~v@tKlEG5q1B`eRh!Kr49A)bFvJ z@y^8zO+bt(T^GR{3K3hOwx2!{ZG2-QKL4TH>i9Ujf|8KC_H85d`P}&t1T~o zFuqe5g~}~?kL4Nin9eF8+m_`u(X}9XhgS_l+s@vDT@P=Dn7v0i`A+Ekh)8wG(aYRU z0P4|ktopeR+K|B3*wWR&%ztDrJyRJE$8r49i^1jlBm)!AQ=Z$lc;tsAY@2RZvYJMo@ zb@_Nf{(?MgF#|%KY+&*X=$lggh^*zj@NNP>af@!f{qcqV3XC+W3;_l5&Bri~Z{P6X zj%;JbphvV97VCa=b`iHJ^-US<-BaSFacuTR$zXxQw@r9UseMg?iD-~eUvd9#uUxK8 zqZbxhH%#JZ_5TR<Gh|WQJFtH7NTffzd784A2h&oT8bbf1Iy5xf~4iQ=Ek8-(u0z z$}Oa|80?ga!(jxw#hz z>K@))LbrrGZlAQ{hHi=TJ&s; z6^*M2&TZk*iG#^>No@W5baW9$yk9D#`=*f2_e+=LKbI#6vL)yBZ(d@Zlqpc0Px1!a_nJ?1r$H$O${Dpu@mZ`@qaxd_}n2SiWd8ibrsXrPc;NiWSm zD@O{2XBd?+#0`NA5*fb_;e(d7qGD?%qVd2R|r# zwNK>Ux##L6v^wy@ePlf||AJ~5@$m6zkUe2YXNP6A=dLrV*jQ9%CNO(ke0#dRz^tr? zf;dn2OCJ;r0Y;mhCepB>8|Ccxd%EASX%P(;nVDX`(B8ACM=~eYES|N5bVJ%bnt-eM zf|UEdy?T(L<;!p5{R_fQ^J6^FcKC?r2-6=w#L55Uon>DxS9f(=cLPXy^RC5dzg9`l zBqBw`pBSzCXol-RqfCT-?-$E-tnz5I%~3uG6_rPk$j(pf_+@IHngL3g_r?jT)t1ru zhO)S{C6(vry|cSG@D%PFI!^&R3x33@RQ6!?ji>hFM#z`o@$U<~L#6HXHnS z%M}Gw%ozU7jERE$!%>j1O|zTJUH3?O^~QY&ufxkU6z3-}3PMHnBhU1)bu z$z_PtE4TaN(}Qf3f-hWCzjC=@Y|+&&MsR_W+EUQk%8q^3oef->@P@}-l~GiRg0q-bT!T~TWf1}+mI-LPgPNf-+7aCiO0)lBj^rUAB z-&JxlUj!se#bvY~61a?6gCMvXjfz?tvIkl4r?(lu!%=?1UwTHKV1y%HQwI(&Wv#Qj z7Tt#fEmLOn&_LN*iC$Xt+Cnnq3q_`4spXrn!t46%+* zho@rkh2kKxH&5hfsOcJXl1$U0od$h59bYW<{!>mEu`G|y<&$yA z%SEI8L$6p6-#r!ZPBvQ}?iI2b3*%hJTTDIDDIB`~9hs8(p@+X+<OMB+b8G z-@m%e029yGNJ(JVQZZ_L4w;8;ynmY=DHp4{Jb}E^$$L%pfIjg&_>;?5+Tk2wp>#9a zsl_soP)Av%4`OoMHIZ%6NGnmTaxE~jRnP|)=o~b2z}}F1oOo@X z7Z~_R+BM5@cP4eTA$7?$H7oZD`%vN+!Q^wK2hyN@AKZlDi_9gbTk^*cPu1>anHrh- zGJHrM2C?$Q4EU#zZNHOI`%uaMr-1rLH2@(&e!BYFELe?e8L zuDxF}o(EXKKyH1%8C>{D3eP?Ze2tYgWhpg-%=q>W#n!teVyU&Cw%arKs&AL9#rHia zN52PRh}>Tgje^d-%I0ExRtprxt@+Gt4JUqNyv3CgCQRX!YW|s?sk#M)c#d?nEG9MX zcTM^Jpap+gY;%9M(8WlvbVZ%L(9|2G=Yd~Ca}SBc_b9^=d%Lt%A}lvn4?gHa=|tK7 z%?{^mcsNUDen{v!5C-G4$WMWGy4B39S&xSX`d%VTwd1ZK-RIOKPYrnP9!;1-EfOFA z7{f*ue=1%+D-C*FuoMNuyq_{cFE<{R;BOc`5bIJz;tpJd4N`wL2$y74=b2!;Q)mx; zczk*TtkI=7q?p!lPK-chqXwJRIHFb_v3VGLBOS z9z;2w<2BZworz8m_HjQJbLh0zWT@$g2og3QV#Ih~OAfH({%M5o+3KD?SO=MC#5Bn8 zWh@-^v%8G>0Mid!Duqh*aBhe|%xWoO`c}Pwy55Dq>v(ajQ0p+Gz73M=9Ap75L>p&< z2b1CL`Fw*DG3unIV^y?yqcIXE2 zH5OVqyq#*XX0+xP z?zrCx@fae|^*46%zj;l6@Ge;TTY`=I+#&Uisus0>-JaK4ZqPi#sOqXnQr)`v&r`WJ zsQ(>sX2Yj0Yo0B&I?H+_mQXg7Gv1R>)}A>HYKlnAgka8!le=NPLra2><0m$ObyJaz@9;yT?YF^ea7z(4H)rF{Tj zr5F?yg*RoLyB~1mK+iP|s30PM!$@c`b>2zzJCi7<>DTp5+E8aniZLe<9IA-|^v&K9 z3@a?dE}{fn8r9_3@OlE&u5Rb)cVce_UJYN@ZLO!tVtbz|3@hPU@@dVd#C}CXD8#T} zB8@f(*AJ8cSd#q|Q&ED6BwNwxr-=&%`$|WV2u-M9n+vnT8K>>C4ADZQPo_RcX^;}R z-O)}a`_vwG#)k5L=nzpvqOX39eTeSQ9+d?dtA+>`dsa3Akq+ZiWh(Z%t zn8ulc^IeC_8K>)$d!A{9utAwE7BO?0{n#s7xLmHceYHCyXoIdzR<)gQqw8&5xy#2< zyfrZUKX;J>(ZKr|y5S2Fcs0*kcCksKi~CKCKN|R*dtOtWL#Aq4cK*+??Bdn2_rLcs zBP@EaZ)!hGL}#c~wJk20D(3_AL%nsS+e=5BY1q#CC-=qsPe0!5o#$b+ze7OKRVf_W z0FfDx+RDkns%J2qpJ9lkUdgd_1&Ng7&8w%QH$rhSr}Et%vPh_r1$OcNXC!mTm$9q~ z&>%@0t}pEmtmx1iv&<<)|9l~>M|mMEf}L~65A6@9=EB0LKimxdITl^>{owBwC-2tH zIrlH8w~d?Q#C>?qgXG%H=zERktYGCj&0r84Y;!Z)km)_@@_;_HG8G(g^UNr<b%;JpE0n&ATYY_GvA| zAF>6j2!7VMTwCnN4EvM}0TE|DR4K{alE2i}1&X{ci3cJk*l^PvCm|{+sATV!@yu}@ zU0(;BHAOXcmT`*gR-JNJmzQw^`?0BAm!Ty200LO7d}ASjg)XGVxW$UN!R(qw;K^jw~-?bqC>=9>WA}voO)m(3i!! zC^|(!9u(NMoJZ5c)gR^3S$M~;%M1Pe8v`>DCh^1cOPHNVvR>E}jzYQvpTP)N=3B~* zS8~HYf)CoU@8V1_OkC8e3x(TFoGEZJG@Tmq3tfU_k^)&bXye~qSCx9_MiWiWV1_ox zPV=FvGF!%1BJ)Pmacs3UTh-9J#Bz1k>Si#Bb!C-JN?Rd{*K~#(cG2Nn1cY)0d7N#m zBnY2~GpL{OxsTwbRXxkKOn>{%bc_ew8A}$Ml0S46(ng@z8br8&SDA{^Ku^W1B~#5h z&<>e1(PT+op>rCEa0IFjVaMBQ*XZ#UcS_W9BB1ine4 zWK>#Ve!YN$0aI*ak-YgEGZt5XSvZ)Uj_8^Oy2td;X}-<$YpKoQs~cJN5@#3-NKnU$4JFUq$lXjMDJb!Oq6_Wu%V8{rUEHO3HhWU@zgi2D5!7wa8vmC&c&7X~!7 zMpL*1@g@3*c31t0F@=LNsd#A#+>JuPxh>ztz75bil+-T+7M$DkYFs}OvDts#o5nT5R^4i^(vM(`H|G9KXa!ljP+qFa$&<{*c8R|&@k?ooYhha~!!dobR z4V*^oc1Lan@iEtSOr8uqPa}gkYJy1K?@RcS?=@;fHa%N}&|eTiRFC4`I7&^!NMtB} zzXT%tDumR==1^?GojLJC3=<}UC$Q5j-m_H$9H}Q6fUKV4x{@iZrML z$+-=fBPf|>&Z{~C;EqCH{%ZuV%(>dHR^u8;Zqh@C)izk=D6SQ12DZ8mpElv(jGB55 zlR6`fBGGcr8gg6G1U5hOTQePZNI}Q0V&VjqdKMU0muYKxSV^7aoRmjXK93@vIA>}I zuB9qo#p)T|4?m^|ZQDE_%;B6Pi`qhS?N9CV@RX83Ym~88_d0pgJC+GYah$3bm*yU# z;aD);1De1!;9RM3YC!F@TBrY9so*D?0&75C)hjQuT+mKX_W}$hbj%xSI`7IRIFOqX zdGOnxWk+^G-xCfFF_mhYP5yz|BFe`iz2hO}_UKO~;LxidSmA@|e-VNmCu^gQEyS8) zD^NWYqq|u;-;?m}p0>L@nAZYlDlpoa6O3 z0M&-R@$@}ltV^U!XK0m@^%9S1>w$#m5DxIreckg$-KbWA&7X}jOA7q>#)sjXuBU6F z)P-S&Ol}u_NX(vF+rh%v?U4X$ZDY{RgIOcC;7scF)YD+q)U&Kl3CK;WYVM`f4E+7WIgQ8H)ZqNxtJ$n{WTI*R6>`9AUHLQ5Mp6OsoQErCOh9>~xhX+Rjm_ynStU(9NUmatuvRvxrK zN;SEKuQm3G(DpTR6pw1@3jTe;HujgdpB~IA2c{6f^*MhEtEG1XDS}n3#%%?(C~Roa z!W^|O@8F$lR6)ahJGUUN5OZ!P7~*#*NrFkZC3k$wOXZ}3WFcTOcC)9zL2h6fubA}{ zqSP;$m47YV@I>+C9EpQ0fe1J&C$Jh8bP5)iJC_c(7*Zx{c#H^x&+ccg5(|hxKrkn79+m zKm*FA=3CTeRAz~oDvO#FuA@<}Co8wWfTHRvWn11QCly@qJUBu#{VH)cmd_i+(Quz2 zFnMV|1qr@y5N>m703J93=q`?c@ttL^>jW-b#AykKve&gQmJe1uuzp?Gn6`Q^H(eRJ zlPRrb*(6g#)S6oo7He#bO0t{9MMu1$R=~r+PJu84Gzp~=(06eojX=m z&>$RQA}jgcwFHI{uixSic@FSBFCZqJ!o_jciN0hV zn6`YfsDtk$DW;3s7YAzAMSG%m}n*6EQ_!83__YLI|2#KGPZJX6-#>q6Q>7~;&hKv~DvXI7is4 zXkAFm#$+ShNt1giPqFV%W3LDyP_IAyniw7`P=?la-Mo<=5qE zPjNq8Zr16On-vAky=J^cQqm7p%l+n2`L!y4LAL`cg#0hd^{WN|?m0sZ|B2S0N9fcn zTe^~(_nj~??C4({vhQ8cB7e(b|D38sB=GqyS}xjH4*@If*O%7+2-olyk;>XFujJn~ zo(N9=Vkmi&%F2fivcw@RoiwCt&Kifl3K`U!c=8T;g)DeLFLDBC<&nz$?>W5qFUVv( zDDTX5nU9bw-`>;QMTom^u|xE9923MX5oGa23uODI_!fvhjmqJ%xttLI<}N)UgB3g} z1-UjiN|yWub7z)n(@vQ1;;<{_=Py5g0emag*Pn;GQ)ybs)m^teqF0Fu{>3p3xUQ(8 zGFOR!4G#TE*8DTpVDxNVXe?dXUy#evA(;Kobaqo2=Vtu;}4|L#c!()Qia}%CtX$xDy zKowUIjrh`(P%q`kvm<@=KW78y*^zyRCX?uq>E{kkofap6z0}`ogEv@yz}N7@9DR8m zPci!iy_@ivx}U>t;?8Q2Ls|P#1@oi+Of(thM4zObA-8-;uHNNSN)G)M?Lj6>#BW;Y zMvuapVpkRO*gZs-)rKvUmQcTRGw`JZW%8@Vz=aD4>(JaF-tM_bp2TYjZ#fI}rA$zo za}+O{;OxK#wSm6$K!g+E9Nd;tpVR@0wXB_j(>AMj;_2sqjT6j%0g1#H0RP4byidWG zeD!uZRvH+sR4);h3B5y*p#?HGuUos>y?-*4@j!kql;V1A=z{Ekwbe^nEO%+>FDThs zK+7-|Av^*+g;iKCp)wAk=_TVvq|r(H&>IV@E5qKT!M2X~eBXCmQ2#qcN;wa@t;M)` z4plQ(8@i?Lv;Xp>4t(8-aac0;ZU12^bVnh$fmNa#S?_EN!EbDsk~QYbIJeZ*xCEIRF`sT(nD zRld>|U0X;u8viXd7cbGU@*dlJll1F9r-kM4#5Bj5<&UI^v)J#9H(P|d8H{rRqo5n= z4caZ6w zCCVwU$oVU4x1cwMI1H#Tzf2!TjF=Pr0xTgqJEZ+FkIZEI#!_k3JoAFSt3(O*g&KoZ zFX?s)&4-^2#OF10kU0o2_WIV$s;>wYhw1i_EercLK?y!dS;{UVF2}FWZ4x6(@K}u1 zy#9Vk9DUD#xUu!hU14=~pYQCFmxqg5Z_3x^A#S2uA8f`-9@6b{vPUIUYhtM5#@o6c zZSn^ak-rbOb{Mkj>jM&Ge*iDpRxpOkErrS`!6$wM?mVE00~la2AIO1x6vkoAe-hMp zl(`Fr^4}>6rC&98{-Kd*L~Bqbx90S_-dyXFl0`y+f`b|O#>Sr&+XtN*mthhL8jUhu z-bg&Oam$BR&jbRzv$TzjnlMbjZY*<%6D}f7t|Tr(_{b z(L+mdSb)dqVafj~l&>((sn%+unQk!V_L_IY;5i7Y_PI#6OG>3Prw1(m86)6JXaoLe zCvaQpE`yo9bj&5mNpIO#L;L+4ZD{PB-DG^YT(1!5&5hqzlV=QA9p?xi8CfVhUKOK8 zH!BkrGofH7UT@w&+cOM5e#oB8si1g+ksMP_jYnQ^HqdSY5R<`hYb@WR)9;w1e_}={ zl_PYjI+Ii~3R^WDg=mm~_*O%F@=>2|yDyG%6OirQ=SWo4eCwj;A*+YPH`;#cBimk+ z<9kiquVd zLY8x&5tR2xI*ATh{^xt-)gfa7uvl>Ced`??mY$spr?>jIk2E0hOiyQOwo z#!vc8GM^SwI;(`F@M^xO^^!p#{5?v2L?a)Kc6dT!kKS5t6|<_9r*0!#pJ>w0y_It5pI zJpf_&SGmLj(&apwuVk*Gn3LASfX%v9DCISDuZl1Xq_%e)(Fgzr+GHRPH>3>?uoiVd z%PLp;r~dTkyE>GR^f8qvL@d@hCSVtIxum$cjtf}lZ!#8Mdi1W zC79>guR|5atgZ&ym zqe9#~#8LX%oyex{-%S{nFwTZ>>8&N#L%(fDoG=r1!+3qr(u+FT{(_Q7zERO?GzVb% zZm0u_)imnA!vILUe4tWRESMC&8|nu1yCIJ=3QdPl<4pqMc6WVD@gTG1flsK`mX`B* z`ZUW3S(avm$w_P<@D7c~lq71ZvF~K2z=^PK2C1yNN`vVyzr*#DQZhc^vWOx*({MPO zXh+B!B`Y)QPK=5J`wt|galPo`e)B&e!+ywJ;p#;G47&tYDLCVDN~PA1qhZU#ZoD~I zsxGz!h&F^D{6vzJBUCluyzp$NxTOwK-F{C#Jaj;l>-pUwW`U$q27(AWWbXqOrU^r4 z>#j2nF`Ektn)~^USEQ7@j<**!{;P2mQG*B>uOiG%GQ2ExSd5%ao8u3K_yRi;^;By!K10h$7h$V0Y#D@F=7W-kGh_JF8#?A zI=lB9p;M06+ITA<_-ncMt0Z!DQHXAvc*%s`jz#OsH#|eUwU92dacdtuHfGi}kT?ny zl8cE6^X@*Te!Z6=2k;WYWu+Cfj>10w0A#aCF-){xr)IV73qQ#Zug<#7qi{XiDNMF) zS?tS0hW2Mi6i4oGyUF{Y(qdcLZ@pVF%&xbzWbAO|8Tqf0xUPo~{|2jc)8XOxhT!4B z(_rZ`>+bFkGFZnsfaPy9WY3p}%aP)ir{aV9zqkUEFK8eiCTa-Nhr7XL%9k?|P8`jEQI2cf&9EGp6@N5 z_g##Q44-SO0fm<<10keqN+qoQA;R+UB3sug_vDM6QW_p$gf8=0F2-iI-+m%Mu1HDC z7))mnVIn{k33#04YB$!23KmH5$)#)V4_q+SZ-q#H-22xPaacEB`%p*t&8x48diO}u zdb)LLFH3U--Sew(>ATG&w4CFzEkz1^kCegZA)lAAMTk+j6njUV92os}C!2)EmEcI0 zf8})nv58Fi{Tbe~Bp;$r-s%%8L2udj;@ICLStlPH2k;!=gT-iF7~hS$PMV6)okW22 zx29vQ2{5d#(D#^V538Q!Ya`q#ms@9fX57|a3G6MT2=jJ^b9Y=E9ET)@FibJe-6JL? zX(jeru2@U^e-4P#lyd!$o6WeU?lP<(K4FeqVr?N8f1Nej|^q6i5{;27WT*?*{(1H3xlrjjvI)-n*3)~vFO5T zhLzmuvH-j2Zwd_0^fTe!$mZTw#_~VXpL0f=av&o-EzIm^921X2I>Eux4O2y#L0Gur6#s z{|VTvqf!uDO>Kl!YwRxV=D0DZ{6^=a|26TxQBhg8Uy|7ODTs$2diwdHE-yANE#cDV z$^o;%3Fsz=hrb(O4i7jR5}ElkV(jbO|EO*80d-++QwPP8t1OoAiQNlNYWONg0|7 z0D~lyk89_;7#baJ5TCVI>D2J<%MXjESDKEU+(}MTAHKu=yKdq8(jLpt&f7%I`t5M$ zb6lMePaQMu$QIo-vNzG*Mg|5XR%U4?s(4hxnPUUVkRfbEBL<^2#ANGLVmdL8sgy{< z^bG`t@CCel&V~KcFLCOxNp*Ij7y1`$^(3IMoV`QIB0`wA*Pt{$aWG8}KPWumRqGHB zXeeDqAe5U=Duex)28U%@9nd+6afors?K@o5DrTL1>(4ZmTMYw-G##10m^qBq_lUg` zMwjW6k@atHPU1jm0DIK@1xZ9_ljV?jDN)3W+a|tWK|{j}Q{saekE0VJ2$*5&o*!Z+ zlkrL>RcX7n37p^v@XMm;xH@Sy(17xqmK#t2B3iuf^{gfc7P9gUg@;!;V3^!T6o_ z24z*NPJJyP9kZ+OtT%`!?DD%v@DrwOG35@Ix4-nO2xsj|L{j zn81b?r@Zl7f#KJPIxBloKYSus5^65|yB)BtS93B}RFrk6eZniVl2j)LzD!x`G= zNnkpH8}Tg`44^AmOTi3_XMx~veug3ju~rU^57w1CfhU}7YY4P^ug($Bu)TE6Amy>- zRA#ca@vffYxU`5;(pxx^Dir*j87gmXn{y+?w!eF4s2gj04f^l+1wQEG0tdVw2~2*gyu876QWK)gpyjv?wbBneF6HmIz|e3UTAuqA_c@ zyaX7ip21V$;+evjKSjWbL&(4Rkx4|kYGYZ|Y(dT4gBm1`WxZFJKqY&#IDEaUFLih< z1NDZNTv};$XA$DZ2F4MD7lox;eN+6MrJqC-!w>(|A{ghBr@<#Kl7zMca3T#X{}Q|= znv47^!sj?G2IV?6(e<4bqa2Tyi!VVEGzJLk3E8X#Gap+<@RHg^fXKN|F9^i|G4- ztQnTAhu^#t;^>+Gz9P?o=;)Yku+10F?YCGe>VHw?T##^PEYY8jrwQl{DjpY3VRH^LHm;D!jBo- z^+uKiI$nrv)SP3y_sY3ubmb640NV)rU}Zh)CD$@CzBsTWSbnb|qcOfnR@Vh4oJv0= z;?pWfB{NIAva|2|lPi)-iN;@dg0ntC&R*})4iWqDKaKhq+c YZ1joE{~N-td;M{gGgRMwwD`O7KN8b2UH||9 literal 0 HcmV?d00001 diff --git a/back-end/public/profile/654ae4ee155c830cb3ea4c2e.webp b/back-end/public/profile/654ae4ee155c830cb3ea4c2e.webp new file mode 100644 index 0000000000000000000000000000000000000000..aac96a3c959b2c8c975937b957637284eedbfc88 GIT binary patch literal 21404 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 z1pom6002q=000{S1pom6002?|001Zf0{{U400062003!+1ONd5003G500000002k; v00031002k;00031000620-yu{0RR91^Z@_>1E2%|0RR917y { +// Ensure the "public/profile" directory exists +const fs = require('fs'); +const profileDirectory = 'public/profile'; +if (!fs.existsSync(profileDirectory)) +{ + fs.mkdirSync(profileDirectory, { recursive: true }); +} - const image = req.image; - res.send(apiResponse({message: 'File uploaded successfully.', image})); -}) +// Image upload +router.post('/add-contact', upload.single('image'), async (req, res) => { -router.post('/data',(req,res) => { + if (!req.file) { + // Handle the case where no file was uploaded + res.status(400).send(apiResponse({ message: 'No file uploaded.' })); + return; + } - console.log(req.body); + const userId = req.body.id; // Assuming user ID is available in req.body + const image = req.file; // Access the uploaded file info + const contactData = req.body; + + console.log("user id : ", userId); + console.log("image : ", image); + console.log("contact : ", contactData); + + try { + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + // Create a new user profile if it doesn't exist + userProfile = new Contact({ _id: userId, contacts: [] }); + } + + // Create a new contact document with a unique ID + const newContact = { + _id: new mongoose.Types.ObjectId(), + name: contactData.name, + email: contactData.email, + phone: contactData.phone, + address: contactData.address + }; + + // Save the uploaded image with the name the same as the contact's ID + const imageExtension = image.originalname.split('.').pop(); + const imageFileName = `${newContact._id.toString()}.${imageExtension}`; + + const oldFilePath = `public/profile/${userId}.${imageExtension}`; // Replace with the path to the old image file + const newFilePath = `public/profile/${imageFileName}`; // Replace with the desired new path and name for the image + + fs.rename(oldFilePath, newFilePath, (err) => { + if (err) { + console.error('Error renaming the image:', err); + } else { + console.log('Image renamed successfully'); + } + }); - res.status(200).json({ - success : true, - message : "success", - user : user - }); + userProfile.contacts.push(newContact); + + // Save the updated user profile + await userProfile.save(); + res.send(apiResponse({ message: 'File uploaded successfully.', image })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } }); @@ -46,38 +101,36 @@ router.post('/signup', async (req, res) => { //console.log(req.body); - const isUser = await User.findOne({username:req.body.username}); + const isUser = await User.findOne({ username: req.body.username }); console.log(isUser); - if(isUser === null) - { - req.body.password = await bcrypt.hash(req.body.password,10); + if (isUser === null) { + req.body.password = await bcrypt.hash(req.body.password, 10); User.create(req.body).then(response => { const user = { - id : response._id, - name : response.name, - email : response.email, + id: response._id, + username: response.username, + email: response.email, } res.status(200).json({ - success : true, - message : "success", - user : user + success: true, + message: "success", + user: user }); }).catch(err => { console.log(err.message); }); } - else - { + else { res.status(401).json( { - success : false, - message : "user already exists" + success: false, + message: "user already exists" } ) } @@ -85,59 +138,57 @@ router.post('/signup', async (req, res) => { }); //Login Method -router.post('/user-login',async (req,res) => { +router.post('/login', async (req, res) => { console.log(req.body); - const user = await User.findOne({username:req.body.username}); + const user = await User.findOne({ username: req.body.username }); - console.log("user : ",user); - if(user !== null) - { - bcrypt.compare(req.body.password,user.password,(err,result) => { + console.log("user : ", user); + if (user !== null) { + bcrypt.compare(req.body.password, user.password, (err, result) => { - if(result) - { + if (result) { const userData = { - id : user._id, - username : user.username, - email : user.email + id: user._id, + username: user.username, + email: user.email } res.status(200).json({ - success:true, - user : userData, - message : "login successful" + success: true, + user: userData, + message: "login successful" }); } - else{ + else { res.status(401).json({ - success : false, - message : "invalid credentials" + success: false, + message: "invalid credentials" }); } }) } - else{ + else { res.status(401).json({ - success : false, - message : "invalid credentials" + success: false, + message: "invalid credentials" }); } }) //PUT Method. -router.put('/update-user',(req,res) => { +router.put('/update-user', (req, res) => { res.send({ - type:'PUT' + type: 'PUT' }); }); //DELETE METHOD. -router.delete('/delete-user',(req,res) => { +router.delete('/delete-user', (req, res) => { res.send({ - type:'DELETE' + type: 'DELETE' }) }); diff --git a/back-end/server.js b/back-end/server.js index deae0c27c..0bd7a498a 100644 --- a/back-end/server.js +++ b/back-end/server.js @@ -3,7 +3,6 @@ const mongoose = require('mongoose'); const cors = require('cors'); const bodyParser = require('body-parser'); const path = require('path'); -const adminRoute = require('./routes/admin-router'); const userRoute = require('./routes/user-router'); require("dotenv").config(); @@ -16,7 +15,7 @@ mongoose.connect('mongodb://127.0.0.1:27017/stackup', { useNewUrlParser: true, u console.log('Connected to MongoDB'); }) .catch((error) => { - console.error('MongoDB connection error:', error); + console.error('MongoDB connection error occured:', error); }); mongoose.Promise = global.Promise; @@ -28,13 +27,12 @@ app.use(bodyParser.json()); app.use(express.static(path.join(__dirname, 'public'))); //route -app.use('/api/admin', adminRoute); app.use('/api/user',userRoute); // error handling middleware app.use(function(err,req,res,next){ //console.log(err); - res.status(422).send({error: err.message}); + res.status(422).send({error: err}); }); app.listen(5000, () => { From cb195b2e6b09d60bd55595cd5fb0bc75ac85a2c9 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 07:09:30 +0530 Subject: [PATCH 11/35] model.js --- back-end/model/model.js | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/back-end/model/model.js b/back-end/model/model.js index e69de29bb..2d73b1d30 100644 --- a/back-end/model/model.js +++ b/back-end/model/model.js @@ -0,0 +1,49 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const UserSchema = new Schema({ + username: { + type: String, + required: [true, 'username field is required'] + }, + email: { + type: String, + required: [true, 'Email field is required'] + }, + password:{ + type: String, + required: [true, 'password field is required'] + }, + date : { + type: Date, + default : Date.now + } +}); + +const contactSchema = new Schema({ + name : { + type: String, + required: [true, 'name field is required'] + }, + phone : { + type: String, + required: [true, 'phone_no field is required'] + }, + email : { + type: String, + required: [true, 'email field is required'] + }, + address : { + type: String, + required: [true, 'address field is required'] + } + +}) + +const User = mongoose.model('users',UserSchema); +const Contact = mongoose.model('contacts',contactSchema); + +module.exports = { + User, + Contact +}; \ No newline at end of file From 826fbd445b570584df80cca4235efdef87306ce4 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 07:58:40 +0530 Subject: [PATCH 12/35] get-contacts route done --- .../profile/654ae72f624783682464088e.webp | Bin 0 -> 21404 bytes back-end/routes/user-router.js | 22 ++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 back-end/public/profile/654ae72f624783682464088e.webp diff --git a/back-end/public/profile/654ae72f624783682464088e.webp b/back-end/public/profile/654ae72f624783682464088e.webp new file mode 100644 index 0000000000000000000000000000000000000000..aac96a3c959b2c8c975937b957637284eedbfc88 GIT binary patch literal 21404 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 z1pom6002q=000{S1pom6002?|001Zf0{{U400062003!+1ONd5003G500000002k; v00031002k;00031000620-yu{0RR91^Z@_>1E2%|0RR917y { + + const userId = req.body.id; + const isUser = await Contact.findOne({ _id: userId }); + + console.log("contacts : ",isUser); + + if(isUser !== null) + { + res.status(200).json({ + success: true, + message: "success", + contacts : isUser.contacts + }); + } + else + { + + } + +}) + // Image upload router.post('/add-contact', upload.single('image'), async (req, res) => { From 0259c36886fab89beb64b39d84126ed108b5465e Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 16:52:15 +0530 Subject: [PATCH 13/35] delete route done --- back-end/routes/user-router.js | 43 +++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js index d5b4f5326..6609bb935 100644 --- a/back-end/routes/user-router.js +++ b/back-end/routes/user-router.js @@ -34,6 +34,42 @@ if (!fs.existsSync(profileDirectory)) fs.mkdirSync(profileDirectory, { recursive: true }); } +// Add a new route to delete a contact by ID +router.delete('/delete-contact', async (req, res) => { + try { + const userId = req.body.userId; + const contactId = req.body.contactId; + + console.log(userId,contactId); + + // Find the user profile by user ID + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + return res.status(404).send(apiResponse({ message: 'User profile not found.' })); + } + + // Find the index of the contact to delete + const contactIndex = userProfile.contacts.findIndex((contact) => contact._id.toString() === contactId); + + if (contactIndex === -1) { + return res.status(404).send(apiResponse({ message: 'Contact not found.' })); + } + + // Remove the contact from the user's profile + userProfile.contacts.splice(contactIndex, 1); + + // Save the updated user profile + await userProfile.save(); + + return res.send(apiResponse({ message: 'Contact deleted successfully.' })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } + }); + + router.get('/get-contacts',async (req,res) => { const userId = req.body.id; @@ -51,7 +87,12 @@ router.get('/get-contacts',async (req,res) => { } else { - + res.status(401).json( + { + success: false, + message: "user already exists" + } + ) } }) From 520bfe3a2f68ef4c96de0684b05a2d04c7e5304d Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 17:04:28 +0530 Subject: [PATCH 14/35] contact update route done --- back-end/routes/user-router.js | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js index 6609bb935..7a09c6784 100644 --- a/back-end/routes/user-router.js +++ b/back-end/routes/user-router.js @@ -34,6 +34,51 @@ if (!fs.existsSync(profileDirectory)) fs.mkdirSync(profileDirectory, { recursive: true }); } +// Add a new route to update a contact by ID +router.put('/update-contact', async (req, res) => { + try { + const userId = req.body.userId; + const contactId = req.body.contactId; + + // Find the user profile by user ID + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + return res.status(404).send(apiResponse({ message: 'User profile not found.' })); + } + + // Find the contact to update in the user's contacts + const contactToUpdate = userProfile.contacts.id(contactId); + + if (!contactToUpdate) { + return res.status(404).send(apiResponse({ message: 'Contact not found.' })); + } + + // Update the contact data with the request body + if (req.body.name) { + contactToUpdate.name = req.body.name; + } + if (req.body.email) { + contactToUpdate.email = req.body.email; + } + if (req.body.phone) { + contactToUpdate.phone = req.body.phone; + } + if (req.body.address) { + contactToUpdate.address = req.body.address; + } + + // Save the updated user profile + await userProfile.save(); + + return res.send(apiResponse({ message: 'Contact updated successfully.', contact: contactToUpdate })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } + }); + + // Add a new route to delete a contact by ID router.delete('/delete-contact', async (req, res) => { try { From f8504ab9573e83111e12f1a558fb443803564d96 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 17:11:13 +0530 Subject: [PATCH 15/35] route --- back-end/routes/user-router.js | 303 +++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 back-end/routes/user-router.js diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js new file mode 100644 index 000000000..7a09c6784 --- /dev/null +++ b/back-end/routes/user-router.js @@ -0,0 +1,303 @@ +const express = require('express'); +const router = express.Router(); +const mongoose = require('mongoose'); +const { User, Contact } = require('../model/model'); +const bcrypt = require('bcrypt'); +const multer = require('multer'); +const path = require('path'); +const userHelper = require('../helpers/user-helper'); + +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, 'public/profile'); + }, + filename: function (req, file, cb) { + const userId = req.body.id; // Assuming user ID is available in req.body + const originalName = file.originalname; + const fileExtension = originalName.split('.').pop(); // Get the file extension + const uniqueFileName = `${userId}.${fileExtension}`; + cb(null, uniqueFileName); + } +}); + +const upload = multer({ storage: storage }); + +function apiResponse(results) { + return JSON.stringify({ "status": 200, "error": null, "response": results }); +} + +// Ensure the "public/profile" directory exists +const fs = require('fs'); +const profileDirectory = 'public/profile'; +if (!fs.existsSync(profileDirectory)) +{ + fs.mkdirSync(profileDirectory, { recursive: true }); +} + +// Add a new route to update a contact by ID +router.put('/update-contact', async (req, res) => { + try { + const userId = req.body.userId; + const contactId = req.body.contactId; + + // Find the user profile by user ID + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + return res.status(404).send(apiResponse({ message: 'User profile not found.' })); + } + + // Find the contact to update in the user's contacts + const contactToUpdate = userProfile.contacts.id(contactId); + + if (!contactToUpdate) { + return res.status(404).send(apiResponse({ message: 'Contact not found.' })); + } + + // Update the contact data with the request body + if (req.body.name) { + contactToUpdate.name = req.body.name; + } + if (req.body.email) { + contactToUpdate.email = req.body.email; + } + if (req.body.phone) { + contactToUpdate.phone = req.body.phone; + } + if (req.body.address) { + contactToUpdate.address = req.body.address; + } + + // Save the updated user profile + await userProfile.save(); + + return res.send(apiResponse({ message: 'Contact updated successfully.', contact: contactToUpdate })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } + }); + + +// Add a new route to delete a contact by ID +router.delete('/delete-contact', async (req, res) => { + try { + const userId = req.body.userId; + const contactId = req.body.contactId; + + console.log(userId,contactId); + + // Find the user profile by user ID + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + return res.status(404).send(apiResponse({ message: 'User profile not found.' })); + } + + // Find the index of the contact to delete + const contactIndex = userProfile.contacts.findIndex((contact) => contact._id.toString() === contactId); + + if (contactIndex === -1) { + return res.status(404).send(apiResponse({ message: 'Contact not found.' })); + } + + // Remove the contact from the user's profile + userProfile.contacts.splice(contactIndex, 1); + + // Save the updated user profile + await userProfile.save(); + + return res.send(apiResponse({ message: 'Contact deleted successfully.' })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } + }); + + +router.get('/get-contacts',async (req,res) => { + + const userId = req.body.id; + const isUser = await Contact.findOne({ _id: userId }); + + console.log("contacts : ",isUser); + + if(isUser !== null) + { + res.status(200).json({ + success: true, + message: "success", + contacts : isUser.contacts + }); + } + else + { + res.status(401).json( + { + success: false, + message: "user already exists" + } + ) + } + +}) + +// Image upload +router.post('/add-contact', upload.single('image'), async (req, res) => { + + if (!req.file) { + // Handle the case where no file was uploaded + res.status(400).send(apiResponse({ message: 'No file uploaded.' })); + return; + } + + const userId = req.body.id; // Assuming user ID is available in req.body + const image = req.file; // Access the uploaded file info + const contactData = req.body; + + console.log("user id : ", userId); + console.log("image : ", image); + console.log("contact : ", contactData); + + try { + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + // Create a new user profile if it doesn't exist + userProfile = new Contact({ _id: userId, contacts: [] }); + } + + // Create a new contact document with a unique ID + const newContact = { + _id: new mongoose.Types.ObjectId(), + name: contactData.name, + email: contactData.email, + phone: contactData.phone, + address: contactData.address + }; + + // Save the uploaded image with the name the same as the contact's ID + const imageExtension = image.originalname.split('.').pop(); + const imageFileName = `${newContact._id.toString()}.${imageExtension}`; + + const oldFilePath = `public/profile/${userId}.${imageExtension}`; // Replace with the path to the old image file + const newFilePath = `public/profile/${imageFileName}`; // Replace with the desired new path and name for the image + + fs.rename(oldFilePath, newFilePath, (err) => { + if (err) { + console.error('Error renaming the image:', err); + } else { + console.log('Image renamed successfully'); + } + }); + + userProfile.contacts.push(newContact); + + // Save the updated user profile + await userProfile.save(); + + res.send(apiResponse({ message: 'File uploaded successfully.', image })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } +}); + + +//Signup Method +router.post('/signup', async (req, res) => { + + //console.log(req.body); + + const isUser = await User.findOne({ username: req.body.username }); + + console.log(isUser); + + if (isUser === null) { + req.body.password = await bcrypt.hash(req.body.password, 10); + + User.create(req.body).then(response => { + + const user = { + id: response._id, + username: response.username, + email: response.email, + } + + res.status(200).json({ + success: true, + message: "success", + user: user + }); + + }).catch(err => { + console.log(err.message); + }); + } + else { + res.status(401).json( + { + success: false, + message: "user already exists" + } + ) + } + +}); + +//Login Method +router.post('/login', async (req, res) => { + + console.log(req.body); + + const user = await User.findOne({ username: req.body.username }); + + console.log("user : ", user); + if (user !== null) { + bcrypt.compare(req.body.password, user.password, (err, result) => { + + if (result) { + const userData = { + id: user._id, + username: user.username, + email: user.email + } + res.status(200).json({ + success: true, + user: userData, + message: "login successful" + }); + } + else { + res.status(401).json({ + success: false, + message: "invalid credentials" + }); + } + }) + } + else { + res.status(401).json({ + success: false, + message: "invalid credentials" + }); + } + +}) + +//PUT Method. +router.put('/update-user', (req, res) => { + + res.send({ + type: 'PUT' + }); +}); + +//DELETE METHOD. +router.delete('/delete-user', (req, res) => { + res.send({ + type: 'DELETE' + }) +}); + +module.exports = router; \ No newline at end of file From 992b12709778aa401ac99d0847fc5bc2a20a2e9e Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 17:37:05 +0530 Subject: [PATCH 16/35] merge mistake in user-route --- back-end/routes/user-router.js | 108 +++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js index 431d418e4..7a09c6784 100644 --- a/back-end/routes/user-router.js +++ b/back-end/routes/user-router.js @@ -34,6 +34,114 @@ if (!fs.existsSync(profileDirectory)) fs.mkdirSync(profileDirectory, { recursive: true }); } +// Add a new route to update a contact by ID +router.put('/update-contact', async (req, res) => { + try { + const userId = req.body.userId; + const contactId = req.body.contactId; + + // Find the user profile by user ID + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + return res.status(404).send(apiResponse({ message: 'User profile not found.' })); + } + + // Find the contact to update in the user's contacts + const contactToUpdate = userProfile.contacts.id(contactId); + + if (!contactToUpdate) { + return res.status(404).send(apiResponse({ message: 'Contact not found.' })); + } + + // Update the contact data with the request body + if (req.body.name) { + contactToUpdate.name = req.body.name; + } + if (req.body.email) { + contactToUpdate.email = req.body.email; + } + if (req.body.phone) { + contactToUpdate.phone = req.body.phone; + } + if (req.body.address) { + contactToUpdate.address = req.body.address; + } + + // Save the updated user profile + await userProfile.save(); + + return res.send(apiResponse({ message: 'Contact updated successfully.', contact: contactToUpdate })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } + }); + + +// Add a new route to delete a contact by ID +router.delete('/delete-contact', async (req, res) => { + try { + const userId = req.body.userId; + const contactId = req.body.contactId; + + console.log(userId,contactId); + + // Find the user profile by user ID + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + return res.status(404).send(apiResponse({ message: 'User profile not found.' })); + } + + // Find the index of the contact to delete + const contactIndex = userProfile.contacts.findIndex((contact) => contact._id.toString() === contactId); + + if (contactIndex === -1) { + return res.status(404).send(apiResponse({ message: 'Contact not found.' })); + } + + // Remove the contact from the user's profile + userProfile.contacts.splice(contactIndex, 1); + + // Save the updated user profile + await userProfile.save(); + + return res.send(apiResponse({ message: 'Contact deleted successfully.' })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } + }); + + +router.get('/get-contacts',async (req,res) => { + + const userId = req.body.id; + const isUser = await Contact.findOne({ _id: userId }); + + console.log("contacts : ",isUser); + + if(isUser !== null) + { + res.status(200).json({ + success: true, + message: "success", + contacts : isUser.contacts + }); + } + else + { + res.status(401).json( + { + success: false, + message: "user already exists" + } + ) + } + +}) + // Image upload router.post('/add-contact', upload.single('image'), async (req, res) => { From 8b0c1720a4bf5bdfa85005c3a5334a62660b3c07 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 17:43:32 +0530 Subject: [PATCH 17/35] model.js merge mistake --- back-end/model/model.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/back-end/model/model.js b/back-end/model/model.js index 2d73b1d30..15daec9e6 100644 --- a/back-end/model/model.js +++ b/back-end/model/model.js @@ -21,6 +21,9 @@ const UserSchema = new Schema({ }); const contactSchema = new Schema({ + _id: { + type: Schema.Types.ObjectId, auto: true + }, name : { type: String, required: [true, 'name field is required'] @@ -40,8 +43,12 @@ const contactSchema = new Schema({ }) +const userContacts = new Schema({ + contacts: [contactSchema] // Array to store contacts + }); + const User = mongoose.model('users',UserSchema); -const Contact = mongoose.model('contacts',contactSchema); +const Contact = mongoose.model('contacts',userContacts); module.exports = { User, From c2d8fd25c97b58423834911bdd43a55f63c8f5c1 Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 17:45:05 +0530 Subject: [PATCH 18/35] user router js merge mistake --- back-end/routes/user-router.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js index 7a09c6784..b9c8f1d65 100644 --- a/back-end/routes/user-router.js +++ b/back-end/routes/user-router.js @@ -285,19 +285,4 @@ router.post('/login', async (req, res) => { }) -//PUT Method. -router.put('/update-user', (req, res) => { - - res.send({ - type: 'PUT' - }); -}); - -//DELETE METHOD. -router.delete('/delete-user', (req, res) => { - res.send({ - type: 'DELETE' - }) -}); - module.exports = router; \ No newline at end of file From 90b3964964887c8c2aa1bd2d9738d2ce115f3bbe Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 17:46:06 +0530 Subject: [PATCH 19/35] server.js merge mistake --- back-end/server.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/back-end/server.js b/back-end/server.js index e69de29bb..0bd7a498a 100644 --- a/back-end/server.js +++ b/back-end/server.js @@ -0,0 +1,40 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const path = require('path'); +const userRoute = require('./routes/user-router'); +require("dotenv").config(); + +//use +const app = express(); + +//connect mongodb +mongoose.connect('mongodb://127.0.0.1:27017/stackup', { useNewUrlParser: true, useUnifiedTopology: true }) + .then(() => { + console.log('Connected to MongoDB'); + }) + .catch((error) => { + console.error('MongoDB connection error occured:', error); + }); + +mongoose.Promise = global.Promise; + +//static files +app.use(cors()); +app.use(express.json()); +app.use(bodyParser.json()); +app.use(express.static(path.join(__dirname, 'public'))); + +//route +app.use('/api/user',userRoute); + +// error handling middleware +app.use(function(err,req,res,next){ + //console.log(err); + res.status(422).send({error: err}); +}); + +app.listen(5000, () => { + console.log(`Server Started at ${5000}`) +}) \ No newline at end of file From f9beb24711ea74d6cc001075930ef96e80c71a5b Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 17:55:01 +0530 Subject: [PATCH 20/35] back-end branch merge mistakes resolved --- .../profile/654b7d0f5df2599c8e255c7f.webp | Bin 0 -> 21404 bytes .../profile/654b7d995df2599c8e255c89.webp | Bin 0 -> 21404 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 back-end/public/profile/654b7d0f5df2599c8e255c7f.webp create mode 100644 back-end/public/profile/654b7d995df2599c8e255c89.webp diff --git a/back-end/public/profile/654b7d0f5df2599c8e255c7f.webp b/back-end/public/profile/654b7d0f5df2599c8e255c7f.webp new file mode 100644 index 0000000000000000000000000000000000000000..aac96a3c959b2c8c975937b957637284eedbfc88 GIT binary patch literal 21404 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 z1pom6002q=000{S1pom6002?|001Zf0{{U400062003!+1ONd5003G500000002k; v00031002k;00031000620-yu{0RR91^Z@_>1E2%|0RR917y Date: Wed, 8 Nov 2023 18:17:35 +0530 Subject: [PATCH 21/35] initial redux store setup done --- front-end/package-lock.json | 455 +++++++++++++++++- front-end/package.json | 13 +- front-end/src/App.css | 42 -- front-end/src/App.jsx | 24 +- front-end/src/index.css | 69 --- front-end/src/main.jsx | 20 +- .../src/redux/actions/action-constants.js | 13 + front-end/src/redux/actions/actions.js | 38 ++ front-end/src/redux/reducers/root-reducer.js | 19 + .../src/redux/reducers/user/user-reducer.js | 45 ++ front-end/src/redux/saga/saga.js | 126 +++++ front-end/src/redux/store.js | 23 + 12 files changed, 736 insertions(+), 151 deletions(-) create mode 100644 front-end/src/redux/actions/action-constants.js create mode 100644 front-end/src/redux/actions/actions.js create mode 100644 front-end/src/redux/reducers/root-reducer.js create mode 100644 front-end/src/redux/reducers/user/user-reducer.js create mode 100644 front-end/src/redux/saga/saga.js create mode 100644 front-end/src/redux/store.js diff --git a/front-end/package-lock.json b/front-end/package-lock.json index 1e94a8747..90d8fc230 100644 --- a/front-end/package-lock.json +++ b/front-end/package-lock.json @@ -8,8 +8,19 @@ "name": "front-end", "version": "0.0.0", "dependencies": { + "@reduxjs/toolkit": "^1.9.5", + "axios": "^1.5.1", + "bootstrap": "^5.3.2", + "jquery": "^3.7.1", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-hook-form": "^7.45.4", + "react-icons": "^4.11.0", + "react-redux": "^8.1.1", + "react-router-dom": "^6.16.0", + "redux-logger": "^3.0.6", + "redux-persist": "^6.0.0", + "redux-saga": "^1.2.3" }, "devDependencies": { "@types/react": "^18.2.15", @@ -322,6 +333,17 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -910,6 +932,98 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@redux-saga/core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.3.tgz", + "integrity": "sha512-U1JO6ncFBAklFTwoQ3mjAeQZ6QGutsJzwNBjgVLSWDpZTRhobUzuVDS1qH3SKGJD8fvqoaYOjp6XJ3gCmeZWgA==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@redux-saga/deferred": "^1.2.1", + "@redux-saga/delay-p": "^1.2.1", + "@redux-saga/is": "^1.1.3", + "@redux-saga/symbols": "^1.1.3", + "@redux-saga/types": "^1.2.1", + "redux": "^4.0.4", + "typescript-tuple": "^2.2.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/redux-saga" + } + }, + "node_modules/@redux-saga/deferred": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz", + "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==" + }, + "node_modules/@redux-saga/delay-p": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz", + "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==", + "dependencies": { + "@redux-saga/symbols": "^1.1.3" + } + }, + "node_modules/@redux-saga/is": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz", + "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==", + "dependencies": { + "@redux-saga/symbols": "^1.1.3", + "@redux-saga/types": "^1.2.1" + } + }, + "node_modules/@redux-saga/symbols": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz", + "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==" + }, + "node_modules/@redux-saga/types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", + "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==" + }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", + "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.4", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", @@ -951,17 +1065,24 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/prop-types": { "version": "15.7.9", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", - "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==", - "dev": true + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" }, "node_modules/@types/react": { "version": "18.2.36", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.36.tgz", "integrity": "sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -972,7 +1093,7 @@ "version": "18.2.14", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/react": "*" } @@ -980,8 +1101,12 @@ "node_modules/@types/scheduler": { "version": "0.16.5", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", - "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==", - "dev": true + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", @@ -1183,6 +1308,11 @@ "has-symbols": "^1.0.3" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -1195,12 +1325,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1315,6 +1473,17 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1344,8 +1513,7 @@ "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -1364,6 +1532,11 @@ } } }, + "node_modules/deep-diff": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", + "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1401,6 +1574,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1966,6 +2147,25 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -1975,6 +2175,19 @@ "is-callable": "^1.1.3" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2226,6 +2439,14 @@ "node": ">= 0.4" } }, + "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/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -2235,6 +2456,15 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2620,6 +2850,11 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2757,6 +2992,25 @@ "yallist": "^3.0.2" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3066,6 +3320,11 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -3118,11 +3377,76 @@ "react": "^18.2.0" } }, + "node_modules/react-hook-form": { + "version": "7.48.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.48.2.tgz", + "integrity": "sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-icons": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz", + "integrity": "sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==", + "peerDependencies": { + "react": "*" + } + }, "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==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-redux": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", + "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/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-refresh": { "version": "0.14.0", @@ -3133,6 +3457,76 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", + "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", + "dependencies": { + "@remix-run/router": "1.11.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", + "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", + "dependencies": { + "@remix-run/router": "1.11.0", + "react-router": "6.18.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-logger": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", + "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==", + "dependencies": { + "deep-diff": "^0.3.5" + } + }, + "node_modules/redux-persist": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", + "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", + "peerDependencies": { + "redux": ">4.0.0" + } + }, + "node_modules/redux-saga": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.2.3.tgz", + "integrity": "sha512-HDe0wTR5nhd8Xr5xjGzoyTbdAw6rjy1GDplFt3JKtKN8/MnkQSRqK/n6aQQhpw5NI4ekDVOaW+w4sdxPBaCoTQ==", + "dependencies": { + "@redux-saga/core": "^1.2.3" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", @@ -3153,6 +3547,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", @@ -3170,6 +3569,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -3599,6 +4003,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript-compare": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", + "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", + "dependencies": { + "typescript-logic": "^0.0.0" + } + }, + "node_modules/typescript-logic": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" + }, + "node_modules/typescript-tuple": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", + "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", + "dependencies": { + "typescript-compare": "^0.0.2" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -3653,6 +4078,14 @@ "punycode": "^2.1.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/vite": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", diff --git a/front-end/package.json b/front-end/package.json index 326321d15..7ef3cffe7 100644 --- a/front-end/package.json +++ b/front-end/package.json @@ -10,8 +10,19 @@ "preview": "vite preview" }, "dependencies": { + "@reduxjs/toolkit": "^1.9.5", + "axios": "^1.5.1", + "bootstrap": "^5.3.2", + "jquery": "^3.7.1", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-hook-form": "^7.45.4", + "react-icons": "^4.11.0", + "react-redux": "^8.1.1", + "react-router-dom": "^6.16.0", + "redux-logger": "^3.0.6", + "redux-persist": "^6.0.0", + "redux-saga": "^1.2.3" }, "devDependencies": { "@types/react": "^18.2.15", diff --git a/front-end/src/App.css b/front-end/src/App.css index b9d355df2..e69de29bb 100644 --- a/front-end/src/App.css +++ b/front-end/src/App.css @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/front-end/src/App.jsx b/front-end/src/App.jsx index b8b8473a3..64c481415 100644 --- a/front-end/src/App.jsx +++ b/front-end/src/App.jsx @@ -4,30 +4,10 @@ import viteLogo from '/vite.svg' import './App.css' function App() { - const [count, setCount] = useState(0) - + return ( <> - -

Vite + React

-
- -

- Edit src/App.jsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

+

hello

) } diff --git a/front-end/src/index.css b/front-end/src/index.css index 2c3fac689..e69de29bb 100644 --- a/front-end/src/index.css +++ b/front-end/src/index.css @@ -1,69 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/front-end/src/main.jsx b/front-end/src/main.jsx index 54b39dd1d..76edc5a1a 100644 --- a/front-end/src/main.jsx +++ b/front-end/src/main.jsx @@ -1,10 +1,18 @@ import React from 'react' import ReactDOM from 'react-dom/client' +import { Provider } from 'react-redux'; +import { PersistGate } from 'redux-persist/integration/react'; +import { BrowserRouter } from 'react-router-dom'; +import {store,persistor} from './redux/store'; import App from './App.jsx' import './index.css' - -ReactDOM.createRoot(document.getElementById('root')).render( - - - , -) +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + + + + + +); \ No newline at end of file diff --git a/front-end/src/redux/actions/action-constants.js b/front-end/src/redux/actions/action-constants.js new file mode 100644 index 000000000..6d174b69c --- /dev/null +++ b/front-end/src/redux/actions/action-constants.js @@ -0,0 +1,13 @@ +const actions = { + LOGIN_START : 'LOGIN_START', + LOGIN_SUCCESS : 'LOGIN_SUCCESS', + LOGIN_FAILED : 'LOGIN_FAILED', + LOGOUT_START : 'LOGOUT_START', + LOGOUT_SUCCESS : 'LOGOUT_SUCCESS', + LOGOUT_FAILED : 'LOGOUT_FAILED', + SIGNUP_START : 'SIGNUP_START', + SIGNUP_SUCCESS : 'SIGNUP_SUCCESS', + SIGNUP_FAILED : 'SIGNUP_FAILED', +}; + +export default actions; \ No newline at end of file diff --git a/front-end/src/redux/actions/actions.js b/front-end/src/redux/actions/actions.js new file mode 100644 index 000000000..0beb0a453 --- /dev/null +++ b/front-end/src/redux/actions/actions.js @@ -0,0 +1,38 @@ +import actions from "./action-constants"; + +export const studentDataAction = (payload) => { + + return( + { + type : actions.STUDENT_DATA_START, + payload : payload + } + ); +} + +export const signUpAction = (payload) => { + + return( + { + type : actions.SIGNUP_START, + payload : payload + } + ); +} + +export const loginAction = (payload) => { + + return( + { + type:actions.LOGIN_START, + payload:payload + } + ) +}; + +export const logoutAction = () => { + + return{ + type:actions.LOGOUT_START + } +} \ No newline at end of file diff --git a/front-end/src/redux/reducers/root-reducer.js b/front-end/src/redux/reducers/root-reducer.js new file mode 100644 index 000000000..e4e745f91 --- /dev/null +++ b/front-end/src/redux/reducers/root-reducer.js @@ -0,0 +1,19 @@ +import { combineReducers } from "redux"; +import { persistReducer } from "redux-persist"; +import storage from "redux-persist/lib/storage"; +import userReducer from "./user/user-reducer"; + +const persistConfig = { + key:'root', + storage, + whitelist:['user'] +}; + + +const rootReducer = combineReducers( + { + user : userReducer + } +) + +export default persistReducer(persistConfig,rootReducer); \ No newline at end of file diff --git a/front-end/src/redux/reducers/user/user-reducer.js b/front-end/src/redux/reducers/user/user-reducer.js new file mode 100644 index 000000000..55e1153bb --- /dev/null +++ b/front-end/src/redux/reducers/user/user-reducer.js @@ -0,0 +1,45 @@ +import actions from "../../actions/action-constants"; + +let initState = { + login:false +}; + +const userReducer = (state=initState,action) => +{ + switch(action.type) + { + case actions.LOGIN_SUCCESS: + return { + ...state, + user:action.payload, + login:true + } + case actions.LOGIN_FAILED: + return{ + ...state, + user : action.payload, + login:false + } + case actions.LOGOUT_SUCCESS: + return{ + login:false + } + case actions.SIGNUP_SUCCESS: + return{ + ...state, + user : action.payload, + login : true, + message : "success" + } + case actions.SIGNUP_FAILED: + return{ + ...state, + message : action.payload.message, + login:false + } + default: + return state; + } +} + +export default userReducer; \ No newline at end of file diff --git a/front-end/src/redux/saga/saga.js b/front-end/src/redux/saga/saga.js new file mode 100644 index 000000000..73d64370a --- /dev/null +++ b/front-end/src/redux/saga/saga.js @@ -0,0 +1,126 @@ +import {put,takeEvery,all,call, takeLatest} from 'redux-saga/effects'; +import actions from '../actions/action-constants'; + +const LoginValidation = (data) => { + + const userData = { + username:data.email, + password:data.password + } + + return fetch('http://localhost:5000/api/user/user-login',{ + method:'POST', + headers: { + 'Content-Type': 'application/json', + }, + body:JSON.stringify(userData) + }) + .then(async res => + { + res = await res.json(); + return res; + }) + .catch(error => { + console.log(error) + }) +} + +const SignUp = (data) => { + + const user = { + name : data.name, + username : data.username, + email : data.email, + password : data.password + } + + return fetch('http://localhost:5000/api/user/signup',{ + method:'POST', + headers: { + 'Content-Type': 'application/json', + }, + body:JSON.stringify(user) + }) + .then(async res => + { + res = await res.json(); + return res; + }) + .catch(error => { + console.log(error) + }) +} + +function* handleloginStart(action){ + + try{ + const res = yield call(LoginValidation,action.payload); + + if(res.success) + { + yield put({type:actions.LOGIN_SUCCESS,payload:res.user}); + } + else + { + return put({type:actions.LOGIN_FAILED,payload:res}) + } + } + catch(err){ + console.log(err); + } +} + +function* handleLogOut(){ + try + { + yield put({type : actions.LOGOUT_SUCCESS}); + } + catch(err) + { + console.log("LOGOUT SAGA ERROR : ",err.message); + } +} + +function* handleSignUp(action){ + + try{ + const res = yield call(SignUp,action.payload); + + console.log("signup response",res); + + if(res.success) + { + yield put({type:actions.SIGNUP_SUCCESS,payload:res.user}); + } + else + { + yield put({type:actions.SIGNUP_FAILED,payload:res}) + } + } + catch(err){ + console.log(err); + } + +} + +function* watchForLoginStart(){ + yield takeLatest(actions.LOGIN_START,handleloginStart); +} + +function* watchForLogOutStart(){ + yield takeLatest(actions.LOGOUT_START,handleLogOut); +} + +function* watchForSignUpStart(){ + yield takeLatest(actions.SIGNUP_START,handleSignUp); +} + +export default function* rootSaga() +{ + yield all( + [ + watchForLoginStart(), + watchForLogOutStart(), + watchForSignUpStart() + ]); +} \ No newline at end of file diff --git a/front-end/src/redux/store.js b/front-end/src/redux/store.js new file mode 100644 index 000000000..783a1b767 --- /dev/null +++ b/front-end/src/redux/store.js @@ -0,0 +1,23 @@ +import createSagaMiddleware from '@redux-saga/core'; +import {persistStore} from 'redux-persist'; +import { configureStore} from '@reduxjs/toolkit'; +import logger from 'redux-logger'; +import rootSaga from './saga/saga'; +import thunk from 'redux-thunk'; +import rootReducer from './reducers/root-reducer'; + +const sagaMiddleware = createSagaMiddleware(); + +const middleware = [sagaMiddleware,thunk,logger] + +console.log("store is called"); +export const store = configureStore({ + reducer : rootReducer, + middleware: [...middleware], +}); + +export const persistor = persistStore(store); + +sagaMiddleware.run(rootSaga); + +export default {store,persistor}; \ No newline at end of file From ef5d4c5e5ade2f1e8a818fa6140b2449be31e72c Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 18:26:59 +0530 Subject: [PATCH 22/35] user router merge mistake --- back-end/routes/user-router.js | 288 +++++++++++++++++++++++++++++++++ 1 file changed, 288 insertions(+) diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js index e69de29bb..b9c8f1d65 100644 --- a/back-end/routes/user-router.js +++ b/back-end/routes/user-router.js @@ -0,0 +1,288 @@ +const express = require('express'); +const router = express.Router(); +const mongoose = require('mongoose'); +const { User, Contact } = require('../model/model'); +const bcrypt = require('bcrypt'); +const multer = require('multer'); +const path = require('path'); +const userHelper = require('../helpers/user-helper'); + +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, 'public/profile'); + }, + filename: function (req, file, cb) { + const userId = req.body.id; // Assuming user ID is available in req.body + const originalName = file.originalname; + const fileExtension = originalName.split('.').pop(); // Get the file extension + const uniqueFileName = `${userId}.${fileExtension}`; + cb(null, uniqueFileName); + } +}); + +const upload = multer({ storage: storage }); + +function apiResponse(results) { + return JSON.stringify({ "status": 200, "error": null, "response": results }); +} + +// Ensure the "public/profile" directory exists +const fs = require('fs'); +const profileDirectory = 'public/profile'; +if (!fs.existsSync(profileDirectory)) +{ + fs.mkdirSync(profileDirectory, { recursive: true }); +} + +// Add a new route to update a contact by ID +router.put('/update-contact', async (req, res) => { + try { + const userId = req.body.userId; + const contactId = req.body.contactId; + + // Find the user profile by user ID + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + return res.status(404).send(apiResponse({ message: 'User profile not found.' })); + } + + // Find the contact to update in the user's contacts + const contactToUpdate = userProfile.contacts.id(contactId); + + if (!contactToUpdate) { + return res.status(404).send(apiResponse({ message: 'Contact not found.' })); + } + + // Update the contact data with the request body + if (req.body.name) { + contactToUpdate.name = req.body.name; + } + if (req.body.email) { + contactToUpdate.email = req.body.email; + } + if (req.body.phone) { + contactToUpdate.phone = req.body.phone; + } + if (req.body.address) { + contactToUpdate.address = req.body.address; + } + + // Save the updated user profile + await userProfile.save(); + + return res.send(apiResponse({ message: 'Contact updated successfully.', contact: contactToUpdate })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } + }); + + +// Add a new route to delete a contact by ID +router.delete('/delete-contact', async (req, res) => { + try { + const userId = req.body.userId; + const contactId = req.body.contactId; + + console.log(userId,contactId); + + // Find the user profile by user ID + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + return res.status(404).send(apiResponse({ message: 'User profile not found.' })); + } + + // Find the index of the contact to delete + const contactIndex = userProfile.contacts.findIndex((contact) => contact._id.toString() === contactId); + + if (contactIndex === -1) { + return res.status(404).send(apiResponse({ message: 'Contact not found.' })); + } + + // Remove the contact from the user's profile + userProfile.contacts.splice(contactIndex, 1); + + // Save the updated user profile + await userProfile.save(); + + return res.send(apiResponse({ message: 'Contact deleted successfully.' })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } + }); + + +router.get('/get-contacts',async (req,res) => { + + const userId = req.body.id; + const isUser = await Contact.findOne({ _id: userId }); + + console.log("contacts : ",isUser); + + if(isUser !== null) + { + res.status(200).json({ + success: true, + message: "success", + contacts : isUser.contacts + }); + } + else + { + res.status(401).json( + { + success: false, + message: "user already exists" + } + ) + } + +}) + +// Image upload +router.post('/add-contact', upload.single('image'), async (req, res) => { + + if (!req.file) { + // Handle the case where no file was uploaded + res.status(400).send(apiResponse({ message: 'No file uploaded.' })); + return; + } + + const userId = req.body.id; // Assuming user ID is available in req.body + const image = req.file; // Access the uploaded file info + const contactData = req.body; + + console.log("user id : ", userId); + console.log("image : ", image); + console.log("contact : ", contactData); + + try { + let userProfile = await Contact.findById(userId); + + if (!userProfile) { + // Create a new user profile if it doesn't exist + userProfile = new Contact({ _id: userId, contacts: [] }); + } + + // Create a new contact document with a unique ID + const newContact = { + _id: new mongoose.Types.ObjectId(), + name: contactData.name, + email: contactData.email, + phone: contactData.phone, + address: contactData.address + }; + + // Save the uploaded image with the name the same as the contact's ID + const imageExtension = image.originalname.split('.').pop(); + const imageFileName = `${newContact._id.toString()}.${imageExtension}`; + + const oldFilePath = `public/profile/${userId}.${imageExtension}`; // Replace with the path to the old image file + const newFilePath = `public/profile/${imageFileName}`; // Replace with the desired new path and name for the image + + fs.rename(oldFilePath, newFilePath, (err) => { + if (err) { + console.error('Error renaming the image:', err); + } else { + console.log('Image renamed successfully'); + } + }); + + userProfile.contacts.push(newContact); + + // Save the updated user profile + await userProfile.save(); + + res.send(apiResponse({ message: 'File uploaded successfully.', image })); + } catch (error) { + console.error(error); + res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + } +}); + + +//Signup Method +router.post('/signup', async (req, res) => { + + //console.log(req.body); + + const isUser = await User.findOne({ username: req.body.username }); + + console.log(isUser); + + if (isUser === null) { + req.body.password = await bcrypt.hash(req.body.password, 10); + + User.create(req.body).then(response => { + + const user = { + id: response._id, + username: response.username, + email: response.email, + } + + res.status(200).json({ + success: true, + message: "success", + user: user + }); + + }).catch(err => { + console.log(err.message); + }); + } + else { + res.status(401).json( + { + success: false, + message: "user already exists" + } + ) + } + +}); + +//Login Method +router.post('/login', async (req, res) => { + + console.log(req.body); + + const user = await User.findOne({ username: req.body.username }); + + console.log("user : ", user); + if (user !== null) { + bcrypt.compare(req.body.password, user.password, (err, result) => { + + if (result) { + const userData = { + id: user._id, + username: user.username, + email: user.email + } + res.status(200).json({ + success: true, + user: userData, + message: "login successful" + }); + } + else { + res.status(401).json({ + success: false, + message: "invalid credentials" + }); + } + }) + } + else { + res.status(401).json({ + success: false, + message: "invalid credentials" + }); + } + +}) + +module.exports = router; \ No newline at end of file From 95762f8ee1615c7da03115183b527adb50496475 Mon Sep 17 00:00:00 2001 From: Mr-Allen-29 Date: Wed, 8 Nov 2023 08:37:33 -0500 Subject: [PATCH 23/35] login component created --- front-end/src/components/login/login.css | 24 ++++++ front-end/src/components/login/login.jsx | 95 ++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 front-end/src/components/login/login.css create mode 100644 front-end/src/components/login/login.jsx diff --git a/front-end/src/components/login/login.css b/front-end/src/components/login/login.css new file mode 100644 index 000000000..6817468a6 --- /dev/null +++ b/front-end/src/components/login/login.css @@ -0,0 +1,24 @@ +section{ + font-size: 1rem; +} + +.email .password +{ + size: 2rem; +} + +.divider:after, +.divider:before { +content: ""; +flex: 1; +height: 1px; +background: #eee; +} +.h-custom { +height: calc(100% - 73px); +} +@media (max-width: 450px) { +.h-custom { +height: 100%; +} +} \ No newline at end of file diff --git a/front-end/src/components/login/login.jsx b/front-end/src/components/login/login.jsx new file mode 100644 index 000000000..fadd0240b --- /dev/null +++ b/front-end/src/components/login/login.jsx @@ -0,0 +1,95 @@ +import React,{useEffect} from 'react'; +import { useForm } from "react-hook-form"; +import { connect } from 'react-redux'; +import { Link, useNavigate} from 'react-router-dom'; +import { loginAction } from '../../redux/actions/actions'; +import "./login.css"; + +const LoginComponent = ({loginSubmit,user}) => { + + //console.log(user); + + const navigate = useNavigate(); + + const { + register, + handleSubmit, + reset, + formState: { errors } + } = useForm(); + + const onSubmit = (data) => { + console.log(data); + loginSubmit(data); + reset(); + }; + + useEffect(() => { + if (user.login) { + // User is logged in, navigate to another route + navigate('/view', { replace: true }); + } + }, [user.login, navigate]); + + return ( +
+
+
+
+ Sample image +
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+ + +
+ Forgot password? +
+ +
+ +

Don't have an account? Register

+
+ +
+
+
+
+
+
+ Copyright © 2020. All rights reserved. +
+
+
+ ); +} + +const mapDispatchToProps = dispatch => { + return{ + loginSubmit : (data) => dispatch(loginAction(data)) + } +} + +const mapStateToProps = ({user}) => { + + return {user}; +} + +export default connect(mapStateToProps,mapDispatchToProps)(LoginComponent); \ No newline at end of file From f14c4e12b73d0016dee8723f6d928e75706c53aa Mon Sep 17 00:00:00 2001 From: Mr-Allen-29 Date: Wed, 8 Nov 2023 09:55:10 -0500 Subject: [PATCH 24/35] login component created --- front-end/src/components/login/login.css | 24 --- front-end/src/components/login/login.jsx | 95 ---------- .../src/components/register/register.css | 21 +++ .../src/components/register/register.jsx | 170 ++++++++++++++++++ 4 files changed, 191 insertions(+), 119 deletions(-) delete mode 100644 front-end/src/components/login/login.css delete mode 100644 front-end/src/components/login/login.jsx create mode 100644 front-end/src/components/register/register.css create mode 100644 front-end/src/components/register/register.jsx diff --git a/front-end/src/components/login/login.css b/front-end/src/components/login/login.css deleted file mode 100644 index 6817468a6..000000000 --- a/front-end/src/components/login/login.css +++ /dev/null @@ -1,24 +0,0 @@ -section{ - font-size: 1rem; -} - -.email .password -{ - size: 2rem; -} - -.divider:after, -.divider:before { -content: ""; -flex: 1; -height: 1px; -background: #eee; -} -.h-custom { -height: calc(100% - 73px); -} -@media (max-width: 450px) { -.h-custom { -height: 100%; -} -} \ No newline at end of file diff --git a/front-end/src/components/login/login.jsx b/front-end/src/components/login/login.jsx deleted file mode 100644 index fadd0240b..000000000 --- a/front-end/src/components/login/login.jsx +++ /dev/null @@ -1,95 +0,0 @@ -import React,{useEffect} from 'react'; -import { useForm } from "react-hook-form"; -import { connect } from 'react-redux'; -import { Link, useNavigate} from 'react-router-dom'; -import { loginAction } from '../../redux/actions/actions'; -import "./login.css"; - -const LoginComponent = ({loginSubmit,user}) => { - - //console.log(user); - - const navigate = useNavigate(); - - const { - register, - handleSubmit, - reset, - formState: { errors } - } = useForm(); - - const onSubmit = (data) => { - console.log(data); - loginSubmit(data); - reset(); - }; - - useEffect(() => { - if (user.login) { - // User is logged in, navigate to another route - navigate('/view', { replace: true }); - } - }, [user.login, navigate]); - - return ( -
-
-
-
- Sample image -
-
-
-
-
- -
- -
-
- -
- -
-
- - -
- Forgot password? -
- -
- -

Don't have an account? Register

-
- -
-
-
-
-
-
- Copyright © 2020. All rights reserved. -
-
-
- ); -} - -const mapDispatchToProps = dispatch => { - return{ - loginSubmit : (data) => dispatch(loginAction(data)) - } -} - -const mapStateToProps = ({user}) => { - - return {user}; -} - -export default connect(mapStateToProps,mapDispatchToProps)(LoginComponent); \ No newline at end of file diff --git a/front-end/src/components/register/register.css b/front-end/src/components/register/register.css new file mode 100644 index 000000000..cdafed417 --- /dev/null +++ b/front-end/src/components/register/register.css @@ -0,0 +1,21 @@ +.view{ + margin-top: 1.5rem; + width: 100%; + height: 100%; + display: flex; + align-self: center; + justify-content: center; +} + +.container-reg{ + background-color: white; + width: 100%; +} + +input{ + height: 2.4rem; +} + +.card-view{ + border-radius: 25px; +} \ No newline at end of file diff --git a/front-end/src/components/register/register.jsx b/front-end/src/components/register/register.jsx new file mode 100644 index 000000000..2307686e9 --- /dev/null +++ b/front-end/src/components/register/register.jsx @@ -0,0 +1,170 @@ +import React, { useEffect, useRef } from "react"; +import { connect } from 'react-redux'; +import { useForm } from 'react-hook-form'; +import { signUpAction } from "../../redux/actions/actions"; +import { useNavigate } from "react-router-dom"; +import "./register.css" +const RegisterComponent = ({signUp,user}) => { + + const navigate = useNavigate(); + + const { + register, + handleSubmit, + reset, + watch, + formState: { errors } + } = useForm(); + + const password = useRef({}); + + password.current = watch("password", ""); + + + const onSubmit = (data) => { + console.log(data); + signUp(data); + reset(); + }; + + useEffect(() => { + if (user.login) { + + navigate('/', { replace: true }); + + } + }, [user.login, navigate]); + + console.log("signup user",user); + + + return ( +
+
+
+
+
+
+
+
+ +

Sign up

+ + { + !user.success?

{user.message}

: <> + } + +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + + {errors.password &&

{errors.password.message}

} + +
+
+ +
+ +
+ value === password.current || "Password do not match" + })} + /> + + {errors.cnfpassword &&

{errors.cnfpassword.message}

} + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+
+ + Sample image + +
+
+
+
+
+
+
+
+ ); +} + +const mapStateToProps = ({user}) => { + + return{user} +} + +const mapDispatchToProps = dispatch => { + + return { + signUp: (data) => dispatch(signUpAction(data)) + } +} + +export default connect(mapStateToProps,mapDispatchToProps)(RegisterComponent); \ No newline at end of file From 224d6701bf94329c590c2615bbb71d8b01650f6c Mon Sep 17 00:00:00 2001 From: Mr-Allen-29 <144417572+Mr-Allen-29@users.noreply.github.com> Date: Wed, 8 Nov 2023 10:20:32 -0500 Subject: [PATCH 25/35] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e1759309..53e5eeb9b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ Long Description about project. This project do that. This project is awesome... ## Team members 1. Akhil [github link] 2. Allen -3. Rayan +3. Rayan +4. Alwin ## Team Id retr0 ## Link to product walkthrough From 169f0f487577157a15f30dfd867f518c6754ae91 Mon Sep 17 00:00:00 2001 From: Mr-Allen-29 Date: Wed, 8 Nov 2023 10:20:35 -0500 Subject: [PATCH 26/35] register component --- front-end/src/components/login/login.css | 0 front-end/src/components/login/login.jsx | 95 ++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 front-end/src/components/login/login.css create mode 100644 front-end/src/components/login/login.jsx diff --git a/front-end/src/components/login/login.css b/front-end/src/components/login/login.css new file mode 100644 index 000000000..e69de29bb diff --git a/front-end/src/components/login/login.jsx b/front-end/src/components/login/login.jsx new file mode 100644 index 000000000..a12e30078 --- /dev/null +++ b/front-end/src/components/login/login.jsx @@ -0,0 +1,95 @@ +import React,{useEffect} from 'react'; +import { useForm } from "react-hook-form"; +import { connect } from 'react-redux'; +import { Link, useNavigate} from 'react-router-dom'; +import { loginAction } from '../../redux/actions/actions'; +import "./login.css"; + +const LoginComponent = ({loginSubmit,user}) => { + + //console.log(user); + + const navigate = useNavigate(); + + const { + register, + handleSubmit, + reset, + formState: { errors } + } = useForm(); + + const onSubmit = (data) => { + console.log(data); + loginSubmit(data); + reset(); + }; + + useEffect(() => { + if (user.login) { + // User is logged in, navigate to another route + navigate('/view', { replace: true }); + } + }, [user.login, navigate]); + + return ( +
+
+
+
+ Sample image +
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+ + +
+ Forgot password? +
+ +
+ +

Don't have an account? Register

+
+ +
+
+
+
+
+
+ Copyright © 2020. All rights reserved. +
+
+
+ ); +} + +const mapDispatchToProps = dispatch => { + return{ + loginSubmit : (data) => dispatch(loginAction(data)) + } +} + +const mapStateToProps = ({user}) => { + + return {user}; +} + +export default connect(mapStateToProps,mapDispatchToProps)(LoginComponent); \ No newline at end of file From 99351049b16d5a4a9d9c735937c7d73a73b4da4e Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 21:56:29 +0530 Subject: [PATCH 27/35] login register functionality works --- back-end/routes/user-router.js | 2 +- front-end/index.html | 31 ++++-- front-end/src/App.jsx | 6 +- front-end/src/components/home/home.css | 24 +++++ front-end/src/components/home/home.jsx | 28 +++++ front-end/src/components/login/login.css | 24 +++++ front-end/src/components/navbar/navbar.css | 11 ++ front-end/src/components/navbar/navbar.jsx | 102 ++++++++++++++++++ .../src/components/register/register.jsx | 8 -- front-end/src/redux/saga/saga.js | 2 +- 10 files changed, 213 insertions(+), 25 deletions(-) create mode 100644 front-end/src/components/home/home.css create mode 100644 front-end/src/components/home/home.jsx create mode 100644 front-end/src/components/navbar/navbar.css create mode 100644 front-end/src/components/navbar/navbar.jsx diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js index b9c8f1d65..e37fd6f67 100644 --- a/back-end/routes/user-router.js +++ b/back-end/routes/user-router.js @@ -207,7 +207,7 @@ router.post('/add-contact', upload.single('image'), async (req, res) => { //Signup Method router.post('/signup', async (req, res) => { - //console.log(req.body); + console.log(req.body); const isUser = await User.findOne({ username: req.body.username }); diff --git a/front-end/index.html b/front-end/index.html index 0c589eccd..22dfd7546 100644 --- a/front-end/index.html +++ b/front-end/index.html @@ -1,13 +1,22 @@ - - - - - Vite + React - - -
- - - + + + + + + Vite + React + + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/front-end/src/App.jsx b/front-end/src/App.jsx index 64c481415..05a51955f 100644 --- a/front-end/src/App.jsx +++ b/front-end/src/App.jsx @@ -1,13 +1,11 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' +import Home from "./components/home/home" import './App.css' function App() { return ( <> -

hello

+ ) } diff --git a/front-end/src/components/home/home.css b/front-end/src/components/home/home.css new file mode 100644 index 000000000..14b657dac --- /dev/null +++ b/front-end/src/components/home/home.css @@ -0,0 +1,24 @@ +.grid-container { + margin-top: 7rem; + margin-left: 4rem; + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + grid-gap: 5px; /* Adjust the gap between grid items as needed */ + justify-content: center; + align-items: center; + } + + .grid-item { + background-color: #eaeaea; + padding: 10px; + text-align: center; + } + + /* Media query for responsive layout */ + @media (max-width: 768px) { + .grid-container { + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); /* Adjust the column width as needed for smaller screens */ + grid-gap: 5px; /* Adjust the gap between grid items as needed for smaller screens */ + } + } + \ No newline at end of file diff --git a/front-end/src/components/home/home.jsx b/front-end/src/components/home/home.jsx new file mode 100644 index 000000000..8fd3ae0a3 --- /dev/null +++ b/front-end/src/components/home/home.jsx @@ -0,0 +1,28 @@ +import React from "react"; +import {connect} from 'react-redux'; +import { Route, Routes, useLocation } from "react-router-dom"; +import Navbar from "../navbar/navbar"; +import LoginComponent from "../login/login"; +import RegisterComponent from "../register/register"; +import './home.css'; + +const Home = () => { + + const location = useLocation(); + + console.log(location); + + return( + <> + + + }/> + }/> + }/> + + + ); +} + + +export default connect(null,null)(Home); \ No newline at end of file diff --git a/front-end/src/components/login/login.css b/front-end/src/components/login/login.css index e69de29bb..617c8d32b 100644 --- a/front-end/src/components/login/login.css +++ b/front-end/src/components/login/login.css @@ -0,0 +1,24 @@ +section{ + font-size: 1rem; +} + +.email .password +{ + size: 2rem; +} + +.divider:after, +.divider:before { +content: ""; +flex: 1; +height: 1px; +background: #eee; +} +.h-custom { +height: calc(100% - 73px); +} +@media (max-width: 450px) { +.h-custom { +height: 100%; +} +} \ No newline at end of file diff --git a/front-end/src/components/navbar/navbar.css b/front-end/src/components/navbar/navbar.css new file mode 100644 index 000000000..ca974fc73 --- /dev/null +++ b/front-end/src/components/navbar/navbar.css @@ -0,0 +1,11 @@ +.navbar{ + top:0; + height: 4.5rem; + width: 100%; + position: fixed; + z-index: 999; +} + +.profile-pic{ + border-radius: 300px; +} \ No newline at end of file diff --git a/front-end/src/components/navbar/navbar.jsx b/front-end/src/components/navbar/navbar.jsx new file mode 100644 index 000000000..154ce9f8a --- /dev/null +++ b/front-end/src/components/navbar/navbar.jsx @@ -0,0 +1,102 @@ +import React from "react"; +import {connect} from 'react-redux'; +import {Link,useLocation} from 'react-router-dom'; +import './navbar.css'; +import { logoutAction } from "../../redux/actions/actions"; + +const Navbar = ({user,logOut}) => { + + const location = useLocation(); + + console.log("current path : ",location.pathname); + + console.log("inside ",user); + return( + + ); +} + +const mapDispatchToProps = dispatch => { + return { + logOut : () => dispatch(logoutAction()) + } +} + +const mapStateToProps = ({user}) => +{ + console.log("navvar",user); + return {user}; +} + +export default connect(mapStateToProps,mapDispatchToProps)(Navbar); \ No newline at end of file diff --git a/front-end/src/components/register/register.jsx b/front-end/src/components/register/register.jsx index 2307686e9..a99ec7bdf 100644 --- a/front-end/src/components/register/register.jsx +++ b/front-end/src/components/register/register.jsx @@ -56,14 +56,6 @@ const RegisterComponent = ({signUp,user}) => {
-
- -
- -
-
-
diff --git a/front-end/src/redux/saga/saga.js b/front-end/src/redux/saga/saga.js index 73d64370a..f328267cf 100644 --- a/front-end/src/redux/saga/saga.js +++ b/front-end/src/redux/saga/saga.js @@ -8,7 +8,7 @@ const LoginValidation = (data) => { password:data.password } - return fetch('http://localhost:5000/api/user/user-login',{ + return fetch('http://localhost:5000/api/user/login',{ method:'POST', headers: { 'Content-Type': 'application/json', From 6739950e9c9447ac5fd2f3a9b877006d3758ba6d Mon Sep 17 00:00:00 2001 From: AKA717 Date: Wed, 8 Nov 2023 22:57:54 +0530 Subject: [PATCH 28/35] saga middlwares and actions --- .../src/redux/actions/action-constants.js | 16 ++++ front-end/src/redux/actions/actions.js | 32 +++++++- .../src/redux/reducers/user/user-reducer.js | 11 +++ front-end/src/redux/saga/saga.js | 82 ++++++++++++++++++- 4 files changed, 138 insertions(+), 3 deletions(-) diff --git a/front-end/src/redux/actions/action-constants.js b/front-end/src/redux/actions/action-constants.js index 6d174b69c..7058491d9 100644 --- a/front-end/src/redux/actions/action-constants.js +++ b/front-end/src/redux/actions/action-constants.js @@ -8,6 +8,22 @@ const actions = { SIGNUP_START : 'SIGNUP_START', SIGNUP_SUCCESS : 'SIGNUP_SUCCESS', SIGNUP_FAILED : 'SIGNUP_FAILED', + CONTACTS_FETCH_START : 'CONTACTS_FETCH_START', + CONTACTS_FETCH_SUCCESS : 'CONTACTS_FETCH_SUCCESS', + CONTACTS_FETCH_FAILED : 'CONTACTS_FETCH_FAILED', + EDIT_CONTACT_START : 'EDIT_CONTACT_START', + EDIT_CONTACT_SUCCESS : 'EDIT_CONTACT_SUCCESS', + EDIT_CONTACT_FAILED : 'EDIT_CONTACT_FAILED', + CONTACT_DELETE_START : 'CONTACT_DELETE_START', + CONTACT_DELETE_SUCCESS : 'CONTACT_DELETE_SUCCESS', + CONTACT_DELETE_FAILED : 'CONTACT_DELETE_FAILED', + CONTACT_UPDATE_START : 'CONTACT_UPDATE_START', + CONTACT_UPDATE_SUCCESS : 'CONTACT_UPDATE_SUCCESS', + CONTACT_UPDATE_FAILED : 'CONTACT_UPDATE_FAILED', + ADD_CONTACT_START : 'ADD_CONTACT_START', + ADD_CONTACT_SUCCESS : 'ADD_CONTACT_SUCCESS', + ADD_CONTACT_FAILED : 'ADD_CONTACT_FAILED' + }; export default actions; \ No newline at end of file diff --git a/front-end/src/redux/actions/actions.js b/front-end/src/redux/actions/actions.js index 0beb0a453..46e8b03ef 100644 --- a/front-end/src/redux/actions/actions.js +++ b/front-end/src/redux/actions/actions.js @@ -1,10 +1,38 @@ import actions from "./action-constants"; -export const studentDataAction = (payload) => { +export const deleteContact = (payload) => { + return( + { + type : actions.CONTACT_DELETE_START, + payload : payload + } + ); +} + +export const editContactAction = (payload) => { + return( + { + type : actions.EDIT_CONTACT_START, + payload : payload + } + ); +} + +export const addContactAction = (payload) => { + + return( + { + type : actions.ADD_CONTACT_START, + payload : payload + } + ); +} + +export const contactFetchAction = (payload) => { return( { - type : actions.STUDENT_DATA_START, + type : actions.CONTACTS_FETCH_START, payload : payload } ); diff --git a/front-end/src/redux/reducers/user/user-reducer.js b/front-end/src/redux/reducers/user/user-reducer.js index 55e1153bb..13a9f8b59 100644 --- a/front-end/src/redux/reducers/user/user-reducer.js +++ b/front-end/src/redux/reducers/user/user-reducer.js @@ -37,6 +37,17 @@ const userReducer = (state=initState,action) => message : action.payload.message, login:false } + case actions.CONTACTS_FETCH_SUCCESS: + return{ + ...state, + contacts : action.payload.contacts + } + case actions.CONTACTS_FETCH_FAILED: + return { + ...state, + contacts : null, + message : "contacts fetch failed" + } default: return state; } diff --git a/front-end/src/redux/saga/saga.js b/front-end/src/redux/saga/saga.js index f328267cf..8d839935d 100644 --- a/front-end/src/redux/saga/saga.js +++ b/front-end/src/redux/saga/saga.js @@ -51,6 +51,36 @@ const SignUp = (data) => { }) } +const getContacts = (id) => { + + const user = { + id : id + } + return fetch('http://localhost:5000/api/user/get-contacts',{ + method:'GET', + headers: { + 'Content-Type': 'application/json', + }, + body:JSON.stringify(user) + }) + .then(async res => + { + res = await res.json(); + return res; + }) + .catch(error => { + console.log(error) + }) +} + +const deleteContact = (data) => { + + const info = { + userId : data.id, + contact : contact.id + } +} + function* handleloginStart(action){ try{ @@ -103,6 +133,47 @@ function* handleSignUp(action){ } +function* handleContactsFetch(action){ + try{ + const res = yield call(getContacts,action.payload.id); + + console.log("signup response",res); + + if(res.success) + { + yield put({type:actions.CONTACTS_FETCH_SUCCESS,payload:res.contacts}); + } + else + { + yield put({type:actions.CONTACTS_FETCH_FAILED,payload:res}) + } + } + catch(err){ + console.log(err); + } +} + +function* handleContactDelete(action) +{ + try{ + const res = yield call(deleteContact,action.payload); + + console.log("signup response",res); + + if(res.success) + { + yield put({type:actions.CONTACT_DELETE_SUCCESS,payload:res}); + } + else + { + yield put({type:actions.CONTACT_DELETE_FAILED,payload:res}) + } + } + catch(err){ + console.log(err); + } +} + function* watchForLoginStart(){ yield takeLatest(actions.LOGIN_START,handleloginStart); } @@ -115,12 +186,21 @@ function* watchForSignUpStart(){ yield takeLatest(actions.SIGNUP_START,handleSignUp); } +function* watchForContactsFetch(){ + yield takeLatest(actions.CONTACTS_FETCH_START,handleContactsFetch) +} + +function* watchForContactDelete(){ + yield takeLatest(actions.CONTACT_DELETE_START,handleContactDelete) +} + export default function* rootSaga() { yield all( [ watchForLoginStart(), watchForLogOutStart(), - watchForSignUpStart() + watchForSignUpStart(), + watchForContactsFetch() ]); } \ No newline at end of file From 486942acdaafff8903b0636ee0fa6a69b01b3bec Mon Sep 17 00:00:00 2001 From: AKA717 Date: Thu, 9 Nov 2023 10:11:51 +0530 Subject: [PATCH 29/35] login ,register, home view,add contact features added --- back-end/routes/user-router.js | 55 ++++---- front-end/package-lock.json | 9 ++ front-end/package.json | 1 + .../src/components/addContact/add-contact.css | 0 .../src/components/addContact/add-contact.jsx | 119 ++++++++++++++++++ front-end/src/components/card/card.css | 0 front-end/src/components/card/card.jsx | 36 ++++++ front-end/src/components/home/home.jsx | 5 +- front-end/src/components/navbar/navbar.jsx | 3 - front-end/src/components/view/view.css | 0 front-end/src/components/view/view.jsx | 60 +++++++++ front-end/src/redux/saga/saga.js | 60 +++++++-- 12 files changed, 312 insertions(+), 36 deletions(-) create mode 100644 front-end/src/components/addContact/add-contact.css create mode 100644 front-end/src/components/addContact/add-contact.jsx create mode 100644 front-end/src/components/card/card.css create mode 100644 front-end/src/components/card/card.jsx create mode 100644 front-end/src/components/view/view.css create mode 100644 front-end/src/components/view/view.jsx diff --git a/back-end/routes/user-router.js b/back-end/routes/user-router.js index e37fd6f67..9c24718fd 100644 --- a/back-end/routes/user-router.js +++ b/back-end/routes/user-router.js @@ -115,7 +115,9 @@ router.delete('/delete-contact', async (req, res) => { }); -router.get('/get-contacts',async (req,res) => { +router.post('/get-contacts',async (req,res) => { + + console.log("get contacts route : ",req.body); const userId = req.body.id; const isUser = await Contact.findOne({ _id: userId }); @@ -135,7 +137,7 @@ router.get('/get-contacts',async (req,res) => { res.status(401).json( { success: false, - message: "user already exists" + message: "failed to fetch contacts" } ) } @@ -143,13 +145,13 @@ router.get('/get-contacts',async (req,res) => { }) // Image upload -router.post('/add-contact', upload.single('image'), async (req, res) => { +router.post('/add-contact', async (req, res) => { - if (!req.file) { - // Handle the case where no file was uploaded - res.status(400).send(apiResponse({ message: 'No file uploaded.' })); - return; - } + // if (!req.file) { + // // Handle the case where no file was uploaded + // res.status(400).send(apiResponse({ message: 'No file uploaded.' })); + // return; + // } const userId = req.body.id; // Assuming user ID is available in req.body const image = req.file; // Access the uploaded file info @@ -176,30 +178,39 @@ router.post('/add-contact', upload.single('image'), async (req, res) => { address: contactData.address }; - // Save the uploaded image with the name the same as the contact's ID - const imageExtension = image.originalname.split('.').pop(); - const imageFileName = `${newContact._id.toString()}.${imageExtension}`; + // // Save the uploaded image with the name the same as the contact's ID + // const imageExtension = image.originalname.split('.').pop(); + // const imageFileName = `${newContact._id.toString()}.${imageExtension}`; - const oldFilePath = `public/profile/${userId}.${imageExtension}`; // Replace with the path to the old image file - const newFilePath = `public/profile/${imageFileName}`; // Replace with the desired new path and name for the image + // const oldFilePath = `public/profile/${userId}.${imageExtension}`; // Replace with the path to the old image file + // const newFilePath = `public/profile/${imageFileName}`; // Replace with the desired new path and name for the image - fs.rename(oldFilePath, newFilePath, (err) => { - if (err) { - console.error('Error renaming the image:', err); - } else { - console.log('Image renamed successfully'); - } - }); + // fs.rename(oldFilePath, newFilePath, (err) => { + // if (err) { + // console.error('Error renaming the image:', err); + // } else { + // console.log('Image renamed successfully'); + // } + // }); userProfile.contacts.push(newContact); // Save the updated user profile await userProfile.save(); - res.send(apiResponse({ message: 'File uploaded successfully.', image })); + res.status(200).json({ + success: true, + message: "success", + }); + } catch (error) { console.error(error); - res.status(500).send(apiResponse({ message: 'Error processing the request.' })); + res.status(401).json( + { + success: false, + message: "failed to add contact" + } + ) } }); diff --git a/front-end/package-lock.json b/front-end/package-lock.json index 90d8fc230..706d556d1 100644 --- a/front-end/package-lock.json +++ b/front-end/package-lock.json @@ -11,6 +11,7 @@ "@reduxjs/toolkit": "^1.9.5", "axios": "^1.5.1", "bootstrap": "^5.3.2", + "font-awesome": "^4.7.0", "jquery": "^3.7.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -2166,6 +2167,14 @@ } } }, + "node_modules/font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==", + "engines": { + "node": ">=0.10.3" + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", diff --git a/front-end/package.json b/front-end/package.json index 7ef3cffe7..581bb76b7 100644 --- a/front-end/package.json +++ b/front-end/package.json @@ -13,6 +13,7 @@ "@reduxjs/toolkit": "^1.9.5", "axios": "^1.5.1", "bootstrap": "^5.3.2", + "font-awesome": "^4.7.0", "jquery": "^3.7.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/front-end/src/components/addContact/add-contact.css b/front-end/src/components/addContact/add-contact.css new file mode 100644 index 000000000..e69de29bb diff --git a/front-end/src/components/addContact/add-contact.jsx b/front-end/src/components/addContact/add-contact.jsx new file mode 100644 index 000000000..a81a04ddb --- /dev/null +++ b/front-end/src/components/addContact/add-contact.jsx @@ -0,0 +1,119 @@ +import React, { useEffect, useRef } from "react"; +import { connect } from 'react-redux'; +import { useForm } from 'react-hook-form'; +import { useNavigate } from "react-router-dom"; +import { addContactAction } from "../../redux/actions/actions"; +import "./add-contact.css"; + +const AddContactComponent = ({addContact,user}) => { + + const navigate = useNavigate(); + + const { + register, + handleSubmit, + reset, + formState: { errors } + } = useForm(); + + const onSubmit = (data) => { + console.log("add contact : ",data); + data.id = user.user.id; + addContact(data); + reset(); + }; + + useEffect(() => { + if (!user.login) { + + navigate('/', { replace: true }); + + } + }, [user.login, navigate]); + + return ( +
+
+
+
+
+
+
+
+ +

Add Contact

+ + { + !user.success?

{user.message}

: <> + } + + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + + +
+
+ + Sample image + +
+
+
+
+
+
+
+
+ ); +} + +const mapStateToProps = ({user}) => { + + return{user} +} + +const mapDispatchToProps = dispatch => { + + return { + addContact : (data) => dispatch(addContactAction(data)) + } +} + +export default connect(mapStateToProps,mapDispatchToProps)(AddContactComponent); \ No newline at end of file diff --git a/front-end/src/components/card/card.css b/front-end/src/components/card/card.css new file mode 100644 index 000000000..e69de29bb diff --git a/front-end/src/components/card/card.jsx b/front-end/src/components/card/card.jsx new file mode 100644 index 000000000..471083e26 --- /dev/null +++ b/front-end/src/components/card/card.jsx @@ -0,0 +1,36 @@ +import React from "react"; + +const Card = ({name,phone,imageId}) => { + console.log("card key : ",imageId); + return ( +
+
+
+
+
+ Profile +
+
+
+
{name}
+

{phone}

+ + +
+
+
+
+
+
+ ); +}; + +export default Card; \ No newline at end of file diff --git a/front-end/src/components/home/home.jsx b/front-end/src/components/home/home.jsx index 8fd3ae0a3..35fc15ab4 100644 --- a/front-end/src/components/home/home.jsx +++ b/front-end/src/components/home/home.jsx @@ -4,6 +4,8 @@ import { Route, Routes, useLocation } from "react-router-dom"; import Navbar from "../navbar/navbar"; import LoginComponent from "../login/login"; import RegisterComponent from "../register/register"; +import UserView from "../view/view"; +import AddContactComponent from "../addContact/add-contact"; import './home.css'; const Home = () => { @@ -18,7 +20,8 @@ const Home = () => { }/> }/> - }/> + }/> + }/> ); diff --git a/front-end/src/components/navbar/navbar.jsx b/front-end/src/components/navbar/navbar.jsx index 154ce9f8a..cd52b8dce 100644 --- a/front-end/src/components/navbar/navbar.jsx +++ b/front-end/src/components/navbar/navbar.jsx @@ -8,9 +8,6 @@ const Navbar = ({user,logOut}) => { const location = useLocation(); - console.log("current path : ",location.pathname); - - console.log("inside ",user); return(