From 59901757c647194ccbed193752d78a24647fdb30 Mon Sep 17 00:00:00 2001 From: Augusto Date: Thu, 21 Mar 2024 10:32:46 +0100 Subject: [PATCH 01/37] Replace wiq0 by wi1 es4d --- .env | 2 +- .github/workflows/release.yml | 12 ++++++------ README.md | 14 +++++++------- docker-compose.yml | 8 ++++---- docs/README.md | 4 ++-- gatewayservice/package.json | 6 +++--- users/authservice/package.json | 6 +++--- users/userservice/package.json | 6 +++--- webapp/src/App.js | 2 +- webapp/src/App.test.js | 2 +- 10 files changed, 31 insertions(+), 31 deletions(-) diff --git a/.env b/.env index 131b17e..7c192bf 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -teamname="wiq_0" \ No newline at end of file +teamname="wiq_es04d" \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 48a92d3..bc51ac9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,7 @@ jobs: env: API_URI: http://${{ secrets.DEPLOY_HOST }}:8000 with: - name: arquisoft/wiq_0/webapp + name: arquisoft/wiq_es04d/webapp username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io @@ -71,7 +71,7 @@ jobs: - name: Publish to Registry uses: elgohr/Publish-Docker-Github-Action@v5 with: - name: arquisoft/wiq_0/authservice + name: arquisoft/wiq_es04d/authservice username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io @@ -88,7 +88,7 @@ jobs: - name: Publish to Registry uses: elgohr/Publish-Docker-Github-Action@v5 with: - name: arquisoft/wiq_0/userservice + name: arquisoft/wiq_es04d/userservice username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io @@ -109,7 +109,7 @@ jobs: - name: Publish to Registry uses: elgohr/Publish-Docker-Github-Action@v5 with: - name: arquisoft/wiq_0/gatewayservice + name: arquisoft/wiq_es04d/gatewayservice username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io @@ -126,7 +126,7 @@ jobs: user: ${{ secrets.DEPLOY_USER }} key: ${{ secrets.DEPLOY_KEY }} command: | - wget https://raw.githubusercontent.com/arquisoft/wiq_0/master/docker-compose.yml -O docker-compose.yml - wget https://raw.githubusercontent.com/arquisoft/wiq_0/master/.env -O .env + wget https://raw.githubusercontent.com/arquisoft/wiq_es04d/master/docker-compose.yml -O docker-compose.yml + wget https://raw.githubusercontent.com/arquisoft/wiq_es04d/master/.env -O .env docker compose --profile prod down docker compose --profile prod up -d --pull always diff --git a/README.md b/README.md index e78fdd6..2a6642a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# wiq_0 +# wiq_es04d -[![Deploy on release](https://github.com/Arquisoft/wiq_0/actions/workflows/release.yml/badge.svg)](https://github.com/Arquisoft/wiq_0/actions/workflows/release.yml) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_wiq_0&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Arquisoft_wiq_0) -[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_wiq_0&metric=coverage)](https://sonarcloud.io/summary/new_code?id=Arquisoft_wiq_0) +[![Deploy on release](https://github.com/Arquisoft/wiq_es04d/actions/workflows/release.yml/badge.svg)](https://github.com/Arquisoft/wiq_es04d/actions/workflows/release.yml) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_wiq_es04d&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Arquisoft_wiq_es04d) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_wiq_es04d&metric=coverage)](https://sonarcloud.io/summary/new_code?id=Arquisoft_wiq_es04d) This is a base repo for the [Software Architecture course](http://arquisoft.github.io/) in [2023/2024 edition](https://arquisoft.github.io/course2324.html). @@ -22,7 +22,7 @@ Both the user and auth service share a Mongo database that is accessed with mong The fastest way for launching this sample project is using docker. Just clone the project: ```sh -git clone https://github.com/Arquisoft/wiq_0.git +git clone https://github.com/Arquisoft/wiq_es04d.git ``` and launch it with docker compose: @@ -106,8 +106,8 @@ deploy: user: ${{ secrets.DEPLOY_USER }} key: ${{ secrets.DEPLOY_KEY }} command: | - wget https://raw.githubusercontent.com/arquisoft/wiq_0/master/docker-compose.yml -O docker-compose.yml - wget https://raw.githubusercontent.com/arquisoft/wiq_0/master/.env -O .env + wget https://raw.githubusercontent.com/arquisoft/wiq_es04d/master/docker-compose.yml -O docker-compose.yml + wget https://raw.githubusercontent.com/arquisoft/wiq_es04d/master/.env -O .env docker compose --profile prod down docker compose --profile prod up -d --pull always ``` diff --git a/docker-compose.yml b/docker-compose.yml index c105ed5..097f0cc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: authservice: container_name: authservice-${teamname:-defaultASW} - image: ghcr.io/arquisoft/wiq_0/authservice:latest + image: ghcr.io/arquisoft/wiq_es04d/authservice:latest profiles: ["dev", "prod"] build: ./users/authservice depends_on: @@ -27,7 +27,7 @@ services: userservice: container_name: userservice-${teamname:-defaultASW} - image: ghcr.io/arquisoft/wiq_0/userservice:latest + image: ghcr.io/arquisoft/wiq_es04d/userservice:latest profiles: ["dev", "prod"] build: ./users/userservice depends_on: @@ -41,7 +41,7 @@ services: gatewayservice: container_name: gatewayservice-${teamname:-defaultASW} - image: ghcr.io/arquisoft/wiq_0/gatewayservice:latest + image: ghcr.io/arquisoft/wiq_es04d/gatewayservice:latest profiles: ["dev", "prod"] build: ./gatewayservice depends_on: @@ -58,7 +58,7 @@ services: webapp: container_name: webapp-${teamname:-defaultASW} - image: ghcr.io/arquisoft/wiq_0/webapp:latest + image: ghcr.io/arquisoft/wiq_es04d/webapp:latest profiles: ["dev", "prod"] build: ./webapp depends_on: diff --git a/docs/README.md b/docs/README.md index 61766e4..bb6bb4b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ ## The documentation In this project, the documentation is compiled locally and deployed to GitHub pages. -The deployment url is: [https://arquisoft.github.io/wiq_0/](https://arquisoft.github.io/wiq_0/). +The deployment url is: [https://arquisoft.github.io/wiq_es04d/](https://arquisoft.github.io/wiq_es04d/). ### Documentation build For the documentation, we are going to use [AsciiDoc](https://asciidoc.org/) and [PlantUML](https://plantuml.com) and follow the [Arc42](https://github.com/arc42/arc42-template) template. If you want to be able to generate the doc locally you need to install Ruby, Java and some dependencies to translate the AsciiDoc code into html. If you are in Linux you can install Ruby and Java simply by executing: @@ -30,6 +30,6 @@ npm run build The documentation will be generated under the `docs/build` directory. ### Documentation deployment -If we want to deploy it to GitHub pages, so it is accessible via [https://arquisoft.github.io/wiq_0/](https://arquisoft.github.io/wiq_0/), we need to execute `npm run deploy`. +If we want to deploy it to GitHub pages, so it is accessible via [https://arquisoft.github.io/wiq_es04d/](https://arquisoft.github.io/wiq_es04d/), we need to execute `npm run deploy`. If you check the `package.json` in this directory you can see how deploying is as easy as executing `gh-pages -d build`, which can be directly executed using `npm run deploy` in the docs directory. The `gh-pages` package is in charge of pushing the documentation generated directory (basically some htmls) to a special github branch called gh-pages. Everything pushed to this branch is accessible on the repository page. Note that we only want to push there the documentation. Also is important that the documentation build is not pushed to the other branches of the project. \ No newline at end of file diff --git a/gatewayservice/package.json b/gatewayservice/package.json index 1d5f9df..83f5ad2 100644 --- a/gatewayservice/package.json +++ b/gatewayservice/package.json @@ -9,14 +9,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/arquisoft/wiq_0.git" + "url": "git+https://github.com/arquisoft/wiq_es04d.git" }, "author": "", "license": "ISC", "bugs": { - "url": "https://github.com/arquisoft/wiq_0/issues" + "url": "https://github.com/arquisoft/wiq_es04d/issues" }, - "homepage": "https://github.com/arquisoft/wiq_0#readme", + "homepage": "https://github.com/arquisoft/wiq_es04d#readme", "dependencies": { "axios": "^1.6.5", "cors": "^2.8.5", diff --git a/users/authservice/package.json b/users/authservice/package.json index 6b5b623..a6c5d12 100644 --- a/users/authservice/package.json +++ b/users/authservice/package.json @@ -9,14 +9,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/arquisoft/wiq_0.git" + "url": "git+https://github.com/arquisoft/wiq_es04d.git" }, "author": "", "license": "ISC", "bugs": { - "url": "https://github.com/arquisoft/wiq_0/issues" + "url": "https://github.com/arquisoft/wiq_es04d/issues" }, - "homepage": "https://github.com/arquisoft/wiq_0#readme", + "homepage": "https://github.com/arquisoft/wiq_es04d#readme", "dependencies": { "bcrypt": "^5.1.1", "body-parser": "^1.20.2", diff --git a/users/userservice/package.json b/users/userservice/package.json index 2462c8e..92136d8 100644 --- a/users/userservice/package.json +++ b/users/userservice/package.json @@ -9,14 +9,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/arquisoft/wiq_0.git" + "url": "git+https://github.com/arquisoft/wiq_es04d.git" }, "author": "", "license": "ISC", "bugs": { - "url": "https://github.com/arquisoft/wiq_0/issues" + "url": "https://github.com/arquisoft/wiq_es04d/issues" }, - "homepage": "https://github.com/arquisoft/wiq_0#readme", + "homepage": "https://github.com/arquisoft/wiq_es04d#readme", "dependencies": { "bcrypt": "^5.1.1", "body-parser": "^1.20.2", diff --git a/webapp/src/App.js b/webapp/src/App.js index 910935a..2df8e61 100644 --- a/webapp/src/App.js +++ b/webapp/src/App.js @@ -17,7 +17,7 @@ function App() { - Welcome to wiq_0 + Welcome to wiq_es04d {showLogin ? : } diff --git a/webapp/src/App.test.js b/webapp/src/App.test.js index 9aa2775..496dba9 100644 --- a/webapp/src/App.test.js +++ b/webapp/src/App.test.js @@ -3,6 +3,6 @@ import App from './App'; test('renders learn react link', () => { render(); - const linkElement = screen.getByText(/Welcome to wiq_0/i); + const linkElement = screen.getByText(/Welcome to wiq_es04d/i); expect(linkElement).toBeInTheDocument(); }); From c36fcf1b338f0c4f811a883b8b248eab9a61daba Mon Sep 17 00:00:00 2001 From: Santiago21112001 Date: Thu, 21 Mar 2024 11:18:53 +0100 Subject: [PATCH 02/37] questionservice --- docker-compose.yml | 16 + questionservice/.dockerignore | 2 + questionservice/.env | 0 questionservice/Dockerfile | 20 + questionservice/package-lock.json | 5635 ++++++++++++++++++++++ questionservice/package.json | 35 + questionservice/question-model.js | 31 + questionservice/question-service.js | 65 + questionservice/question-service.test.js | 5 + questionservice/templates.json | 8 + questionservice/wikiUtils/wikiCall.js | 22 + questionservice/wikiUtils/wikiQuery.js | 59 + 12 files changed, 5898 insertions(+) create mode 100644 questionservice/.dockerignore create mode 100644 questionservice/.env create mode 100644 questionservice/Dockerfile create mode 100644 questionservice/package-lock.json create mode 100644 questionservice/package.json create mode 100644 questionservice/question-model.js create mode 100644 questionservice/question-service.js create mode 100644 questionservice/question-service.test.js create mode 100644 questionservice/templates.json create mode 100644 questionservice/wikiUtils/wikiCall.js create mode 100644 questionservice/wikiUtils/wikiQuery.js diff --git a/docker-compose.yml b/docker-compose.yml index c105ed5..7e7efe4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -39,6 +39,20 @@ services: environment: MONGODB_URI: mongodb://mongodb:27017/userdb + questionservice: + container_name: questionservice-${teamname:-wiq_es04d} + image: ghcr.io/arquisoft/wiq_es04d/questionservice:latest + profiles: ["dev", "prod"] + build: ./questionservice + depends_on: + - mongodb + ports: + - "8003:8003" + networks: + - mynetwork + environment: + MONGODB_URI: mongodb://mongodb:27017/userdb + gatewayservice: container_name: gatewayservice-${teamname:-defaultASW} image: ghcr.io/arquisoft/wiq_0/gatewayservice:latest @@ -48,6 +62,7 @@ services: - mongodb - userservice - authservice + - questionservice ports: - "8000:8000" networks: @@ -55,6 +70,7 @@ services: environment: AUTH_SERVICE_URL: http://authservice:8002 USER_SERVICE_URL: http://userservice:8001 + GENERATE_SERVICE_URL: http://questionservice:8003 webapp: container_name: webapp-${teamname:-defaultASW} diff --git a/questionservice/.dockerignore b/questionservice/.dockerignore new file mode 100644 index 0000000..3091757 --- /dev/null +++ b/questionservice/.dockerignore @@ -0,0 +1,2 @@ +node_modules +coverage \ No newline at end of file diff --git a/questionservice/.env b/questionservice/.env new file mode 100644 index 0000000..e69de29 diff --git a/questionservice/Dockerfile b/questionservice/Dockerfile new file mode 100644 index 0000000..ae8f3e4 --- /dev/null +++ b/questionservice/Dockerfile @@ -0,0 +1,20 @@ +# Use an official Node.js runtime as a parent image +FROM node:20 + +# Set the working directory in the container +WORKDIR /usr/src/questionservice + +# Copy package.json and package-lock.json to the working directory +COPY package*.json ./ + +# Install app dependencies +RUN npm install + +# Copy the app source code to the working directory +COPY . . + +# Expose the port the app runs on +EXPOSE 8003 + +# Define the command to run your app +CMD ["node", "question-service.js"] diff --git a/questionservice/package-lock.json b/questionservice/package-lock.json new file mode 100644 index 0000000..339eab4 --- /dev/null +++ b/questionservice/package-lock.json @@ -0,0 +1,5635 @@ +{ + "name": "questionservice", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "questionservice", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.1.1", + "body-parser": "^1.20.2", + "dotenv": "^16.4.5", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.0.4", + "mysql2": "^3.9.2", + "node-cron": "^3.0.0" + }, + "devDependencies": { + "jest": "^29.7.0", + "mongodb-memory-server": "^9.1.5", + "supertest": "^6.3.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.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/core/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/@babel/core/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/@babel/core/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/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@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.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "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.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "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.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "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.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@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.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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/@babel/traverse/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/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "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.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", + "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "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.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "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.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "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==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "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-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "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/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/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/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==" + }, + "node_modules/bare-events": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.1.tgz", + "integrity": "sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==", + "dev": true, + "optional": true + }, + "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/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==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "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.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "dev": true, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "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==", + "dev": true + }, + "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.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001599", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", + "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", + "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": "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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/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/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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "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/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/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/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.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/electron-to-chromium": { + "version": "1.4.713", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.713.tgz", + "integrity": "sha512-vDarADhwntXiULEdmWd77g2dV6FrNGa8ecAC29MZ4TwPut2fvosD0/5sJd1qWNNe8HcJFAC+F5Lf9jW1NPtWmw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.1.tgz", + "integrity": "sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.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/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "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-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "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==", + "dev": true, + "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/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "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-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/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==", + "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==", + "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/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "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/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "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/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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==", + "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-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "devOptional": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "devOptional": true + }, + "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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "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-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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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/istanbul-lib-source-maps/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/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=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==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "devOptional": true + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "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/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/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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==" + }, + "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/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "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/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.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/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=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/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/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/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/mongodb": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", + "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb-memory-server": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-9.1.7.tgz", + "integrity": "sha512-Yxw1cUMoCKTK6jxk4cKG07P+Z/qOmuCVyt3ScIDaoHeOCbOlg2sEtXYO9vEK/tzpj/1KHdDStU2oYrsJ8Fvm0A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "mongodb-memory-server-core": "9.1.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/mongodb-memory-server-core": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-9.1.7.tgz", + "integrity": "sha512-q8geqCmt5hGuxaDhRo03ZUB0ITr6lnJ3jffdNiC4nDq13WbHUfY2A1RQq3OHDbdrY6aRYvZphx2bcXYBFRis3A==", + "dev": true, + "dependencies": { + "async-mutex": "^0.4.0", + "camelcase": "^6.3.0", + "debug": "^4.3.4", + "find-cache-dir": "^3.3.2", + "follow-redirects": "^1.15.3", + "https-proxy-agent": "^7.0.2", + "mongodb": "^5.9.1", + "new-find-package-json": "^2.0.0", + "semver": "^7.5.4", + "tar-stream": "^3.0.0", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mongodb-memory-server-core/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/mongodb-memory-server-core/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/mongodb-memory-server-core/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/mongoose": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.2.2.tgz", + "integrity": "sha512-6sMxe1d3k/dBjiOX4ExNTNOP0g1x0iq8eXyg+ttgIXM3HLnQ0IUyXRwVVAPFFY6O4/8uYN5dB0Ec72FrexbPpw==", + "dependencies": { + "bson": "^6.2.0", + "kareem": "2.5.1", + "mongodb": "6.3.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/@types/whatwg-url": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", + "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/mongoose/node_modules/bson": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.5.0.tgz", + "integrity": "sha512-DXf1BTAS8vKyR90BO4x5v3rKVarmkdkzwOrnYDFdjAY694ILNDkmA3uRh1xXJEl+C1DAh8XCvAQ+Gh3kzubtpg==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/mongoose/node_modules/mongodb": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", + "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.2.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongoose/node_modules/mongodb-connection-string-url": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", + "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "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/mongoose/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/mongoose/node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "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/mysql2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.2.tgz", + "integrity": "sha512-3Cwg/UuRkAv/wm6RhtPE5L7JlPB877vwSF6gfLAS68H+zhH+u5oa3AieqEd0D0/kC3W7qIhYbH419f7O9i/5nw==", + "dependencies": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "engines": { + "node": ">=16.14" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "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/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/new-find-package-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-2.0.0.tgz", + "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/new-find-package-json/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/new-find-package-json/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/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-cron": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz", + "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==", + "dependencies": { + "uuid": "8.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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==", + "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/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/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "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/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "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/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/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/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "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/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.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "devOptional": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.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==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/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/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/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/supertest": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.1.2" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "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/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/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-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "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/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==", + "dev": true, + "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/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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==", + "dev": true + }, + "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/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/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/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.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/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "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==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/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/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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/questionservice/package.json b/questionservice/package.json new file mode 100644 index 0000000..9efb861 --- /dev/null +++ b/questionservice/package.json @@ -0,0 +1,35 @@ +{ + "name": "questionservice", + "version": "1.0.0", + "description": "Microservicio de generar preguntas", + "main": "service.js", + "scripts": { + "start": "node question-Service.js", + "test": "jest" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/arquisoft/wiq_04d4d.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/arquisoft/wiq_04d4d/issues" + }, + "homepage": "https://github.com/arquisoft/wiq_04d4d#readme", + "dependencies": { + "bcrypt": "^5.1.1", + "body-parser": "^1.20.2", + "dotenv": "^16.4.5", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.0.4", + "mysql2": "^3.9.2", + "node-cron": "^3.0.0" + }, + "devDependencies": { + "jest": "^29.7.0", + "mongodb-memory-server": "^9.1.5", + "supertest": "^6.3.4" + } +} diff --git a/questionservice/question-model.js b/questionservice/question-model.js new file mode 100644 index 0000000..1936b6e --- /dev/null +++ b/questionservice/question-model.js @@ -0,0 +1,31 @@ +const mongoose = require('mongoose'); + +const answerSchema = new mongoose.Schema({ + answer: { + type: String, + required: true + }, + correct: { + type: Boolean, + required: true + } +}); + +const questionSchema = new mongoose.Schema({ + question: { + type: String, + required: true + }, + answers: { + type: [answerSchema], // Utiliza el esquema definido para cada respuesta + required: true + }, + questionCategory: { + type: String, + required: true + } +}); + +const Question = mongoose.model('Question', questionSchema); + +module.exports = Question; \ No newline at end of file diff --git a/questionservice/question-service.js b/questionservice/question-service.js new file mode 100644 index 0000000..6215ff0 --- /dev/null +++ b/questionservice/question-service.js @@ -0,0 +1,65 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const app = express(); +const port = 8003; + +// Importamos la función desde questionTemplates.js +const templates = require('./templates.json') +// Connect to MongoDB +const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/userdb'; +mongoose.connect(mongoUri); + +const WikiQuery = require('./wikiUtils/wikiQuery'); +const Question = require('./question-model'); + +async function generateQuestions() { + const template = templates.capital_of; + const newQuestions = await WikiQuery.getQuestions(template, 10); + newQuestions.forEach(q => { + console.log(q.question); + console.log(q.answers); + }); + Question.insertMany(newQuestions); +} + +app.get('/getquestion', async (req, res) => { + try { + + // Realizar consulta de agregación para obtener una pregunta aleatoria + const randomQuestion = await Question.aggregate([ + { $sample: { size: 1 } } // Selecciona una pregunta aleatoria + ]); + + //const questionAndAnswer = await getQuestionTemplate(); // Obtenemos el json de pregunta y sus respuestas + console.log(randomQuestion); // Imprime questionAndAnswer en la consola + + res.json(randomQuestion); //Devolvemos a la gateway el json + } catch (error) { + console.log("Error getting question from database: " + error); + console.log("Adding new questions to database..."); + await generateQuestions(); + console.log("Questions added. Getting random question..."); + const randomQuestion = await Question.aggregate([ + { $sample: { size: 1 } } // Selecciona una pregunta aleatoria + ]); + console.log("Random question selected: " + randomQuestion); // Imprime questionAndAnswer en la consola + res.json(randomQuestion); //Devolvemos a la gateway el json + } + +}); + +app.get('/generatequestions', async (req, res) => { + try { + await generateQuestions(); + res.json({ status: 'OK' }); + } catch (error) { + res.status(error.response.status).json({ error: error.response.data.error }); + } + +}); + +app.listen(port, () => { + console.log(`Server listening on http://localhost:${port}`); +}); + + diff --git a/questionservice/question-service.test.js b/questionservice/question-service.test.js new file mode 100644 index 0000000..c42bf40 --- /dev/null +++ b/questionservice/question-service.test.js @@ -0,0 +1,5 @@ +describe('questionservice', () => { + test('test', () => { + + }); +}); diff --git a/questionservice/templates.json b/questionservice/templates.json new file mode 100644 index 0000000..2df0d22 --- /dev/null +++ b/questionservice/templates.json @@ -0,0 +1,8 @@ +{ + "capital_of": { + "question": "¿Cuál es la capital de __x__?", + "questionVariable": "wd:Q6256", + "answerVariable": "wdt:P36", + "questionCategory": "Geografia" + } +} \ No newline at end of file diff --git a/questionservice/wikiUtils/wikiCall.js b/questionservice/wikiUtils/wikiCall.js new file mode 100644 index 0000000..15c5d45 --- /dev/null +++ b/questionservice/wikiUtils/wikiCall.js @@ -0,0 +1,22 @@ +const fetch = require('node-fetch'); + +const ENDPOINT_URL = 'https://query.wikidata.org/sparql'; + +async function wikiCall(sparqlQuery) { + const url = ENDPOINT_URL + '?query=' + encodeURIComponent(sparqlQuery); + const headers = { 'Accept': 'application/sparql-results+json' }; + + try { + const response = await fetch(url, { headers }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + return data.results.bindings; + } catch (error) { + console.error(`Could not fetch data from Wikidata: ${error}`); + return []; + } +} + +module.exports = wikiCall; diff --git a/questionservice/wikiUtils/wikiQuery.js b/questionservice/wikiUtils/wikiQuery.js new file mode 100644 index 0000000..08ef01c --- /dev/null +++ b/questionservice/wikiUtils/wikiQuery.js @@ -0,0 +1,59 @@ +const wikiCall = require("./wikiCall"); +const Question = require('../question-model') + +class WikiQuery { + + /** + * Obtiene preguntas de wikidata a partir de una plantilla. + * @param {Object} template - La plantilla sacada de templates.json. + * @param {Number} limitValue - El límite de preguntas a obtener (número entero). Debe ser mayor a 3. + * @returns preguntas con el formato de api_questionservice.txt + */ + static async getQuestions(template, limitValue) { + const query = ` + SELECT ?questionLabel ?answerLabel + WHERE { + ?question wdt:P31 ${template.questionVariable}; # Tipo de entidad: question + ${template.answerVariable} ?answer. # Propiedad: Tiene por answer + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + LIMIT ${limitValue}`; + const results = await wikiCall(query) + const questions = []; + // Generar una pregunta por cada elemento de results + for (let i = 0; i < results.length; i++) { + let questionVar = results[i]['questionLabel'].value; + // La pregunta es la de la plantilla pero reemplazando __x__ por la variable de pregunta + let question = template.question.replace("__x__", questionVar); + let answerVar = results[i]['answerLabel'].value; + let answers = [{ answer: answerVar, correct: true }]; + let copy_results = results.slice(); // copia para no modificar la lista original + copy_results.splice(i, 1); // Eliminar la fila que lleva la pregunta correcta + while (answers.length < 4) { + let randomIndex = Math.floor(Math.random() * copy_results.length); + let distractorAnswerVar = copy_results[randomIndex]['answerLabel'].value; + answers.push({ answer: distractorAnswerVar, correct: false }) + copy_results.splice(randomIndex, 1); // Eliminar la fila elegida para que no vuelva a salir + } + let shuffledAnswers = this.#shuffleArray(answers); // Mezclar la respuestas para que la primera no sea siempre la correcta + questions.push(new Question({ question: question, answers: shuffledAnswers, questionCategory: template.questionCategory })); + } + + return questions; + } + + /** + * Mezcla los elementos del array. + * @param {list} array + * @returns array con los elementos mezclados. + */ + static #shuffleArray(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); // Genera un índice aleatorio entre 0 e i + [array[i], array[j]] = [array[j], array[i]]; // Intercambia los elementos en las posiciones i y j + } + return array; + } +} + +module.exports = WikiQuery \ No newline at end of file From 30eaca8ea660e3bece317537752896318089daa8 Mon Sep 17 00:00:00 2001 From: Santiago21112001 Date: Thu, 21 Mar 2024 11:25:30 +0100 Subject: [PATCH 03/37] Correcciones --- .github/workflows/release.yml | 1 + questionservice/package.json | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bc51ac9..8a1aef8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,6 +18,7 @@ jobs: - run: npm --prefix webapp ci - run: npm --prefix users/authservice test -- --coverage - run: npm --prefix users/userservice test -- --coverage + - run: npm --prefix questionservice test -- --coverage - run: npm --prefix gatewayservice test -- --coverage - run: npm --prefix webapp test -- --coverage - name: Analyze with SonarCloud diff --git a/questionservice/package.json b/questionservice/package.json index 9efb861..a4b10fe 100644 --- a/questionservice/package.json +++ b/questionservice/package.json @@ -9,14 +9,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/arquisoft/wiq_04d4d.git" + "url": "git+https://github.com/arquisoft/wiq_es04d.git" }, "author": "", "license": "ISC", "bugs": { - "url": "https://github.com/arquisoft/wiq_04d4d/issues" + "url": "https://github.com/arquisoft/wiq_es04d/issues" }, - "homepage": "https://github.com/arquisoft/wiq_04d4d#readme", + "homepage": "https://github.com/arquisoft/wiq_es04d#readme", "dependencies": { "bcrypt": "^5.1.1", "body-parser": "^1.20.2", From d36e14e83010cd7018fa0045a592d567e71d0a4f Mon Sep 17 00:00:00 2001 From: Santiago21112001 <79706368+Santiago21112001@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:30:03 +0100 Subject: [PATCH 04/37] Update sonar-project.properties --- sonar-project.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index 8ce93a6..8c115b0 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,17 +1,17 @@ -sonar.projectKey=Arquisoft_wiq_es6b +sonar.projectKey=Arquisoft_wiq_es04d sonar.organization=arquisoft # This is the name and version displayed in the SonarCloud UI. -sonar.projectName=wiq_es6b +sonar.projectName=wiq_es04d sonar.projectVersion=1.0 # Encoding of the source code. Default is default system encoding sonar.host.url=https://sonarcloud.io sonar.language=js -sonar.projectName=wiq_es6b +sonar.projectName=wiq_es04d sonar.coverage.exclusions=**/*.test.js -sonar.sources=webapp/src/components,users/authservice,users/userservice,gatewayservice +sonar.sources=webapp/src/components,users/authservice,users/userservice,gatewayservice,questionservice sonar.sourceEncoding=UTF-8 sonar.exclusions=node_modules/** sonar.javascript.lcov.reportPaths=**/coverage/lcov.info From 2f4ed955c8dc2775a067aa4e17e0be9b83bbaf53 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 13:18:12 +0100 Subject: [PATCH 05/37] =?UTF-8?q?a=C3=B1adidos=20esqueletos=20historial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/historyservice/history-model.js | 20 ++++++++++++++++++++ users/historyservice/history-service.js | 0 2 files changed, 20 insertions(+) create mode 100644 users/historyservice/history-model.js create mode 100644 users/historyservice/history-service.js diff --git a/users/historyservice/history-model.js b/users/historyservice/history-model.js new file mode 100644 index 0000000..6a1edae --- /dev/null +++ b/users/historyservice/history-model.js @@ -0,0 +1,20 @@ +const mongoose = require('mongoose'); + +const historySchema = new mongoose.Schema({ + username: { + type: String, + required: true, + }, + password: { + type: String, + required: true, + }, + createdAt: { + type: Date, + default: Date.now, + }, +}); + +const History = mongoose.model('History', historySchema); + +module.exports = History \ No newline at end of file diff --git a/users/historyservice/history-service.js b/users/historyservice/history-service.js new file mode 100644 index 0000000..e69de29 From d5154b4d812435e88ae9106939e337455c2610e8 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 13:30:12 +0100 Subject: [PATCH 06/37] =?UTF-8?q?a=C3=B1adido=20modelo=20del=20historial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/historyservice/history-model.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/users/historyservice/history-model.js b/users/historyservice/history-model.js index 6a1edae..8480908 100644 --- a/users/historyservice/history-model.js +++ b/users/historyservice/history-model.js @@ -5,14 +5,22 @@ const historySchema = new mongoose.Schema({ type: String, required: true, }, - password: { + NumJugadas: { type: String, required: true, }, - createdAt: { - type: Date, - default: Date.now, + NumPreguntasJugadas: { + type: String, + required: true, }, + NumAcertadas: { + type: String, + required: true, + }, + NumFalladas: { + type: String, + required: true, + } }); const History = mongoose.model('History', historySchema); From 31ba82f7f197df95ede28a05e101f7ed74e96146 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 13:47:36 +0100 Subject: [PATCH 07/37] actualizacion del modelo --- users/historyservice/history-model.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/users/historyservice/history-model.js b/users/historyservice/history-model.js index 8480908..4f9beff 100644 --- a/users/historyservice/history-model.js +++ b/users/historyservice/history-model.js @@ -6,19 +6,19 @@ const historySchema = new mongoose.Schema({ required: true, }, NumJugadas: { - type: String, + type: Number, required: true, }, NumPreguntasJugadas: { - type: String, + type: Number, required: true, }, NumAcertadas: { - type: String, + type: Number, required: true, }, NumFalladas: { - type: String, + type: Number, required: true, } }); From dcb44ed47e7e9612a45a7e2c3e4cca758cba70db Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 13:59:13 +0100 Subject: [PATCH 08/37] =?UTF-8?q?a=C3=B1adida=20la=20funcionalidad=20a=20d?= =?UTF-8?q?e=20guardar=20en=20historial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/src/components/pages/Jugar.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index 4246ca4..4caa78f 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -2,6 +2,7 @@ import React, { useContext, useState, useEffect } from "react"; import { useNavigate } from 'react-router-dom'; import { AuthContext } from '../../AuthContext'; import "./Jugar.css"; +import axios from 'axios'; // Configuración inicial y datos const INITIAL_TIMER = 20; @@ -108,7 +109,20 @@ function Jugar() { setCurrentQuestionIndex(currentQuestionIndex + 1); setSelectedAnswerIndex(null); } else { + //Finaliza el quiz setQuizFinished(true); + + //Guardamos en el historial los datos de la partida + axios.post('/savehistory',{ + NumPreguntasJugadas: questions.length, // Número total de preguntas jugadas (la longitud de la matriz de preguntas) + NumAcertadas: correctAnswers, // Número de preguntas respondidas correctamente + }) + .then(response => { + console.log(response.data); // Mensaje de confirmación del servidor + }) + .catch(error => { + console.error('Error al guardar el historial:', error); + }); } }; const videoSource = quizFinished ? "/videos/celebracion.mp4" : "/videos/question.mp4"; From 4042e0ae15ecdd961535716f017e14a04aae9660 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 15:04:57 +0100 Subject: [PATCH 09/37] =?UTF-8?q?a=C3=B1adido=20historial=20al=20gateway?= =?UTF-8?q?=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 14 + gatewayservice/gateway-service.js | 10 + users/historyservice/.dockerignore | 2 + users/historyservice/Dockerfile | 20 + users/historyservice/history-service.js | 69 + users/historyservice/package-lock.json | 5487 +++++++++++++++++++++++ users/historyservice/package.json | 32 + webapp/src/components/pages/Jugar.js | 4 +- 8 files changed, 5637 insertions(+), 1 deletion(-) create mode 100644 users/historyservice/.dockerignore create mode 100644 users/historyservice/Dockerfile create mode 100644 users/historyservice/package-lock.json create mode 100644 users/historyservice/package.json diff --git a/docker-compose.yml b/docker-compose.yml index 4389bdf..a7bdd2d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -52,6 +52,20 @@ services: - mynetwork environment: MONGODB_URI: mongodb://mongodb:27017/userdb + + historyservice: + container_name: historyservice-${teamname:-wiq_es04d} + image: ghcr.io/arquisoft/wiq_es04d/historyservice:latest + profiles: ["dev", "prod"] + build: ./users/historyservice + depends_on: + - mongodb + ports: + - "8004:8004" + networks: + - mynetwork + environment: + MONGODB_URI: mongodb://mongodb:27017/userdb gatewayservice: container_name: gatewayservice-${teamname:-defaultASW} diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index 444b71d..e63af49 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -13,6 +13,7 @@ const port = 8000; const authServiceUrl = process.env.AUTH_SERVICE_URL || 'http://localhost:8002'; const userServiceUrl = process.env.USER_SERVICE_URL || 'http://localhost:8001'; +const historyServiceUrl = process.env.HISTORY_SERVICE_URL || 'http://localhost:8004'; app.use(cors()); app.use(express.json()); @@ -46,6 +47,15 @@ app.post('/adduser', async (req, res) => { } }); +app.post('/savehistory', async(req, res) => { + try{ + const historyResponse = await axios.post(historyServiceUrl+'/savehistory', req.body); + res.json(historyResponse.data); + } catch(error){ + res.status(error.response.status).json({ error: error.response.data.error }); + } +}) + // Read the OpenAPI YAML file synchronously openapiPath='./openapi.yaml' if (fs.existsSync(openapiPath)) { diff --git a/users/historyservice/.dockerignore b/users/historyservice/.dockerignore new file mode 100644 index 0000000..3091757 --- /dev/null +++ b/users/historyservice/.dockerignore @@ -0,0 +1,2 @@ +node_modules +coverage \ No newline at end of file diff --git a/users/historyservice/Dockerfile b/users/historyservice/Dockerfile new file mode 100644 index 0000000..514fe8d --- /dev/null +++ b/users/historyservice/Dockerfile @@ -0,0 +1,20 @@ +# Use an official Node.js runtime as a parent image +FROM node:20 + +# Set the working directory in the container +WORKDIR /usr/src/historyservice + +# Copy package.json and package-lock.json to the working directory +COPY package*.json ./ + +# Install app dependencies +RUN npm install + +# Copy the app source code to the working directory +COPY . . + +# Expose the port the app runs on +EXPOSE 8004 + +# Define the command to run your app +CMD ["node", "history-service.js"] diff --git a/users/historyservice/history-service.js b/users/historyservice/history-service.js index e69de29..facc652 100644 --- a/users/historyservice/history-service.js +++ b/users/historyservice/history-service.js @@ -0,0 +1,69 @@ +// history-service.js +const express = require('express'); +const mongoose = require('mongoose'); +const bodyParser = require('body-parser'); +const History = require('./history-model') + +const app = express(); +const port = 8004; + +// Middleware to parse JSON in request body +app.use(bodyParser.json()); + +// Connect to MongoDB +const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/userdb'; +mongoose.connect(mongoUri); + + +app.post('/savehistory', async (req, res) => { + try { + + let username = "prueba"; //necesitamos el username + + // Extraer los datos de la solicitud + const { NumPreguntasJugadas, NumAcertadas } = req.body; + + // Buscar si ya existe una entrada en la base de datos con el mismo nombre de usuario + let historyEntry = await History.findOne({ username }); + + if (historyEntry) { + // Si la entrada ya existe, actualizamos los datos + historyEntry.NumJugadas = historyEntry.NumJugadas + 1; + historyEntry.NumPreguntasJugadas = historyEntry.NumPreguntasJugadas + NumPreguntasJugadas; + historyEntry.NumAcertadas = historyEntry.NumAcertadas + NumAcertadas; + historyEntry.NumFalladas = historyEntry.NumFalladas + NumPreguntasJugadas - NumAcertadas; + } else { + // Si la entrada no existe, creamos una nueva + historyEntry = new History({ + username: username, + NumJugadas: 1, + NumPreguntasJugadas: NumPreguntasJugadas, + NumAcertadas: NumAcertadas, + NumFalladas: NumPreguntasJugadas - NumAcertadas + }) + } + + // Guardar la entrada en la base de datos + await historyEntry.save(); + + + // Respuesta exitosa + res.status(200).json({ message: 'Datos de historial guardados exitosamente' }); + } catch (error) { + // Manejo de errores + console.error('Error al guardar el historial:', error); + res.status(500).json({ error: 'Error al guardar el historial' }); + } +}); + +const server = app.listen(port, () => { + console.log(`User Service listening at http://localhost:${port}`); +}); + +// Listen for the 'close' event on the Express.js server +server.on('close', () => { + // Close the Mongoose connection + mongoose.connection.close(); + }); + +module.exports = server \ No newline at end of file diff --git a/users/historyservice/package-lock.json b/users/historyservice/package-lock.json new file mode 100644 index 0000000..6b220be --- /dev/null +++ b/users/historyservice/package-lock.json @@ -0,0 +1,5487 @@ +{ + "name": "historyservice", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "historyservice", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.1.1", + "body-parser": "^1.20.2", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.0.4" + }, + "devDependencies": { + "jest": "^29.7.0", + "mongodb-memory-server": "^9.1.5", + "supertest": "^6.3.4" + } + }, + "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.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "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/core/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/@babel/core/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/@babel/core/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/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@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.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@babel/helper-compilation-targets/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/@babel/helper-compilation-targets/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/@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.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "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.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "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.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "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/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "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-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "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.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@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.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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/@babel/traverse/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/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/@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==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "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.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "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.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "20.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.7.tgz", + "integrity": "sha512-fRbIKb8C/Y2lXxB5eVMj4IU7xpdox0Lh8bUPEdtLysaylsml1hOOx1+STloRs/B9nf7C6kPRmmg/V7aQW7usNg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "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/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "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-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "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/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/async-mutex": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", + "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/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/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==" + }, + "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/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==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "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.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", + "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "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==", + "dev": true + }, + "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/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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001576", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", + "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "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": "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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/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/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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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/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/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/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/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.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/electron-to-chromium": { + "version": "1.4.623", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.623.tgz", + "integrity": "sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "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-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/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "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-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "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==", + "dev": true, + "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/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "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==", + "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==", + "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/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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 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/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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/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/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "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/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "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/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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==", + "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==", + "devOptional": true + }, + "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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "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-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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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/istanbul-lib-source-maps/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/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=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==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "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/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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==" + }, + "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/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "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/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.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/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=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/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": "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/mongodb": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", + "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.2.0", + "mongodb-connection-string-url": "^2.6.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "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/mongodb-memory-server": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-9.1.5.tgz", + "integrity": "sha512-m7yewXoyctu2lwISq/sazwOV/LBkPmAm4ulwoP6J4zzv78ESlAIuQEHoL2+45CTlwxiRM5hfVBQe9HIYEFaBWw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "mongodb-memory-server-core": "9.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/mongodb-memory-server-core": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-9.1.5.tgz", + "integrity": "sha512-mevjdWrxym+MzMoNsFfCtrXwK3ndb0xHKj+fHT1xoT4l+uflEqvLHt+aRdJrTW5GTGYeVlYHQpQ8hLKMeEL6cg==", + "dev": true, + "dependencies": { + "async-mutex": "^0.4.0", + "camelcase": "^6.3.0", + "debug": "^4.3.4", + "find-cache-dir": "^3.3.2", + "follow-redirects": "^1.15.3", + "https-proxy-agent": "^7.0.2", + "mongodb": "^5.9.1", + "new-find-package-json": "^2.0.0", + "semver": "^7.5.4", + "tar-stream": "^3.0.0", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "dev": true, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mongodb-memory-server-core/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/mongodb-memory-server-core/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/mongodb": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", + "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "dev": true, + "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-memory-server-core/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/mongoose": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.4.tgz", + "integrity": "sha512-wN9qvdevX3+922VnLT7CpaZRT3jmVCBOK2QMHMGeScQxDRnFMPpkuI9StEPpZo/3x8t+kbzH7F8RMPsyNwyM4w==", + "dependencies": { + "bson": "^6.2.0", + "kareem": "2.5.1", + "mongodb": "6.2.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=16.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/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/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/new-find-package-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-2.0.0.tgz", + "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/new-find-package-json/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/new-find-package-json/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/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/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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==", + "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/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/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "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/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "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/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/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==", + "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": true, + "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==", + "devOptional": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.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==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/streamx": { + "version": "2.15.6", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", + "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/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/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/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/supertest": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.1.2" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "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/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/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-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "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/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==", + "dev": true, + "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/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/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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/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/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.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/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "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/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/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/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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/users/historyservice/package.json b/users/historyservice/package.json new file mode 100644 index 0000000..8fd72f1 --- /dev/null +++ b/users/historyservice/package.json @@ -0,0 +1,32 @@ +{ + "name": "historyservice", + "version": "1.0.0", + "description": " history service, in charge of game history of the users", + "main": "service.js", + "scripts": { + "start": "node history-service.js", + "test": "jest" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/arquisoft/wiq_es04d.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/arquisoft/wiq_es04d/issues" + }, + "homepage": "https://github.com/arquisoft/wiq_es04d#readme", + "dependencies": { + "bcrypt": "^5.1.1", + "body-parser": "^1.20.2", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.0.4" + }, + "devDependencies": { + "jest": "^29.7.0", + "mongodb-memory-server": "^9.1.5", + "supertest": "^6.3.4" + } +} \ No newline at end of file diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index 4caa78f..f0ac237 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -95,6 +95,8 @@ function Jugar() { setSelectedAnswerIndex(index); }; + const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; + const handleNextQuestion = (timeExpired = false) => { setTimer(INITIAL_TIMER); if (selectedAnswerIndex !== null || timeExpired) { @@ -113,7 +115,7 @@ function Jugar() { setQuizFinished(true); //Guardamos en el historial los datos de la partida - axios.post('/savehistory',{ + axios.post(`${apiEndpoint}/savehistory`,{ NumPreguntasJugadas: questions.length, // Número total de preguntas jugadas (la longitud de la matriz de preguntas) NumAcertadas: correctAnswers, // Número de preguntas respondidas correctamente }) From a028af21ffb1f3a4965c1073d3a05bec7d7c5909 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 15:20:35 +0100 Subject: [PATCH 10/37] cambios menores --- users/historyservice/history-service.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/users/historyservice/history-service.js b/users/historyservice/history-service.js index facc652..2e58361 100644 --- a/users/historyservice/history-service.js +++ b/users/historyservice/history-service.js @@ -17,7 +17,6 @@ mongoose.connect(mongoUri); app.post('/savehistory', async (req, res) => { try { - let username = "prueba"; //necesitamos el username // Extraer los datos de la solicitud @@ -25,7 +24,7 @@ app.post('/savehistory', async (req, res) => { // Buscar si ya existe una entrada en la base de datos con el mismo nombre de usuario let historyEntry = await History.findOne({ username }); - + if (historyEntry) { // Si la entrada ya existe, actualizamos los datos historyEntry.NumJugadas = historyEntry.NumJugadas + 1; @@ -46,13 +45,11 @@ app.post('/savehistory', async (req, res) => { // Guardar la entrada en la base de datos await historyEntry.save(); - // Respuesta exitosa - res.status(200).json({ message: 'Datos de historial guardados exitosamente' }); + res.json(historyEntry); } catch (error) { // Manejo de errores - console.error('Error al guardar el historial:', error); - res.status(500).json({ error: 'Error al guardar el historial' }); + res.status(400).json({ error: 'Error al guardar el historial' }); } }); From 9bcdbfc111a0e994d0a1036bb530f67359c28c82 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 16:03:37 +0100 Subject: [PATCH 11/37] cambios menores sigue sin funcionar --- gatewayservice/gateway-service.js | 6 +++--- users/historyservice/history-service.js | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index e63af49..c8dd0c8 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -47,14 +47,14 @@ app.post('/adduser', async (req, res) => { } }); -app.post('/savehistory', async(req, res) => { +app.post('/savehistory', async (req, res) => { try{ const historyResponse = await axios.post(historyServiceUrl+'/savehistory', req.body); res.json(historyResponse.data); } catch(error){ - res.status(error.response.status).json({ error: error.response.data.error }); + //res.status(error.response.status).json({ error: error.response.data.error }); } -}) +}); // Read the OpenAPI YAML file synchronously openapiPath='./openapi.yaml' diff --git a/users/historyservice/history-service.js b/users/historyservice/history-service.js index 2e58361..4fca9f9 100644 --- a/users/historyservice/history-service.js +++ b/users/historyservice/history-service.js @@ -19,13 +19,13 @@ app.post('/savehistory', async (req, res) => { try { let username = "prueba"; //necesitamos el username - // Extraer los datos de la solicitud + //Extraer los datos de la solicitud const { NumPreguntasJugadas, NumAcertadas } = req.body; // Buscar si ya existe una entrada en la base de datos con el mismo nombre de usuario - let historyEntry = await History.findOne({ username }); + let historyEntry = await History.findOne({ username: "prueba" }); - if (historyEntry) { + if (historyEntry !== null) { // Si la entrada ya existe, actualizamos los datos historyEntry.NumJugadas = historyEntry.NumJugadas + 1; historyEntry.NumPreguntasJugadas = historyEntry.NumPreguntasJugadas + NumPreguntasJugadas; @@ -54,7 +54,7 @@ app.post('/savehistory', async (req, res) => { }); const server = app.listen(port, () => { - console.log(`User Service listening at http://localhost:${port}`); + console.log(`History Service listening at http://localhost:${port}`); }); // Listen for the 'close' event on the Express.js server From bc1bf15f5801bdac303d161a95e87ece758e10f2 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 16:03:56 +0100 Subject: [PATCH 12/37] quitados comentarios --- gatewayservice/gateway-service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index c8dd0c8..9a4f490 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -52,7 +52,7 @@ app.post('/savehistory', async (req, res) => { const historyResponse = await axios.post(historyServiceUrl+'/savehistory', req.body); res.json(historyResponse.data); } catch(error){ - //res.status(error.response.status).json({ error: error.response.data.error }); + res.status(error.response.status).json({ error: error.response.data.error }); } }); From 0a5d8324e1df5dee38956a545040e6140cca9d5d Mon Sep 17 00:00:00 2001 From: Zohaib Akhtar Kausar Date: Thu, 21 Mar 2024 16:41:25 +0100 Subject: [PATCH 13/37] Conexion entre gateway y history --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index a7bdd2d..671f497 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -77,6 +77,7 @@ services: - userservice - authservice - questionservice + - historyservice ports: - "8000:8000" networks: @@ -85,6 +86,7 @@ services: AUTH_SERVICE_URL: http://authservice:8002 USER_SERVICE_URL: http://userservice:8001 GENERATE_SERVICE_URL: http://questionservice:8003 + HISTORY_SERVICE_URL: http://historyservice:8004 webapp: container_name: webapp-${teamname:-defaultASW} From 74e0698aec323843d96cca2ce05421e2aa395fc6 Mon Sep 17 00:00:00 2001 From: Zohaib Akhtar Kausar Date: Thu, 21 Mar 2024 16:41:46 +0100 Subject: [PATCH 14/37] Guardar historial del usuario en session --- users/historyservice/history-service.js | 4 ++-- webapp/src/components/pages/Jugar.js | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/users/historyservice/history-service.js b/users/historyservice/history-service.js index 4fca9f9..a0bbef8 100644 --- a/users/historyservice/history-service.js +++ b/users/historyservice/history-service.js @@ -17,13 +17,13 @@ mongoose.connect(mongoUri); app.post('/savehistory', async (req, res) => { try { - let username = "prueba"; //necesitamos el username + let username = req.body.username;//necesitamos el username //Extraer los datos de la solicitud const { NumPreguntasJugadas, NumAcertadas } = req.body; // Buscar si ya existe una entrada en la base de datos con el mismo nombre de usuario - let historyEntry = await History.findOne({ username: "prueba" }); + let historyEntry = await History.findOne({ username: username }); if (historyEntry !== null) { // Si la entrada ya existe, actualizamos los datos diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index f0ac237..10d284a 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -68,7 +68,7 @@ function Jugar() { const [quizFinished, setQuizFinished] = useState(false); const [selectedAnswerIndex, setSelectedAnswerIndex] = useState(null); const navigate = useNavigate(); - const { isLoggedIn } = useContext(AuthContext); + const { isLoggedIn, username } = useContext(AuthContext); useEffect(() => { if (!isLoggedIn) { @@ -116,6 +116,7 @@ function Jugar() { //Guardamos en el historial los datos de la partida axios.post(`${apiEndpoint}/savehistory`,{ + username: username, NumPreguntasJugadas: questions.length, // Número total de preguntas jugadas (la longitud de la matriz de preguntas) NumAcertadas: correctAnswers, // Número de preguntas respondidas correctamente }) From 5c367f27ad58e476198ffe73215bf37823b20632 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 16:57:33 +0100 Subject: [PATCH 15/37] copiados archivos documentacion sin actualizar --- docs/images/06_sequence-diagram.plantuml | 21 ++ docs/images/08_diagrama_modelo_dominio.png | Bin 0 -> 20869 bytes docs/images/10_Arbol_de_calidad.jpg | Bin 0 -> 23597 bytes docs/images/Building Block View.jpg | Bin 0 -> 6355 bytes ...casos de uso para el juego de palabras.jpg | Bin 0 -> 20559 bytes .../Diagrama de clases juego de preguntas.jpg | Bin 0 -> 14101 bytes .../Diagrama de contexto de negocio.jpg | Bin 0 -> 8683 bytes .../Diagrama de contexto t\303\251cnico.jpg" | Bin 0 -> 7754 bytes .../images/Diagrama de secuencia plantuml.png | Bin 0 -> 29046 bytes ...igrama de secuencia Juego de preguntas.jpg | Bin 0 -> 41232 bytes docs/images/Whitebox Overall System.jpg | Bin 0 -> 11133 bytes docs/images/bdLevel2.png | Bin 0 -> 38846 bytes .../diagrama_contexto_tecnico.drawio.png | Bin 0 -> 18628 bytes docs/images/loginLevel2.png | Bin 0 -> 45483 bytes docs/images/uiLevel2.png | Bin 0 -> 47550 bytes docs/images/whiteBoxGeneral.png | Bin 0 -> 24676 bytes docs/images/whiteLevel1.png | Bin 0 -> 28069 bytes docs/index.adoc | 12 +- docs/src/01_introduction_and_goals.adoc | 101 +++------ docs/src/02_architecture_constraints.adoc | 48 ++--- docs/src/03_system_scope_and_context.adoc | 81 ++------ docs/src/04_solution_strategy.adoc | 75 ++++--- docs/src/05_building_block_view.adoc | 192 ++++-------------- docs/src/06_runtime_view.adoc | 70 ++----- docs/src/07_deployment_view.adoc | 89 ++------ docs/src/08_concepts.adoc | 73 +++---- docs/src/09_architecture_decisions.adoc | 34 +--- docs/src/10_quality_requirements.adoc | 77 +++---- docs/src/11_technical_risks.adoc | 49 ++--- docs/src/12_glossary.adoc | 55 ++--- 30 files changed, 326 insertions(+), 651 deletions(-) create mode 100644 docs/images/06_sequence-diagram.plantuml create mode 100644 docs/images/08_diagrama_modelo_dominio.png create mode 100644 docs/images/10_Arbol_de_calidad.jpg create mode 100644 docs/images/Building Block View.jpg create mode 100644 docs/images/Diagrama de casos de uso para el juego de palabras.jpg create mode 100644 docs/images/Diagrama de clases juego de preguntas.jpg create mode 100644 docs/images/Diagrama de contexto de negocio.jpg create mode 100644 "docs/images/Diagrama de contexto t\303\251cnico.jpg" create mode 100644 docs/images/Diagrama de secuencia plantuml.png create mode 100644 docs/images/Digrama de secuencia Juego de preguntas.jpg create mode 100644 docs/images/Whitebox Overall System.jpg create mode 100644 docs/images/bdLevel2.png create mode 100644 docs/images/diagrama_contexto_tecnico.drawio.png create mode 100644 docs/images/loginLevel2.png create mode 100644 docs/images/uiLevel2.png create mode 100644 docs/images/whiteBoxGeneral.png create mode 100644 docs/images/whiteLevel1.png diff --git a/docs/images/06_sequence-diagram.plantuml b/docs/images/06_sequence-diagram.plantuml new file mode 100644 index 0000000..bb57556 --- /dev/null +++ b/docs/images/06_sequence-diagram.plantuml @@ -0,0 +1,21 @@ +@startuml Diagrama de secuencia plantuml +actor usuario +actor system +actor juego +database bbdd as "bbdd" +usuario -> system: inicio sesión +system --> usuario: pedir nombre/contraseña +usuario -> system: dar nombre/contraseña +system -> bbdd: verificar usuario +bbdd --> system: verificación correcta +system --> usuario: inicio sesión correcto +usuario -> system: acceder al juego +system -> juego: iniciar juego +juego --> system: generar pregunta/respuestas +system --> usuario: mostrar pregunta/respuestas +usuario -> system: responder +system -> juego: verificar respuesta +juego --> system: respuesta correcta +system --> usuario: correcta +system -> juego: generar siguiente pregunta/respuestas +@enduml \ No newline at end of file diff --git a/docs/images/08_diagrama_modelo_dominio.png b/docs/images/08_diagrama_modelo_dominio.png new file mode 100644 index 0000000000000000000000000000000000000000..54fe0a4363ac79c5edfc40de514e269bc80532d4 GIT binary patch literal 20869 zcmeHv2|U!>-#=1GQ<2I@M6z_PV{FMzG}$U;Uz%ZzVa8a-o-H+5LQ!N_CR&i}DND`J zVyCPjX%mvNMfjg#l-unt&+oa<|GCfad0zKkGw1U?=X=iiocHJbSgr5p(EL_xTgptLm7#YMsni^RAg@$M4NXd)1S=Xio0)*g$tTk0b%B`qT^B`pq9 zI0};%gsV%-f7?t!EFdV-&ZHT6W8vzd_+AwMGV%k4IXoR#!x?xwo!tl@$S|2I7@zjBH$7*3E8CwL?0LQlGG0EiM0hw0IJz9 zD5VZwO#2tENmnaqVCjm~ls%&1E(0fMA;op=e9h4YL=T^(w>cxhCKeCm5YVMK?8mn) zzZ37R2F&S5eWnw5$p16p)JAL8Es2HYx*0JZf>*#UR*w1WKY1+_e>YKfNlM% z2TfpPi^Tm_YJ#;RIxO{7kd|Ls3$6D7G#2BqJTpv=zF|Caxifty?hZ(Rx25rmqLrtz zq{n4#x)BKAeJc)a<>Tc}cyCQKj;8EoJ(?hVOmKQmaykbOySpNfY3Lp`Fczmz4nX!d zz3`jf+`gIC-#)RglfCu81`>zG(2T|wEFSF!1i+4nSa96x^an(O3y|76U~zVO zNFRa+?Off7NL#1nmWBht4eJYDi^PFPFwhx1b|cb}D=h~E-+LI*MuKiMW^qHi19Trk z()C6gxg^p*hfo-hRr3(5jsE8L+VL>BsjYh-H>1$ zFcLH{C@(b4sD1+fpX!5-xW5Dbbht0W<|uh{Qm?cS)gv3#{cI*NoHx`E16J<}a7&<|xgDYk^qxn}kkD@b8jkN}`E=q#qm- zg~lBsxMPV+0k+!`ef>a7|5)acSNLmip?CXlA)aG4`Y=6$f{CZ8w>eQ8Bpq&tvEp>J ztN;hv4#eX0=nas(0|7&DM&kB=mx8lf84G>yqeoZ-0SyC=Xd=;v9-bjRhy);7fi@5a zy7`#WOdNO^xW;1B3^ZvY7aLl%c!p;GOD!6`FSYE{Y3T)Mf_w^3a0Y1w=whc0l1%#W zrDLG&0SG|juSU-Fe(nShH;}$94*e<9!01d3!cPoHkpH0LVzTnbk;8IavLYyvmU2Vm zkVLHKuh;+20Sq0%zoHj9P5%HQJ(@{_16pzL%cSzVnZP$%S&Y(uH$0*7z|u+oCVG&T zqGzS_!Jr#G&{*k3e%}`Ug%hI(-%=8E5YeNNrNsR|aG-x>>hF*_L<`uy$JoocJAHCc zoB37bOt80iUoPnUj|rH68x^<$p!KRf;WZD2@C zG=XbY2U*;24C;SL61wcqf8$5~3hHP@^l#;aZ$+17)chIfm;3z;^E7+-^Wx!uqC)Xg z2T1o{D||a}!!8~mt4C@Q+}vn|9e@_#a~3@hEj?Pn!2ceA`3(-FrB=obe-IP?>wx)b zuK5#|{O19NzQ~^e29%N(d4*O@q6OkV1nvkTLuqT3X|O$NB#>dHl)w!|5*SzlAV;;-=D_pIe7;hC)LufsFga=7*@2l{Ump8eGK z(r++VSdt4p*Kt?31sFiu(aipv^92_paBtv^K^pw+>$d?1Jup9X|2h3GXGXunxl4J` zKlg^=U*hV2wJfuo($H_Deud4Sn2ZcP+WzNowe)YZ>EF2J|Luig*s?$S8%UQ9nB~0k zPXY4>6#HME4gA!(FNd2eDCswV0mawliY&op@m}#yuEu{|JN|X;c4g%mjYAQ_4J^b%YxpW49=ak|< zObP#ClmCqR=;Fol@B9#ne(9|9{U={5kA3m!@{i1x9?%ESe($&Rlal(UGgS->d<+OJ z^`qX_BPll5EZZ+;1tw-0TW{vq zD!pN(Iq*5elqdLn8GFb&^%gdCO+X@lTLi~B8D?7u$tO?h@LGA_0|J*l6%W+KzRCS$ zRub>|zVZ4EqpsQHxvd>#CGUsJ+h^J;X1&_F?%t5Q_wm8{z=di~8zo_0wnu6&zPwFa z7$F3FP6|vxI*`PI7={cP)vK606${l{1|CN53|Ylw#)9iOZgePPVeDEAczh8lS&Owe z!$!$R9Z8W5MSAcX@@PYDrZIhC4+gd*pmM+uB5)445bfBi*jMJVr~HgW&)W*x$eHT(Gt4qfYonamq@&?8H#5QBlO#`w$}gRr8Xd|h>22vI zROZwt$&1=w63Wzx=6!ZmH(nc`Yk5cdJ*E3n)%_p~j?LI-8P%jf;mJyxYI>S=-VUpQVryM(Nf zb3N-f^#MEDTkiY0UcPXgZvQO7M}2 zd#AgQPVN1aGae&dvdW+9;6p=?qImXc%fFk<%O8rj3D|2MAz^(_BoJR4CmvX6C36ZP zdu!9NaAX~Wt-gwVM8MRm&Xf@S+MB&KLUHKWIPorl@XPBQ?%j27_8%!~Z`}}hJ^9R)C&P81`%z&E9`Mi2`{&2Br zDmia?!5vv||-7N9{9J(ICYPR<7(E$NJ#?M=HVc7#!XYO}v&%ZDep+4y{Nw68KstcUxou+oT( zv9GVw)Q6sosdb4jzU(oQjCJm-u|Kz>7sWYlyk;B-QQqq?)l+!u%`8f8O*==U-H49@$MM)HM-I?T2jGw zd~Q&eOu}d7XmamXj3EKaL~)<9(6$}((kC!5F@cSDviauk zJc2v#4uVSW%;z``tK&VHy@qWedz$MWKag$xwQL8>ZsP@wpz6E}2VUI{nSR^faLsTt zAKXscPPhtnNtxMf1K+&a7+fKN-#vW`lNjl$)~;wCs_G^$P{y{~xJ4U`%nMRNyN50q zt!Z$vU1uj6>wJM|-GWAxuoygJHig{W7&zMd_Jm~%55goK(rtj?6dbuo^m|-^`dl9) zk*)0N*bq?9`x&1`p5^H($hrOc(b)j}^PHFlPlZV(D}K`Frk7n8+0-B=CyV4$CdKEi zLN5!h%1UDCEcqxQnk^WC><%+6gqB?iMB7|??p-Kq=jJKwTHrGuL(Zsgj2rX+WzYlB zEjU8hvT&9>RG;#YA_UjFRe(SaRCJG{14Y&hav|Ci=kG;Jj9PcCIXhG)+*DGX=f~tR zrLbqdV*Z5K;KLX_8KsE)qPM5W1l<{rg2`cM0k3k5T|!Kb=v~21#ff?$BiQ>mWuF?9 zKQD`a=jX|3b?B@h!X)u6-l`w~@BiuT5pI8fy>_wBBkAM?i9yMb4JsU{G?l1wdkx&s zHRZ2gO0DNb5nh6G`}4lk+UHEjK5uulwZ;2e$)?s+!6}GM z7%9}Wjc=&?;5C(m4d>=~NAiL`y^{yP?i;gco57+ShN@=kUphpLh$5}R1hqMtEmTj8 zl}tQpgIGuoBULSS66CHZ>O%0Y#Yus8ky8`(v!A80=H}zK=jHYs>nff62$7n1#;Y8R zfpESioC?qj?O7N^t8;KROOpY1LNQsF2b~D5nGpVP+DwSO{glXs3f|5cyO-$orK4%pD)wQ>uF6r2 zzG&>s$<%P9-Kb#8)PtFAtI?JV0W}ZWk2P-AztB42)|HA>x{2Jiz5NY#=*H~DaAeZn zi{bsdbE_lz$~7ltOlu# ztZ&W387Dlgy>uN~lQd@9;+~Wvz5!I$02-CC?n@h z2w~^`<^rdh$N}3qCHA7DkPIG`RP;TGYu4K$or=0)4Yy1^oeR*5t0~{ADH>={3+WEO zyjHpQOGiq>ZuU&E8JW1OtbJ=x(?p+mIrHv1sW=UBcyi%2?S&)AOF|?pS8*gXlWUN? zT3KahZJe`H-I^>kX~3W_Yn{$`vu@3xqSKsSEo5r<I-h?I94R@Z^i`o)zP3zcF*yuDL}&NR|JGA+<$*X=Y@kIyP2zWZ$Y{Ydlo zatg4Yr1T+kO}5Y1dt5&2M>-72u)%)uIoUvY z&m+B~p&JFFB79*t_1zZR5x*Z?g2t^&ID-{UpM31u)4^h^BT$CU>U_rBI&@n7qQa>=%|F;gi|~90jjA z<*sKOw86JvQc25rqUMti?nRgMIy=8s{{)4+U)C~GrPfZk)mVZ+YOSGyw~4`X-2!Hq znE0-(T_Mno``#^>wJe+)Z{&Esd!7;%Xmd{!GQ0UYWA|f}!iyKV{)Zk0I!)%zXMWk8 zaCA%9Lf$|h=O`PcLd&trGatH9p)}HIK|6-0$vcN#Yt~zqbN@@#uhUcaHK}=<4sS1w z6eF$L0or=Z5r zxlfkbklF}@$F}oaZ5(dW6kk-2ydgWKVm~fuau;b8#PMZJSbBLvPsPc{lj}R-I|Axv z-|(Y4NK`}-9HQa=5{*x_}FCw80zv9Q0zyyJp72<>K^*XZts+Js;=euU^brwd-k^4}1 z!Dfq?x?&?I{{X?kL#+)q1vcfU992Kpw|~jn6#-J2SB2?>vC$h3UONqSX62n8aC#kS zuRJQ;q429_M zGWlCTJ|Eit;hKL$U{ZCZej#ZW34daw9BSak=ieI;Xwt&%^k717m!m}b097jd2&)V$ zVT)#^M9P7~rK79;EFCt@0M%qveyrpNhc> za}wmX=K6@5e-6Lg^E`@gEI=wJt^BBi;!T}xBGe{kmljz>o6R{%81xWNc>jK#+hNM zy2jXj;Rrucsxq&&D4`?eDfyGm7K*|~Khnsy++&ufp}8j=180(t2~DszX0u+{+2r0h zlGpP%Q_sOd0ZfaH1RhQq$2}l>2zAANDA%urv`XW+VaX*|&^zb*=Vr{e z)TUKn6zbcHFXkc=E~mVTHX9}D!OFrb*iFG^AeJ{fMVgz*R@PMAs-mBL#oKfZ z)UdRBtxJdP^VG{d?<{1o&#j-|Lv>_c+1dy<{nA<+KB$6u-kn^GQOIf8+UQADrihR> zB|%!IJ9x>rKW)-BvukuYvfr64p+9c{GM3BC6pCDT_z{MZEqy)B;Or=jH@;p^v7GCs zfojZniamGrrf5^2X9hRAx=V-E!guOnjrwP#_U`Ef^BD%tVCxH6`u%Iqwovoh9vKPc?E8fFsgxk06Hdz(v3DFwqD<>1T-bYP3!^mU%7epM zFgub*O;5SdyvM`JEu-v|BfAdY<`E-pU7My%`SEQ97*nrTwX~Iq@*Xn}ff{ppPC|w@ z`nmQBkg89URYKS(Gbmo=zwccQsmLCfWHaz^)N4oWIZ&o%RUBSnfjwiA)j)RPz){@V z2xRsBw+#9}I>Lq5K*s#Bf`w_4@v)fp{!>@X1ug|XBL%!tSn{KW_TRm$0Lf!*B_G)Q z$&-g~?g>TaoL`8S-ec2$Y-)$deK64}k)zJ5P^MGNe81I_G?q5??0M+?kruD@(yT`B zcYPE^1e(X!dULb5z^O!$;Hm=Rct|O#=y3Wzd{V`AMFTYU_Qtf1dU@`jRQ&UMzAWgb$ldxg8N@O z=|^2epZI+?+_l82Thp1dHwL0VgQYdDOTI8}5;Je!GMG9W^XvpwN;F{28L*=~DMpS5 z88H=iCPz)27E*QCIPLdPU0gj2Ptmp;p|(Y%gi+mc*Y?o<%^w|DfkyaN1*^u7s|wCN zzI1ybjSS2`5R-SaU2_+yeB;gl=?mX!P8PRoH3sKry{CX!7R^m=kNjDzY=0w&CYKr4Q7jBz;2|?Ccwx+T@W4Y zi(!}GTupV^8&F81Ei8#4?PaSvpv#SXEvuQqQJkfHe<48PQ6sNs0qW)g>gK7^f$R%9 zz)71`8l+77f})|G4Cf_iQ`v#Kg(t&K*f7H`t3}L!`phtc3aIU9m4WVj=gu>L?;xaG z6-s1WS_t?KBEhw6gG@|7quSuG*M4OGCoRA}ydM<0M-p#GZ{U_oUlkK{&UFo3hNhj3 z0H{1_pyvCRwUJ%~Rq-7^AZ(cW^nS?NB2Yg*|9F@yfM+jNY5-#IKvOXfsFv&t3SFU6 zDI>^e&)q5Sz6$@cfVmkC``&v#Mt40&G}b_Pe>JR5A%tr?P3vnHk9^mE;F!Uh;9YG=m)R-3r&u-l z!O@=ubl@ok`#tO&hcQWlyM?~Mv1-mn@wP-`ws)ke&yA`J7SufMxN#;%7BTJPT~iGb zZ2~!bQo@Y00k%{Z0|!e0SK>hcqAkKH;u@gXcWOHxXkG%~(5i)e>om=uAv4&40zh>y zPxBJ72nv!nm~-Jt2IevWu%d@CsoMZ3C0L^D!A3D)qYZ~zny-M*{g0bBGO@i22O8Rn zm@&J=fGU+z+^zvmfE}Cw6GA?MLk+@-(a{Bb#myALN$D;jIDumL%y24%Qolb=IA88E*Rt(PJ#uf^=1sHtSoT2FQqKc(I0gf5J+c#$* zS@|`eb|XQn^@F3|Uhes>>2k9>H;C)QuAyVwZ`tfrUU+6=6UqFHcXIUfdd@AGjq5H6Ak-D&vw;s z*5qgdR~wEGqj&jeWXC&0p&OMSOs@_8wC*TBX%$0%LjiK?uRz=sB)S2D^CDc1XqtU=*sPEup%T?W>H)dbjw7lPK zqPo0euTf>WV8{T2%=%q7t^RoRjB{ofvQ7fOaGO?O*^_|$5~yU#!pH(S16)!l@;SUv zSxeNlx7^R`s2uI~gQ~14T5WyL+tuHuNn)G=;$d*tu}NpGNA_7=dxd0GIVE6rPk<>1 zp&Tyfw_HyXD%yN~r(;+aBJk_L&Y^*5RqH;@@lQ8WnEdA^+I57FV8Sk!+-@cN0SKvH zceI`Vct-W9WWZR&M0u@SR@0}r!$MZ6{K|kAYT2Rppb}>=ZbRcQ>TlFszidOzBZ&+M zFh3Crf)<}O^sTy@ImKA4RrnDd+W+941K0#n3m6W|?jA9aom(dJi1RZ9I|GC1aUsVG zf=}J5j6J|`)&axeI7`fj0K?((Ej$ej2l!Y|_46umyMW;=`WHGwv{btR!+Aa33|PZ7 z6&Q??rmtxX_}s0Q2z*p6dq*L*HDv83-V;uDtQ|H4zh=R86%MA!iM6lJp>c%R{uj6X zOWq$*Zh|t^a(LJ6w&dMK+Z)}|YCq6ccbhECqIR4SgtJUd4lR4Z>fFghu$wwiD@;DK ztvwf5Z0RrgOfAj_R zK!XL6$beFK_i?gjFEvm8@`FPxkk~2(*mIG=dt}WRmDoa)miYd?0=IQr#1Syt&z``U zo7YZa*W58`sb4eUftcMra-MkA$GMW+cTkaku-oa@oO#P(L^O#j)$yJNdd9#Ce^=Wq}pO>I|~<}buG!K-TPN4wip`kpd3&nWI1tRRcvQjg6{ z^v-MNuT{XO!M1A7_E1}DUN#4UeJ|iTOwZ?W5n@E>sXFXPkQM#=x*nl=fQyMwSa;F=G6z9coLFFMXiPQp|ja z2>|<)$njO+YKIn_10Puzo_7E7Qp~&#nCa##K^vCBZ9Y*@tpt&&@KVey2qFyKP$s!^ zOW}4lGl`GX-Nup{L)2=S+a@!GDBGOdEjVZ#;b~<}tB*WYkf z6Jnx&X&#Wtb!JBnO^yevVuo!v8tNm@CD-$X8tRf$+Z1ZQUgsy(Hf4x|P*?^Sn8W&a zcPr9bLm$FpauHn;gT8DRB4ZkK6`xvGR|_zZ6reipOr)Y-R>CN zaPh#2jR!arFBhO$X?e>v;k}g?pm<<`nqX_;4w)1 z$frKSf&4nr@N7&te!4^deyMABSC26y!@rq8b!kv#l>iCHdjU{)AGo~5!qRrI`G9|$ zoqk+!LXb~qlWv5odhzNW&IL1+!l=UaYg!g{2BNx&3=K~p4=)~mh<1&$x@v1M@cGCi zgN(eQqPscJ%rQ4cZOG8<-5Og!!v;*BL;DM}pPY%D4aCO1O?Y{KH~g$wTv3A84({&L zRrz_B%(T^u-OyqaW%Y6uo#Qrwb46rC0&+`|D@x(!Sxs@ywBy^#5 z5|S0xFQYOTknTSHg_(UPW{O;D@WgUYY{P7P)dUEho-ucYUsewn-env1^mLVhc9%dL zV#Fm>Ie_iSMQiB^jtp8UMjP7FO2*fWjp27RDvsFQEGjZelk+^W2{oglsrtfpq&4>T zn9QIIEV<^Pbp-mTWVdgoV(kZ!$w9_TawzD-1W#{~w>z2EI=Ho9a4c$SH&3MXlRxow z@Sg)#oxlNBLC;oufsG}wF1BxOp=3wFyl(-bC}-uY(Kzl6jI+PGFq)U2eUkLS$Yoofg@quEwRm0mb|cV$SO6l0X116goV2ktk7;z3S=Sfa1saZ#+<==7mcQ z>|Tsg;<%F%#WW#K;c^uk>1v=uu=@3;-PF7X=>yWt2Z48u+Y;%ESBDHmDyM3uvw#ll z$ZNeUv|s8lFtEG=an769jqhv##U-r!>E;(x_b4bmuOB}QDai@mCpZ{No)tYw^SbuQ z-H)M@UB?i21?T(_w-AcEvGHUJ(R|Fio*1sBpz#5q;DJ>#x)7twN)m$tRG0qFD5%8Q zC=!^Eli3m?-tF72YaBC~gVt_501EbZ!9}rqTp0cWvEnf)`|-SxQP-ZqAab9sFTBvF z!!qy=d&E(PMQ(xSOP37pN64>&G&Tu!CfLUb*!5>E4uh@g`o`K-ZU$!|degGdYD8 zi1G?)v?J*n+#~Nrb%-1Kh5)PCea@aF@r%%AA$uVSAzoNg7Y9{pqx|*y+nKjqQ4T1% zQ3YTh8KwK1Q%?z6FNj!fDKO!ra7VgCi(Zc5YS=plg0>)9(Dp7)Z41R)q*`lN954Q; zD3^Ic)4`D2h40XhkD6K*+K2Vu8_*MVPfUqVtZSm;lT-Gnb9@!8k4=3R#X&)!t)0Sw z3M3yx;swRnc1i0mxSo}eEs*4A1kc)}ULH&3Pbf$al3CYHMVGi-xDG!8~#$%}-__!Vn z{85%4qHOFijZ65zRm>&)flC`U9-{cBIII*+9vBAKjB=@?fr(IqZnzf2LhssYNp%P( zvkrVQZ3DrAZ*-QDZJ10&V?%BP`iS3XnsUIo3!=6*G&&HvTOfw-bvZ!ZqTFythX{*}^ptqjMsshx2!}3pa zm6x4bCDU_eJ#092k1|Lg-GTAH4SHtzM7XK05of%f>avaB8nCqS!E{}i<@L)%6$cRA zrc)x^*+kMnxDasGF^>(F&HrSYCHN#j`|7n>yIR>O;U^<+vWb9-i7D#n`+{|_Y{@s? zkl-tTNA{o2Ft=r+IBG@@u!)3#4%#~$OPFBU{%c;SGD`z%gs%vBo0018D z1Grqon*b{)m_5?gQUlxXy9JQsQt*+dtu4KX8jb;nF{FZx0s_ zT%AWha5r6T1sraL!?|pK!YzKnEnVDx)JNj#NFy9QfAsYOeo%bV+DT6bm)^jA83FD9 zZGZ|u{>Ss7zvlgQOkB*} z%ztZ+0C&A&V*>!}=K%mDMgRcCM*x5b_FEb5@&~lt!4)y$=yJw=Yypk{Yrq`<7~ll3 z1PI_TLBKu0eSqlYG(Z7>f8_`KxZ>l0;2OaXxN+^;)oX+|h=>Sp5E2sIymga^n3R~1 zkc5nc^w#a$WVeZKl2ef1roiF1e>8&k<4$~n8@L;96B82Sa{o=Zd=DVIapgW<4n7_m z;0hTYJ{jI+D}d?8TDyXe_hTvk8LnTwMsR}=|H_YIt=j;=HM}cV2yPHvzeaEkA6EQrYuCxhS#MC>m!qVnWiv30A0?!s5mbS`!n6&u3yI5{dsho9=)1<113|jKDk^JR zSbyMfdy#=_kn*RF{@mY>T(ZA*|9kEf;3lrSD`fa&fCqp>_1~%cms0s^TP+tR$T}$Z zz&PUN(y5*Ut*kkJzPBf`-@In{0W-u@%^3s+q4cXzAvKfs0$*vMJe`*Sdw=N*vsJSZ z*Y~%8JK@YFl6uFY4f_gRQkfk^nsNSprROnv0P?c`j56kjeu7C_IZ0;wa{IQq3Av!X zbR;vw9+j{iGu7z1+34Y02t`NB*xlf8|JuiPWSOR+dVZ7%g3C^lidS*LWyL_h11!Wg(Ec5 z)23GGgTu@v!u5_=$StkS=&kENRn#!Y^QD>Rh4P9Is3MrOAIpgWU+tjhv%mIa=wS91yGF;9x5HgCW z=2+Rr@42s9Qy(ll7IqYawNi_+j+{4qpDZdy4%3~#>d&aAo4@W6J0%LHq4yHHvvY?u zudS|g&yJ3X(b}GrL&-S|9IO&&6*)b1ujeSlMq!RodnJ3q2R(WS0zGx%8wsQcguMCu z{cUxMhJs#PcAYJ;5H_54-d~g9=Ii872!_Nj8B%Fo{2?{VSJLncll)aLN=!dd`Q}=u zls@PRgc%T(31SO%zS01r^X7CV__hzs^gw zcHZ-J3`Q?-j8Lces?@VrEM>m{C%>|>vR`G&#~ZV#*KD+^S7Bb=LKdGuDY>Y#28i;VnPMWp=dsQI@n*URftB;2Z8Rdhm~XdFtpciL(*o{(y}Kd)i3sWvGWtI7u+e911W2seEnS z;OMvvE32xsa~?Km%+Bj80csiaa1|mejv~Yssb9X^GNi845n;pcYN}Q~ydXI5x`?Qu zXxAX`dOK3N@OAXvK6BvuwwKvmu~K~l@@9`Uz7>_Igc&iD^Egb8@h1+bq5&D1lk!-* zl?rz81%ShAmhqr;deNOLk>5Dqepv0QN1}flWcWs0t9r?!6=A3BSlC7MNI;2&DE9<|vVgUY*ql32&qvY(nAwG7T5h$tHWIy%6$&%(VZ6~^ zjne%ZRlgYyEpV#;TBs8xSxr~qB%Z@>FQgr7V`C|dTeA4w?}DX1Yi)Bbyk;Tw{+K?c z)$;IqA&#B>i+~?tX?ZP^AY4rXp&Uw5@T(H?VlV6FlbV-A*w~GnAm^_NBxNBQgwiOEX z`@Eh14qOA`s`Z{g8XLoN=@s~}m}vwsmK9W?japVzG!4W*0vWMvYvrZ)ocEkXit}XZ z75Fq2oEI$8C+2#H=ghYzd_Sa|FsRwLe^&!8@~ts;P0+4Ac_v`28wYw&430@_f5`J1 z^!WZk-ho)ovSZsC}yI1^BS+sobPbvL%}BRg3;bg2d-ywV<@%nhaZ`uf~7IW}pHT-kV)y1Jrh z+%<7};g$1&#oelxx;XT9HU)B&+1>d)i#t_PN<7IJagj2jVmq3V5CWOK+xXQl5fx;E@q;Uv(XM zv*D$*brko#1pFYCshZ~V@p29g^)wmrFG~gna{0e9msYStGZo={Z+gHB3U**eFxy#3 zFz`Bfi+4Eue&jU(OIf&}f@#jzqvI%JCSM5n!#&FL`VaT$|L?a+>J8Q8^%oq-?!i`svR1immz;xr zXj+Y5f_BP2Jc+C<*(@}k4j@#yb&L8NuRoT*`QH*H@Kr};l%+`vrH!9l0wUZTYWzqe zi{r|>qOHGT0_ul|`;8kynkw(mB6Rw8fz!%E8lo{+1DCG1JQg~wVX6#U1)418e8&q2 z&OXQ*wpEOg=0?VFuLU!Aq_XH@D>w;Lx#)VV`?U6Jn5={AkC%jBZ?E}5rKT2sA)05g zWyvIMd;Vr)mGG7ukj`&}W~b`K*GFlKcZ++SKK;Jc{$?_9yg24!SmkJzn|;2pSlI!i&Fb~Vme zOtaTJK_1u=n`!h#RfP^E3Uqo(U&qY>i-|#MJ{Z!hUxyYu3fG8cwsTCDW{PT=?^zVh zptPx&2<)OnCi!zZ(C_1Fn|12Zt?-%Wh7Z+pJ%U?UjVwI}bmtIgD{9(lLBdy0@+;V+ z9r-&3N@n@_=Lqf$L7>SYix4&UyE}42G$b8@Gg-Idb$kwxkb-cdAwz3)WQAuddp<&W zoof~>ITWiLn~hrZf~GCYJ;LKdmx?;uh}A~&X40){rntH59Z`D@aT|q9_gL3p+2Vic z>1I>N7ZP;XWSckd3oSj-ZP@xo%fUBQFIvPX{JvPRBav)o*ia~DWNs*3`HC-$*cAvQT8iM z`p2-P5hJx=)7;6_b7Kpwj;|Y*t*&9#$#74N`nXPo3Pv@15clorXzM!a8D&LtHN5uX zieKGf)N_R}w+u~da`vXlonT{QFc`|>OGih${CvM`q5q8H8~DWTdQ0j7=MnnLN4$;K zzpt=ANS6#JKIH$(Hq;OM!Jf2azZU*rPfqqiXCcom+>7UeweE)|K2`xvhm!%p^2DJX zv(T++{_MIE2PjG#wQ6IjIn>LsuUD07GLrDk+WRK@J}bA0YWA;9>tT~#r6?T!z?K~z1VN}j!s5BX@6er3*%s>z>Q-Bj{EV}OYp zG`!rytLRl;EsB`vEOp3;n*i3bt*c_@^iJcU`$WTgElK->sF9rraX$49t%D&nulZbK zZmH*_k{jn0?d$@wTA$@SCn0Etl^t-$x;zO@`B|;($@-9`fvb$!=#;uwT4oDruel|Z zhfR9iaG2U~-%3?G)w9J|cL8lZS&`t5X;-MCoVp4%CmL(fBU^M*!^&cKMEG zA+q++#B?D%PkNgw%du0N=+)Y$2Ncc4+n+g`Uv(J9dX|Yd4+ZY=b#c!sE7c{Ec_+-g zC%|X?*uXE*2QPD76;yxK)WQ5D&B35fx5xTp_r^(>qMlal8oo1~r$A20fJcRu;tRvE zC(`f>l|b#mr5ee*#hwOaa4J)Q_VGtXZ(gg-YIci$iW}~dr_7vWBqM(5HW3Zmo_d5g z21z9wNkJGZ@I>ZHD4Tb?_kEJ!C&+hWm4~S&45A`Pc`Z2@fr&|>eEG<(>+ja++pFCM zGz~vaPAT|5eA(ot-iz@MQj41-NLEr4vL;)V;?@+O1aUzoAfbtNdhE?oik3` zRvhh**R{JRD|&6K*1H`JNV{X5$EE7H29k!R>fANwya|!!c1LB?OYS>&_q<|I%O}0@ z2ul%J$wB6RrDQ?r+bN4|M#9a674EBv!Y~$d(vjz+B?H4Vukwt9kVyl|hhb+jZObsC zt`p2_5j~S!D5;d~xZ=qwCw*vpd|P{SExOz(bK;fGBM)~d|Aq)JM=Ot^Egu@rqc7W= zXs6)ilC7r{!Ny($K_+uj4q-+1)sR({>|pn;=YZIrX2D=*4=)Q|FP740iyx zc>ZFi@spUB4}d=)0WcT-Wy}0sR{(7Otd($_3( z=68;n*vy4_i~G?dDUqAfodZh37Y;G0FsmJ?+u(jtVA&2#_LLN}tn{s5R%M3Ua85!a zot6AlMIzvJlZajPc zC)%#Jo76_LONn~qW~rES)I9dI3SuRsvHl7=ADREM@%|TFH%jy;|W>pGCxgRjgc7+wRCGObdu=otzYq_83By96&m>(EDZ3hN%fvH;+l{!PhYyAQL z#qDaast3;nDZ z&q`(i4a{2C)wQCuwz+!(tBJWajfH(&vD>7~%Go_Vn259_*!BmLsqjRW2g5}%ZVT+& zlqL*-HjmX9O7R@HvgI?eRO7ym<%YSeT9f9A+t(Uu z#!(hv8X+N}EmrDcxIe2~yBoMT|6qwBu|vD1V3MYC%HXIPc;VqSVwN?JiZy{bD&n)| zPOOai#$c*92sqg#v3BRH!u?{E0G+N`F%m;>!2JbFVA> z+Te?Bf|T%3<4C2kUY|NqSUQji{a19d=aYD*p--e-IB(o4PLX|i?Z zS4`Gfc;!3u2SLBuNOpk2zgtDtr+8k|de}nmfyCIB=k#2sI2(-#@IZe8C+@adKKK<* z;h{e#y{11WyjoU0T4(dsgkJ%?WpBfvQYScf2{1^>WSeQDz25hV4%y?HCHN{44tzB& z59XFv#j>#p;LIs4pa1Tt{vYy7l>V`*`HJ&u zGndC#+TbwDn26ePa+{pulNA3^<{jz9sH7QV)ige$f))_{^_i5n^PXO zZCz5V|B`ge&35bB!9)f1DwF~u0~nhDgprZa;AUmv;OEi5U1Bsmb6vY041Y_V^~=eH zo^kuF1T}l6Sxcb=#KAxZDqefKOB-wzR|3rBKQaz)d~f;?(ul6-ds4M-Ff+B=^|Mz9 zx0C);%6##@bi-va@PMxCU1>=c3GwaE?)f;k>JGm4F)-K*Fc>@J(qg$~*u>0#w4^_q z3y=x;dDQ-b)85<^`=RsN7{qk_(0R!pz4%S%743lw;B;O=h_*>@?==?PL)tHr`Fr-f z7b0DyvtJ}7EA%@!`vC+}@4bu1;8^oNw`e~f(tjY;-`OBt` z9pPx}x_vp{jkR)bByn9XykwWB5(1J^2#zTb++WGE&Bc6kF%ZpMRT((gST?Cu{iZ~7 z?frdIiEJfOZewV|e8if5rR%A{asAh@SxvqHcM+~{?;U)oW5kpYOZ}dRB~ANprZ9}N zNb`trT6?Z})l)S8?xAlt8-FhpNA=I}H-dwn;?E8>z<=l1*W&_yw>QiFW1pRCvEwfz z4`blA{P}}y!g=Ywqb?a$z#0*{?~3wDKWSqse@`2GP@iVo+tJ=PdJxpZ+`b^4HH@^k zy;`}=YxQ^lZZ=7tc{(@^eTH^|KwWmrX{-Le)OURg@V|hUbDk={T_a?ek%RcRgDhh2e0&Y@imHY z=xL9uN}n1uDb}_wff)DRNOD+~ZW8HVg78xJuvrLep1`s#pH8*64CfW+%d4=SH1UQvFeywnl5x zYD|_j)}9UWC~b7*#7QPqhbJ8LYI886wQ*{x`w3sjPTp#L>nqA&Ls#h|*XkUlx-Gx< z*SjjF+yS(Yxwfr061=*Kf;rQm4tteodj2F|{l^pwVcHa{dEQ7A3W(`qyF;-SgNXPv zYWQ75G#8Gu4xU;`!Yc%Ot9JP;m0gKM1cZaM(lCo+uB|&#x;e)46GlA3oNBi0N)lSNuJllH zZv`e}zgD-e6xjC{X%^&$9qe`5nVKAMNq5Eg=-O8GWJYN)lp8KO0v9eGfh^l7TPe$p z`^#nr=$C#WY8)2qH(*(A<}V5|NQCKepN6AUb#{3eF|qr7(lst454`J3Y*P7)KCG=8 zS!@*xI)qWqKGNy0s5z;}Ds+88+Y@U_XU&pLx(>+!`&xtqMchka9_~X8&Y``TR@L?y zMH+lmL)OPsyy|QQWP;TSv4iy}sPmZu^b$Z;`DneAB)q@0{B=h{;CChCf(!-+Gh#Bz zMH6Fkv;pacv3AZ~ClNXtawNgMQgj)eKukwnLl4h_@lw3o_9xxPQ%gH>vDPhcJD)7c zmUYn?owm`2@;vuhsW6*h&2lGM(_pp6H+A8`%bLUEedYdcAOW$LZ}wrHhlwSJqR!k+ zBz$n!<*J5lEvcpXhl)MB^e1Qb?I8$8Dpi zoWnfrWIH8h7V}o=uzb|)V8&qPJJ`XHL93znn6Rn8BFzE&&>C{=Gl^gZpCnO<2jIi{!9x39`zEG-Dll0mH6l z?tsGQaefgScS|A*F9ErWO{=&5FLeogf{vNBO{Dvro8IRpROFc2EnqCG=Mwk5$9A4| zXeQ*Hr&Rv8;Q5~)V(|b{W>qisiB31DRHNTKQr{}xeNIp;cS1dEdO)(0?e3gW3>g`@ zwxXiRa~;=4H=OJ1C35K_?1$^iFtVHYH`mvIyU?zX5M$T>Ho=;Oo7}R++%2bR`ev1h znrj=mHtMW*Am;Y1e8RXg)ooyqME4Vupqawa9JGB|yM>hf9$(KhDj!MRKo-H%4b9o5 z5Tm*J6&s~sy90GEo{^F~8|qMnl&ekMTrrYubm;;R*XxH{SKiz+()SGd^f9tSsE3DZ ziCn|fI@j(0V@AH)L~6i>elEJDk^n-IBfg}+0g2V-elZ73`chZ7bX-b$IK^6G#GV((dy$ZPLf^% zeO&~wOTdiH53%t7f=y}n5}>#{X{me(h(9?#SiPzXspovwLoaszuH#+aJ)YM;i=H?f zzgUvEsOZt*(r`)b zLY|P1an?bD0|~h?73tAi*Ys|UOTe`!gNSki($ zy_TiUy(yV4%<);{3K{h(*Lz$jr~a|W$nAJbe`g{ro2>i(GAm~I!X6rPJGo&p6g;Yp?3rlRt_BDr&L(n&EW)@Emk3(t>MQ5R2a4*H|YFHJ`&G7Z^$^^9R zCE!|k^B^7dOvKmK2ZbLS9FZd>nqxOx*b(;NQUW@V8lV#y6*wK*yoj2fM^VR&p_ zWNiJMo8LyFPXx9J1(BJ?qN5k1(mJiBYO^i~(Da#}?O%bydFoZp0`CxhCPG_@8bAs* znc7e{tf!)XJ4RP@<^jZGTI*P!;pMPyeWi$i0vWkht?iV9N9S191xFTxAtATrEc^Zl zO~>Sp$jf%uw{a{?WqQb}#H08iH8w|NQ-x)ff5PX<+^;O$b={?33#{OR?wplg4vJP! z<8LB{nWRtm9fKYLTs8`M>@wKuQKcY1uA|?8_F)={%)a;JQAdOgvYZNmGdCuEzeQB z<<6a-aMmA@kF;kxXADDSa4*@#TR-9dlWt=ItPgzL&3T}~LLRV^q!;Xyx)*=pQvT*k z8SxkA3s4#<%e70u>^l~(nU;5-uILR)9T^V3Te*<=F7c}#d1>f;MSH|0;O^e;dhd_W zEkJ^egno{x?dGsQPkN+IS5dM3+|<-Xu2M3$+NLX(y_zZUK5{I}dbFU$+X{7~meOIC zCFR{C5rHUzf-j8nb#&W}d93Az2a)w`Bi*K+AP8xo>GvE+ijHh$$M5q>s*|Lj=eSR&Z?+Td}R`L z5XvJz*g6&3?9*jcDL|Pdy>0&tyCF?N-&3JRZ*SZ<76di15Zar4LT}lt0|~3fYJob$ zA8jN*?q?5eXPgeivaP{BlfqI&;6gf{%oY7(Q+&qWanL9M0?Oe`Z8J0#p9J@@_%ceP zhDoQJO^XmzF==8VU6lEZ_mhE0z4YAuyxVsRAvZsZ__Tn-&U3S|=WqvjFfE9ik@QaI zX@P(vMC;bQDObm2-TUWf)OdxWK7D(023>E8t1|MQ74Y*2CaD$6Fs-{qC|m7Q#*;75 zfPf!i(`A-z*0BszTs6}(}eZ|Uoaf#tW=#gWq3v9s9eiWUA2eT1lqsf9LJ zvo)f3#KQ%*SeX!?4@=L~UU}FKo;jq9QDFPlzh67_T&^3g(Qqe#fALwa5u1+}K8oxj zEj%#$yznwFD>vTSPy?$J_}Ju^5w|tsC{itJst+^3{PvHdiaIJwHrB_w8>6+U%x`=*Wl5NIPx3e zeG+aF<2QScXNF!~0$#l@Y(n{@lNSm4smX+(z-a108mREmHrulYhTX`XO>61*hpU>> zHgkFFvescJYOu+wd0h3gcBP8?6Pra;+EXX&Aa>@xJN!&yoyl=^hyQ+#)mTaX3@;-} z2RlS)JC&Uh#24*%32;Fv&2VkqYqfzg3vt17J5hnGz}W1jOtxi3k=_S7RlASqH(iRy zl9qeibX+-DonH4;Vdl>51b0DXw3E2^(Z31=MVa1PO@l1TvhCtcy{ETHwNJg4 zQO(9qwxT<4K*li?`2jf7skS8xJmO~92jzLByGHb0OO5}$gIO!%cx?1SXCNWSH51;! zvBGL*Y^K}~yaaS9intA`7tsTY)T_&Q^AS}^I%Xc(kL9OhVi4>XtUwrIwb2Br|BxVI zKP`qfNvmB(B%^l``$8xVX>`yHdyT50uMeUf=hdIjLj)9RakXv zk^XVuNU0*&-+F}CU8ZsTrfx^Oi8zKVC0LeM(6Zh{KzN_f&d6UGy=;ZQXKD*`CZpJJ zWY-8=cM4vrk7s}eTm|+b-4vTUvYy4hz3){!E8Q#G<*=#gbXQ`kIte?`r)sS@biBJH zAL6PL%vV|+|x@n;&uba?JjMU!ifNq?i0qt5wkqeOPY zIkf9!IKMGW*-ZR|0SIQ>elU{GT5j=VK6|n%3%3ut^BgJ4d72cONbX}uUp4sniMyUZdgbxX4;f`2GhFs%weTBf z_uCm}?J3U-#!)k?Q-g*eT>zvpr)u+DqOhrJzs&ppO^>onWVy=d!2pOw)!O>zy^SYz z#RVMk>}pXYx#{MuY3)H7t=v4|7&8dXW-_3i;OA>9TKP$Joknge!Eb${7o?8Qyv@g70 zGxGQ8MOx<}@`40!j(o4CCq{%eZ^wS15x6_XX)zxXWb=|WtGi%vnRd1c#xq%hE?;hU z!Ayq=&LENRrmGs>TRr@-sjj`ntnUz}wTT;*vS@jYO_OQ9nr=_K1c*TRhXPuWNXI)@ zH2qn!9wj#9oS_rVbJaM>$dW1El(A2Q^nA#rD1c}=wbDO$^5a#L} zryA$xOp@60BlRriHVu6Cg!nw@7XWy0NQ^p9Sg63K)Zo{8oEQ+Vr)DD4+2h6?bJi|( zJgcU~Dvt{;gWY?PEUg7Bt_#Uz=lrCGIB@h&`DmlSlbr(=&JXGAv1H#8r07Lw?L=D* z(;(Q1LQU5`l=3@)G_0zo~+ z&F0Oh#^=wT0|5VTd=Af;;CWN9TiAF8SB{_z>v~-rL$~tJe(=i`PQ#5e8EeNS_s39p zlZw!boMXLuE?dd6tuW~M#17X$(L74mPio7G|0M&;vT71Rx#ht6Vy1hOTDSETBY&6O zgNvS+m}5G!(9#quZ^LV|!6+$rd1}94UB&s=-x6M&gcx%6Fk}yK8xUGUtoCRIl-J;bR3K?HRP$?lbFY z9J-PtxVFeOdIOtU7PTy5-mw{bgO6!v+N1KHXsM)0QLiUzbM4zV8?=poyn*JC{hn{& zUXs?`H%qjb5);wxo9zRxkcD8_%S+4c=l z?T?lIJ9Nx0jnMId^p`z6kIJdOCM46{!UkLdc-dLS%#?eni${)9Vao}`=htE}5_VWi zvSVkme(`ptLr;r00N_T^I%nt}PbFt-`n3M zd#g2s?4bhkq3ViTcv8P^tFLxrc0_2HTMkxw`aB1<1&&gUp9}x>7=|z1g6^y z(++t{z+NQ+dt{x_17zZuk8n09h~w=@D#|ixRZb=DAbe;mo~|You4kJ^=a=tpAsufN zJ+yVd67sQX2f{9}Pfw$E5m<6ik*Gwf>}eV@I96LAN*EL&{5=l6))}fpxuJm_NfoK{u%s0Ww&oXlFLVTZAwRT^+- zlX>rj^Y0Rr5sVw1o{HF-X8JBOdhQa6?h}>`#VUc~_&G{T8m@M;X(tP6ZaMeX0OJJ< zZ#)aMGg?0)nrYCYr|Vi)eq*CfXyhN*ebl#3$}eLg0yg15c7C)%VAGg-LwY=KlT>t= z-s^5uAn&v3s8nQZT`XiHjAe*P@+GKzqLSYHY8u2Dp_qfHL)0$WoXs?<3C0BKtZUlF z_r25}9a)1@8DcV(T{|AVGH6U~x+(*@y2I(R?vEf}kFl+Jo|V5aRxGybY2 zGoW>5PDGwcR65brB0Iapf?``TsA^HW!XpHeDV%+RGIy(3$A2+Cs?mT52S;ZNj#)7| zdXb&kRnFV+8V!`eQ~0|S{*0V$LblZk>gw{XUg`S`KB zCmG7e$jC|2wl1E(MsRZunqA*`aVuISCQ8KB?SeQ`FQf2y@m{D-MxXEaq+M(-Ou18A zRD=SN_KkX`GhfHbmLBaM2W1c-gF|aQCM#y~PP1+(RDUK3AX{?a>f@{qdU& z+q?EbGq>Ib#>nR8oC%_^w)mi}W_C3%$c!sDL|e_eLV#U_TN1|jOeNhy4BZ+)htmn&e!I!*AHIv$T?bA5ecqvg*_bqQfn?-fJAlIsO zB$dUcp?`e8#ha}<#e(5%XOgeaqt zA{d~v;c$oqalb)SEI2uEcGVTfTmrnB_P>uhnLWx3Jt|rs*-E`9crL1-cUmfH@0Dv& z2U=#?WRnhP>5^T-ugv+aDz8sCMi>2^rHHLN{-D54NH&Ky%8b?Jzp;o38<3Ip@0%#bHTBj6Isu zT0~ZK1>fw2si!G|rnz4Tn3xr7w!I@G>bs_(5~tJFdB4F9t5*r*wCqAI@Yj%A*U`}h z)WE%wA*gw{jY5!#YTtpRq7N=aSaZr!o9YA1&gN;-;3Yu);@j!^SFHf?hWGl<;Ypr_ z9`vt9LXfy7{Y?~;AyNcrchBC~tUR<-+>A3M18j zIa&PQ^g;mMirMe6+P8i`P=-JH@Nb&@%MWsY^|mrs#^=>}ni-7Aw0)rBSE-C)i&vg% zJkWg=?s;cmjf`Ha3MbfDxSHgmg*z6kPL@Zy%ih?fS~o8TwDAb6knJd|Ojud+vH22{ z9z5%|TGK<6EgxOTNklix(PgF?Bg0#!!G2@0Pd&3uLe4Kt+A@MCVq4rSrGpcF36`8h zGqv^6{GFY+mvOw$t=9m+;NdOs=dT?WvqC&d%o>J}lln6}a%+|OYN8#_%842TEc<9@ zoA#!y-p*b_LM>^HVuX%6`+?`U>rnRSOrqmsi>Sj}%*!@I1C1x@M^vuiU9QN0d$}=D z%ZFseMLC>76T4ZVoabtd$Oa@z4_P7ZOUILtkcJX5VGNk`?zW$96 z!H1%6{xI||n(EPiMi~>}_p`b9?=HZz)H22%MLP)Z<>$W{K>s>SKVi3G^UL#;o=~>m zKKCUl$TN181{+htxH(j&l$EXDL@e&F*vT3&Xx?RZ?PcCu(!6i6Si>`U?P;oeyML(c zSlr|kdZIHZ+q~jjIasp8W^ocIh`!?PM+{~m`siO^Of?mkeIy9=q673kkApvh`A5x_ zDT^?}yBeQ&z18?3SbINCQ(QRq+{Uyn&^Y(+{oN@u%J_7nPaB<9 z1@KD-*>z_+zcYExcoc|ubHHd4vc4;H)X`N{?#fcgJlA{w)A0RU=(W^BdiPsUyQHv0 zNNIhMU!L|-@&i{_30q{u8@Hp zmQLKZ|8Pf!L#PwtwqdtyyD&I7dB2M0f;DsAzpjM9>S^Nb{6}UwE5dIo_?~@89L4f+ zD8g^%#|AS%os?BB0pqUwba>>k!IIL}VU^a^%t^}?#|eQnxVkOhT{-K83Li*0CuGgP zc@KN|>`|3uVC~dU6<;V=Tgy#QwuPPL^>6gj%Vw<0F#Bx5a;;Ufx{3(RXv`k6spo$? z$}sK6KBe9+@<^MV&B8-&yqyzsr@6I^(?Y}M^ZPb0nH!Y3%$r#nn6w(9j6nf zHJ9G^6}TU@N;!1@JS|fs&LjIv1Ji*k&MX+}9TV@0X*Yc@_?)dEK|2VfAzBlil$Fi4 zr%XQyvQZUDK7GDn0Ol9V9C2h}=`J$-@Rbmu&`@mSPSTWkvah`X^W_2ap{lcEm702> z-U;=g`YPXa*4Oqg0fHAxe^=sq59~}6n|C%6SH=kE&-r0%e>UMVt`5G$Hw87r>J=Vzj=WyWDqdcq*ctFK z3YCd_-`|&ApUga)EfV+hF}@yU!Rc{e6z#}g%*PyR6;dXus_U~Fh;~p26+xY?Y?;*R z)a`LR_{dJNPL?wj9%whND$SuJHG!c@IF}RAS?X~zxxQ6?c*qSCsH>}5)PLqR&AK|I zwEFyjmS8tqIPuHD1JM`*xFpsXo=u^12W;ZY$2DBT;Pko+QCzc}ok+(bc>CM7d>_Ib ze#C(+oT4ga@_jt^XxX<2G1Q@E~I))u;qJ)nS zl35l-m!2%}h(^bPDxKdWqk>oS>k_)>qG-78%$~d>ytDmPxVo-mf)6UxhDzen5ZIMpm55;-}^p^oOL4{<{i#%o}hF9G4-;W<(noONFk zNXG%2gWAIm`q&u(P0Pg0h!n}lp`3cY_Mx1>LbXZ~Ee4lm(dj~Mm~(O{)HmBSIXdgJ zKG-#G9U=4fFsV2fm7`#CD2f>s;RCzIstRX^0`thH^!4oy&LLRA-fv#Nl5jNYA17CpyFM!rQ_zAR%3J^*@UjJ;S?wYDW}{9FgE z-SEjf&R&0wUXG?;?&7Q3T?wLH_Oni>Me{-*rRAq~Q#HB00jJhd9KHE)10sP>&h?qK zrmrfdL#tVYi!k44r@yGr1w-$L_&%1pGZW4g!HclQDS)V_;yt0VcCJM1;Ox_wXp-lD zW+(qJPUaSS2Yi2udtyxPR`aH#kq)`hCiT4GN#p0mn>QC05=Vi+c5Pp8P#aN|lI61qiw}D!EwHYQ3PJl-67{}(Y7k!c$a9ibmh_8+v#2tET zLkF2y6szYtO_VVpH%p6((zGL?vT=K^If{Ep;g)Qx@af>_#pQaY+*1>vTxCghq{htK zXwmPche3{*y!tp$M+_V9c6}tU#0m}~_kv_@_X~7X^QHpX_fsZX+aeh zg}$1|9d@Qs1tL<5;KHC5pjE3Ng4wb)A74JSr6%INorLV)s3Q&us;v@SWLJ|nmDk-&;Wpwz z#kpX*CV~Xg((;%Kf|ZnD^iB0|1C_(6g{-F4gEZ^zOk5KsfJC-dj8V`qrZY>2In=Dl6^Np4Gw|?GY{_-IH3nd%j?4zVMjl)BL%bG@~rZC7|J%>~`IA z@AKbh@*k#_`;5=hd9qR?t*Ey8OUlim%N?H5U{@l3oU?1evHC{kTln|oi;bGQ z`OrU2{y(JrpA_2Bm*i>hx8GTzjjbA6^;sNcOA9c+>-Kf=?IoZjo*0Gl53UHeWE~hL zQ3}c*5m5i4H$J1^m@g*c?DmA9)o*pgw1K7nHS&hV_^SLinztH-r@MZSjpDq14S)mANF%n>e3{NvEnACIcWT2S%Rb~t zXH>>2i@YhkeFOsem^l-xY?^Il^?%wq_i&~cFpjTNDJO~wji|6?SYmEn5Mli`x4Bg0 za&k#?pSyCZ^Qa*`J<=PfAu`)zw_Vw zKJW8<|N6fFyx;fvoXwg^o57N2JRM42_}b(X>NjIB!XPdaT!BKPAKM#tY&yNsLv2+Z z;ofb7V$=DKE(?(x0^Qm^$NCr=@*-SkMWuTJTwD1+4F>YPp9SAXgZW~H)rvX({G>Vy zGZkf1e(pS6{)LmTa#LoIhdF(G6$Pq^R zS;I=@`E)h_bit7Fd5LNCQ`w&rlDfYAy-H&Ma&JRbVo|D<|ZCZ~aptdgSz_1{O55iD9`KN;EGy_|qTjl}vX^zh#q zJ#^TB^RABBDUjysvgnN~8-Be6KlnbpjHKtKPzvP}drp*35|pP`1nT(^RdRWVak%0A z=e`!1V#y{)ZidI^#_M-3V;8i|kA$U3nz{hw0|vWo=8);rEjnJWobq0#^2B<(+mUSY zu07;-MeSbNIM$7Drg#-)SGoM40$;oFu8}c=MJ+Z@_8ENJn7941$XN8gUWqH1)@VMH z)1y$3tGnUs`~h{4=X-gwz#CrFM5h@OsK9BHwGL~li+%Jf;n|MWsln2tF?xZXZg-0o zbq5IjRC&SiXp598)4ATAAQMSvKxb~4oH%d%3F7PB>(}f-{7l9uJZ0Jt=IJ$Rn{}DIFrgN*4q1RcJQ%W@VB=iL6&4abYM{2;eBp{-HdF?#!-m z@Rkg*g(~lydt!rZpZK-GnS1J~v?>z}EAUwxJrwRbNpucKkQ?@$ipTPyTd3FQ#9}RD^@=jyr?9$FDmogYgna&<~cHNO!F{aL#h85Q%Q@hL`9i7KcZx7ZG zbr+j)!D~lqE)T4(Wnuhz;hPIwC$VHw=2)aZh92A+ymPCI>YQwW`}A7HCj;nw#V{~l z?lCG4K4G0B{KMy@gu>S5S2XLoZnei?=-Dtd7xF{sm@j+uPm%pK`H=I?*@lx&Zk?JX zm-$PNOV+=Bf^RC~#7pJ_JawFjbz zC!W_T#n&k)owRfxW%ZZp>Ze}k3jtyWJaS$&r^eL<(DDm_tg({q1H1w_aZs3+r_u)t zl4b>r^G1gev1A2PGpNjDFL=9pQR-K-Lt~!dQ$|uVB9w~qLTtq<`|dnF9AE1xh(S0z z1~E2ALx9Q=n}>A7&z3L>Tc)sG3W+=B8tdj!f(trMUuQIn<}}?b0h^3x zLZ)XoI^aog?^DNAZmZ$ZP~y>%^rx2EHxgvMwF=Q?Pzftuk99k`;9QyAN7O!!xLz|W zJgQ#P2}_;Whq?ztIBr=ZbQzXZc5!epeuQmHFJ!$_t{#qX7?duJ+41-SKKQDfOEKGD z=+SJ;Hn8mMu~Z)qYCs}J?!1BRFdB(duD>XnZn-il9DbiB8S+vpcaPmvM(t#*Q%<%6 z-KuVl)2@nJF(mpJbcfZurPGkO&Kg@2ryld11EIN({RwzcDCGgaWVr=15P5Q!=ucCT z=>gEq5w%O2PrU2s4Hz?$+6<+~m$*}P*ozNnrAemYTjV)S?R}cOyNu1uHup463Ib2l z)jJm>H^T$8JMb1)03-E6h^kCh00U_ezBuQz%H$ElN0L!HxCKmdQT0;8=O{ljvnhZN uSyw&`0rdL;S1=vjdf~tK?uCCF{WDei2QVz(XnZ9BS*ZMG_;;(&Q-6 zB*~c;C1;e_Na|jEGrN1<+nKjBbI#5=Tlduc=c{|q_p7R}>h~3KoHz}fxvmM<1VAJJ z06KjDA`Z9;P*G4&Qjk+oQc_Y=Q_;|Y>FH=`>DZZB7{Oc|+)yqK2!u!Af)Ed%I6nj; zd{IPPN?J}%j$7!Gs-ld_1z9vVU|>@~*5+XdHO<*`Z0sE81%-q~MCIfaE-GG9 zx_S+!sih6SZg~5Sk+F%XnXR4ueFsOU2cD0-ynTHA{GUDx4GVuB5t)$qGATLbRccyp zUjCc61%*Y$Wgp8i6_r)hHJ@5q+pz5&on3=N!y}_(;}erJvvczci%ZKZt6SSUyL3q;~`s-#S0yvj{CCi%@JQKoDi&mi@8lsz9AJ#QG zPW(B5zL=xi1M-~ay7zp4l%VIgt?Er$-5~kQMWV4U!kRH5nOA>zS*nuo z^6nQE*JX}RitZHXQf3GXz9@`FZe&Ukf$X#4MBr&^kZvv&5igI4K? zL^(aXRb6GwtbC%$ODSW$rZW=Hdl`$e8OkD;2orORhagAf&r9hbc*A*trXn7Uo6@ z1HTll*6uG6`P1Rv=nNc%QIuO*Fn^~L!Sk?_ll6;!*zp-fMC4$i`f#SE{Z>##aKaUF z1rtl_^oK}Ulgo1b7`6b~S$4~|w9m_F_T6#@u=}h{5em!6=3Op{=yxUSj z%izl<8xdes7;8Hhk$VfN@cO~JK$w`VL(s<-_wB0a+wgMM7Mb~^W#2wUU}YJtY_K)7 z0_7O-qMedLI<5@X(c98vxA;r0xFvPPrgSTJiZxM2t~-)uZSEh3tC$i2YZD@{8#!7- zvvjOV1bF+-BFBx?PWUkBkYJkA8umAJ>6n@b2<)_2;%P8MU_i%6F8aRCyYAPrdJ!&r z%5JZ)1q*3>L8f|{#r{kqH#OFEktE1YmCdn}5EOFPpr29$#)|!!(tcHa%zj9FAdktk z{gI{qNJGbTYTOxP6bDoG3YdWdyV(pC zk@FbFbCxC+&MaI|5xGD%R}}=fJfQwh-Rhn(3~E41lETEzm&D_=MMsWDFV69>O}-{(`slI15Ei> zKQxAlZqu&y7T2I^NyBh;(#vjXoP-P=B`;Mow3YhZ4`A5jfE<9&;Gc% zWQx=%jUa-O9N-&4ywdVvJ{i0<6|Xk#(Xl%Zy*=6ncoKol*aum=m)5fO7rRfZ%`y>q z_V_jt$mzRF1R51Ak7F&!!Js}O@JY28*}sHFeoL1mXyp-@HVg^js-A@73FNlwBd{Lj z|2&wnKeaHo4k3GeM?0rLJNEkZ)geUSn18b1gu#F5MzkN?Vqw#*WPV!S@G4h2jGgr2?w@iYIDd1|$d!KzT>NE}=+uN#+EX*fYCM!kZ zlPjG#>Zpdym`(VE>E@HgqAsYfW#A_>V+Bz~W`V_bl3cg(p*cM<_RxN!TC--ao^fhK0? z9!Hv`GTE^1ynA^7AKU#~!jRo>9^$F{xR||>Q%551QP+n#vuRfK<&VQT&Bx^+E^yM~ zTGxY$X%`-mY1c1`3Ydxad-ckO{c1DZBi3PuB8Y}>H6wX2cf%gsQn)B+DvF{Vv1I`R zgJS8ko^uS&D)-p5_TuQ6C!IE+pCNHw+YQsc5EmW?N&%)I!Xr?RNN);Zs`)IJDB#YL2iN(xt zvmv2To5Y@vAuZZ*H#OaxlB-2aKg_&1ZrtP%%ik0_PVA#cj*E^F0hom4;3FLg4iWOQ z+8*gC)z3W*rnr&u?Z9x2en7DpN=5_{{AS)Ck(&{L&d1k5!XEsN#m1}i?>Wc|VsNQicMheN*zDAf{|F+EpBmAs{X zrF)T_tVDgux>*qQ0Ls+RSToA2)T+OHShprIRc6Mmn$j5~7^SmlB}Rn}x-s*dvfis) zkMew>ujV0P&E(k{lUCm9PD!PAr(*!#Qcy8XS~4}bgrEIDHjD?lH#+cJt?VYKdw;{T z4k33dIF`k-wo;CRHyYQ)PNThokOTGql>>lYqgJ<;Cy|*pPTvJQSTQx+X@2J4vk7*1 zAhD^ioQqFa=Bw%Z^QL>s?K^Hl`Yo5GSOb}~y7KxRiUdXmOVD0i_jG*>Lv!t>7_uIm zSiMlZ&~o%6w%J|jd!L3nn;9Y9bFl^Gq|JHzqk&4vw8a%aNBI6~{;riW%WDZ)gNl*e zWj7S0oaKV1CQW9j_IgtYl`0hb0?z& zyt>lgY?=SrN|*N1xhx6HT*^j+sC8G}dQ?w&yoH4d_Zsvp9S!!NJwa1SDe||J|8okx zEXvvavaBrgyE;~p--%7q0Bkq6olR%?d!l{$cf{2B`nTJWhVCER&gbEZ>q2JYtZ%wM zEYVa{J-Xc)=pfjWqNjkLthJ-`z^*d}c$$0H6ebt_{eIFX zalJCv1=BJgDZrYu@j*MV*{fhf zfgS-Y_mq@N6jM5VA4H_kZqznrZ)0+D&gMp(91##~S_eOg#x+L!wE<50dYo(OJG?c) zaL%|CPrV9KW!3O{aY-_|uxMh5((px^+C#G&d?xPZP(-b_>vT(RynS2*Q4rHGW?Da-WVhW8(7F~zlygKOK6f- z`3S;df2gx(A-2L#fO55CNY5#+DG&U8GL9zozN1f08%rr19oKXd)YM&a6e6Y55MT%% z_FPL=*iV?~6s3JW=cn>fl%)BN$)2mC+id%kP<9WX|NEO>-XD%^1(eV$EBv?$+^QbO z4oqZH_|3`l^|9a%wmQnL8M{AHege(oawKK^!)HaS3SUJ=Z7RyEhvb|c&*DdC;kLsI zNg-`Y*VPSOvlCdjeZ9~@7B)!E2N!L|j5zL~)80C=#*D>>Z&l{T4#^MtO19ayCf`gH z#Nh&{uNRFIq8Jf}Mjpla>)v;oh6@;chP)<^xL{y?Gl;dx{>3q-pWQb;m`Xce&hn9q zC=cjOFb}=7))fD9AJ1B9dieH*ZHc%g0`Bt(9-}Rkz|Nwo?mJ;Ziq&*KyUbqaXyG8Z{}CrVjVL8cfG05yxZG@w&w=L#p5hcHhWSvd-v^J2Zyl3OU=>d3nt<8 z9(0tF3+o-S?*gLcV)A&>@tLB-`5!C7=%rmTmzEl*=u)2OGk=}Nj>l=rcB*F=Dym6$ zh`TjUTQZp60uPv6{&}Uu9BpsSQBvAfoLx$jGkXQ>E*)hRhp_N9gwzJD9 zoFV#!*I;Zk*;at6$nKwvA;7?$z$;@LlP)7~Pcj1}&mKFtPHTF6Lz(0T%PtN|=sumC zyh@+#U`m;EhPK*7s)MbggB@Rj*~}!{zz;2Urt({#C3~1mcbD!66w|`5G6shMHj}>o z%DOj|F|W#Ug{gctKS@J1Io&j-;QMd2X7Xb!E)fQ*%rwB_`HGAS8DXEQ*gN}pLtO{d z*}c=0%~nx9_)y0!DU;(mrbVUdZift3#km}OF}{IITb|#01JTl(eD_Vo1ovl&?b`3k z!Baz|*}JGNVbZL!0oS~;3a?b_+Q{k8D)T$;IUMp=G2z$vlz{?R=wzM4^;t`EDb`g}u=E6t6 zKm__IB{J(=dsXY#TqA)c^dqt7Hnj<(ZZb|mj$>Bj0y|$}h{PyHsSxQ7?ohM({=ubN zW#v)LWg{&hPs)tgXZ8mv{6dSpp2J4{Icao+UDPRpRv%AL(rKvB`6NXXz{c%&T7@W45+iY%}njn^WP20bbA%C@K9E! zt2rhJ@v>@0BZt{OR2E&t|Is+8QHq;y(a5xC&wb literal 0 HcmV?d00001 diff --git a/docs/images/Diagrama de casos de uso para el juego de palabras.jpg b/docs/images/Diagrama de casos de uso para el juego de palabras.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b340ad9fa76c2c0c91e7bd761706cc0facdb9a7 GIT binary patch literal 20559 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 literal 0 HcmV?d00001 diff --git a/docs/images/Diagrama de clases juego de preguntas.jpg b/docs/images/Diagrama de clases juego de preguntas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..407a109ad23d08291879f348fcea473961b90611 GIT binary patch literal 14101 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 literal 0 HcmV?d00001 diff --git a/docs/images/Diagrama de contexto de negocio.jpg b/docs/images/Diagrama de contexto de negocio.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9f1a6f1f951470ae631ab3f85640708b9663354 GIT binary patch literal 8683 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 E7X-y2xBvhE literal 0 HcmV?d00001 diff --git "a/docs/images/Diagrama de contexto t\303\251cnico.jpg" "b/docs/images/Diagrama de contexto t\303\251cnico.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..7094f7b41ba32972a1d9a4d05bdb099e6cce21ec GIT binary patch literal 7754 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 NwAA&~9;;jm{SUHfuSoy^ literal 0 HcmV?d00001 diff --git a/docs/images/Digrama de secuencia Juego de preguntas.jpg b/docs/images/Digrama de secuencia Juego de preguntas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c48c2654b7db2f10fa7ddf685ac88d9e3bdf1886 GIT binary patch literal 41232 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 literal 0 HcmV?d00001 diff --git a/docs/images/Whitebox Overall System.jpg b/docs/images/Whitebox Overall System.jpg new file mode 100644 index 0000000000000000000000000000000000000000..613a5db3915a7553217bee39bee10a22f4d06cb6 GIT binary patch literal 11133 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

jqFH zyMr*8RiMlPkz9&*l71G019i$M+$Br02#nFd7Lj3i%R;S?Xu`x9B zp?y;pn<5uw_?v`ilBd`S>LGBVTa`y^bxb7XqyGFGa+aNejufyh$HpL=p&9}GFJQdD zJ`2Pf2Ql~<#O#`U3-NB?;5rZL=xui;(h&pBJ|FVIR(OA%3unS{**ZJg65z3lI3&ZTjX%5H~A) z*eB@%+Nus|8W9tTJh>e?5!p2;YgC~(NB!l{F;IsQ%t+r3O*od8UVFhWwO%5>oQ4oF z9MPhn>J)(jTOP&rMFVXK@Aaqi$-R43Kn^B(8>kno+YX6{{|>IDf@qm>E!a=-GDy;@ zGZI*grn}N%<|u=|qk)tGEC9IGbLcYyw@QdOJj3CHtT+l21+lZ!YHvu6X>}((2!+%d zpY`t_V-4Xf-;HB(u3^{DXz-f%8>o_oIbXztPiW1YA_(m2AY`IfwNpkAo*eq!bwHfbv8TIG^C~y!Aav9tb!hiohxW z;$u!|&CvKD>x8}T(qgPGCKni(1^iWsHMq=M6!U(!ew}0S@Jvrj(>qdR)s?1#7va19 zl*wYlza)JK098-i0<3TE!|me$UR8e)N+D?c(Da@4^41xgEa!oYY02f zlNf|44+Y#NTg;Lx73d};CpBF8CU;-yJTtb@pTYI|lT$C)9;>JT)3)&JKl=N-#*ngt z^o<9Esz3PFstj#5J7pD5r_ov#;$M+)+&3J{Y+hA2ra&yhcncuSAAwXB@erRCq-3NS zT&|)tSY-WBjN8366-Pfje<9fi1BcufWC>ibr2IZw#)eKKUu42@5DHb(wDA?aX`O`3 z-wVE55dKA?oqL@^LJ%S4$f9^_pgL%kE54o^?C?tGh~3?bKO#AayLQO&U+b`t)-a=3@K|sQc>DIBv$2H&DbMF&#)=uH2ZNqXtQNSk+0z^hIv>Kq zk%o*&;tHb5{1$zyoe&4rWH}G6?8cOWmn#yDf9|;wHB@<&EZ|6nN!k0F@`%SpkkK;* zsWPbMXXMWY|sH41#3ek@jA`~LJQ zy^R39ci~8WmwrMA;$U5cvyTc)8&GaVb`$b(Vje)ag{K`X6atym<%-}nQ!V6SQ&v)X zuSr^5`s=$96kbA3YWFb3U;>FG8~K~=^fCNaxHOgY3NBZ{BhvM?M>xf{yqYmvWlq;R zii{x7d0UYKY#2s)BwYy^3}>bDjyY=DE@KeWh4rAG@JT;R4ACR*mc15e2{4jj_aSue z8-1S)YoNW7g7?Ux7DrR0H|(oq8#~DCR4n7Cm!B7ZgZTiVxZJI#dP85+-kGdqDkkcRgr$})cQID_-=myjh1ViXr+qwu|k zjZQvcsa@{wqB)CmTObY9&4pBBwIC#<;N{*1+>7G3iWPNpbREHevMQcRHZT6mFAAV^ zXgVM1vz8c?&es}$>QAQ~)B_j)9=?DrGvYqwAoQ1M>WFDdKf74Ftj){DE)v4Iah{dd zihFp+X{~DmCfGzD-hKDu{tz4Jedj>vW^d}_DE$3OfW_FE$$#7RzVGo0?3)=%o~_o% zb6FY-@{;u3rMQMS(I33)miaN8P3oGESb*f_gN!JI7}s7lfpKrqKiBx7yGsp~k@I{1 zV%-3NfdWdp`Pi%UGy*}LbWZm8Pa}=igXYysuY<3ZsVbAR2xZWF@>Q_=I5ZC^@!0i1 zR#}#d6?>VGn(%t112gD%rTGnw)@IHTY+w>C%PFU`^Qm8rt~ShtHtBzL!mPiH(LjUm zaP=B^HmczC0X+_QFtB=+N=Ff!7t|gYz%ra=_CVXI%hlW>HCwfluCsens=aPN2u{tC z#R?LjF8yF)dspt>9o=QZ3r)xWDkdG;{(1FFjNOwUGM$U%y46F*Ly&s}p?x0x>nOg# zh%IuA$Zo7b(pQd|jCcse33I79U{gb%66-pBK~3}Qgfx;P z+?8sF<*CQL$cPJHDc?ziaq`B zl$?t(8&#Zq-~E~fOy(o@M&9IZ>}KzCP{wrKOA%Q`k66kubL|vPw*WN_Z(ZdbdJKhp zRP`=lXvo-EtwoYt^t?{=9pep@+sD=9ik)Qb&r5`Bb(Q$M{M6%aA3%lF`0&i~d4X0- zGBHVpY%vQ@o|M;G`wlL@P0MUucqcijq&sJ^#dH08zopsenzEIQRN#E;XY=(`NW?Ax zSm1&YUmC97zkdf3b|FO*EuEd*AI8>A#&daAxK5F6KCB%d%p}dnms|d)xL4~fa?tO9 z6UgAc_!IcplIpC0SrRhvG##S?DIY7?QwSd#Z(cvezlV7Ih$X=zJy5^=3f*%)dUfm- z1v87C?IVWg^;7(f@!Fqk3ZK&5N!EFYMRx~q6i;S+Zzf*r&eWjd(2Vd@+XvPCG`mD+ z+-Za->eLzl6|m@~RaScyl`bU3k74oeC)au7PtI5l3T|;%Fort7RcDqPEnD~tL3iZt z;mN%sJo~M9jNXxR516QLIyWSc(eh=C>cZnkXkb;r5J0lRF`({Ei2nw>F=-ZL#)7?e zMvk30(_3KCui&{H%JVpr@cI>GCu=?iQ=1h&Ohu+#WTlZ?*CNh!`fKr*bL^h~&<3(Y zW|V=k83S3<>J;7#M`w;{4mJTmD|F<2exB|BJ2}eoq21@4Ch@he3cgo7%G+6l>@q(u zM%KMs=$Pp)>5y7Uj=rKCG<~gszLcVQz`=(~p-eZ7_Ja0H?~~*~4rPW>1>Y9G$O%lCL>>2omBlAq3ULt~q11zi!ncF!D|@TeE06Zf`1X zn3&%@>B;`3h%Jarg_zfKjLG@G4m=gN?H{udqNM`D%FRm`HsXcj8Oe_rrKoo4;HZ z$_RTM;=3K0z&!9dP+!vUR^c5@dOgqTnVcHu+;uA6P-dRADh1;er!cV}$$IhK7>4P!LN9=Wh^?Sn zl5AwL`46#^jT5XN3*N`Ku?a)Gm-|bd?a2inZee;O#-60iuiBasMdGJ3_xgwS91YzR zH10Z20SF>s&5_gJ+>E_H^eN@v_isz?Zl}SIcK+UpH>6FY$AA~& zv3sI6oNC!+`-r9CuIo=<0gd>eMawUp}e(xz0a)fuG>S*nVR2;N(m|e zx5{ZNTyK+R47|4yGcevNQ=CSkG5pi{B!L7(-5USL4j(L1tun7y@MRZ%!#lL;cNEz$hHImU)~;)+2%Z z)x+3cJ!B%i#Q~U*Ypfl$ zphU%)wN0&h=ciiv@<%DgXAzrduWfX$<+Qv8#)C!(R!hIFQ~Ky~IHIjYDpI=O@fTx;-F-`zhV6BReAnkpm({cj z$0N<=ol{n!jQML?nyZK;G-R8Ib+c67&1sjfv~eDgdcHa62Ed{^;;uSob@Q=Hrx|xA zr9-DrXWXDkEA-Y z94e}B)+V*Xul;HkbOfR#4Wt+5vn;;UP&#$rWi<1B2fxnF`+e6^ySP1*UuvNz2Qv5x zbSooi;xf!a1G>ALm$d{eO4oSuQ?`DegiaCmcYm|xJ1czn`ZeETT3@4YpyER4w(+H1 zVVy+U9As`I`z|DT-DrFSliCrdQ#p?hblu+`Vhrd_EK2CMio0GaGTd=CN%Y&4I}&YR zQ35)2Fz#+S@BZzi_My+$t33@8EkvVpoaPx`drWwp?;rkNr1#9Rfx zcF`?Vvr3?+8)o!_OqN#)cDFmGY_ZA#AZ%cX(!t?;occq6M$+_eBE<4DWg}B7^aVrT zPg>M@@wb8RG|!qx`LQI?M77MPA2Z~RscAW=XpX}y2Hm>_xV#)?IY}tza@PEA)FO|5 zBrllJBiUzGe%x#2{=P)Sx{!Hi(L^k50N~cDUTIQxjHY|?imyELpl1qvLT<+So?~EV zCMSXCvgkm}qX5Fy%=dg~#4{=iKGA;i!-yBgWJS~z#MRLA_Xn3Y-QBh;G6+_)@(l%$ zno)}R*Q7Ar*EwM?hQ#=|5#LX!w+d1Y6*a3MU8CPLxqx{a>8wcBpzDh@WuXdTvgLe& z+j(kn{z8jgtJ}~vPTeQFa&GB3FD>2^(3$7U3z7Yck2qm*Wp`>`7bWVp4gjzPaKW&1 zL=nQw3Z6AKY&Ajjw6T+`HOqLLK>&W?Z{q+aCq4bkDwQ|ee|^@S~ZyOC_Dv`G6Z}b3o8b~8%_$_NBje`%+ z%bXz^Ed%1_CZP8p|NV>#O#hkRHlgG)&{P6qHrR)LLK%*$5|qEdZ7oPL&eXrsEqyXG4PP^I8WlN-El z$ZH44U*zK_ZgBh#<7d6$Y76@Q%BZHwb7SP@Z|Ty1$TxY4O^^==2$*P!LIV`G@x3g9 zBYi^=ik)P%$#fAdU2T_n&}G>yyil5SrG{>aM^I>~k|H$i=h^AV<&vRY4oW=lkSt@D zV>=j9tX=(ye4R%uisa~iikkKt&g*PcQ0b8`Enc4o@YUk$4@Sd3UM?C`J)b;~d`}Gs zzR@Wnp?yK#-g_$`>J%k&jS$<<_kMOJO3503Bqc-M`}<58?t9L&(dbv)lwFk4^1-nl zAJUqG_fwe2Oq~iV2zVZb-M*f3%77pU*<2|1tPz?$f_V3Q?;f{f6?FG4OuKNx9WO2Z&>SZP&lxAPjMw)9iZ7FxC`I9hvMo8c+8i zG_kd?-F%5feDeX+$TDoBkGEL}U6cvfZ*{o4^@Y!&6(iDB;MTc%pNN##PRR@;`49Th zuSeJU?$VWmaA8Od97n^8XCdYW7Q}1rl`3cyH$p@YVaPXj0?T@lJLO%+Srml7y|lgM z-23Z+%0yF)n;rB~q>0S}3?Bq9axDX;yjJ=<$zOK7w?=@vd<*eT-A|0FhEYbbZ|+IT zt@+7x)Ujrla#0Fi;U2WyRjdWS9YOYHAd$}iSF)MY7GFMr;O-?TGH%ij8B#4=}J z_cPI-_q-){P=(Ut$6?!;nuSNUH|6AayL5I{*ydr2Ncz1X7hP41oc7%60QDd#mtV+J zAU5!Kjs@ZBldVO6ak>D+)%_e=XBgZUw))!#vpZ*{-=^r=1~vgh0N?w)U%aLE-$g9h z57O4P`rvQcoEd|#>%_7%mE7rc`WjVvVQQPo(MOR`Iq}P=HRo!p>=^VBmfpaG}hP{m1+)&+;N&A#ejFpO+!|rrcV?q8P0P%mi@i#VTHwtb zD4WQTBpbp2AykrUih{?qa_&Zo*H(&@4!7=jAV2QnOpwUr{S^%UQZ^DF7gk49=VFY(jz@O<-P5Y=Zv_+W-^f)_et~Lgqx0iz3ec$XY2r9Zl1ajIVg)|fa z0&_DFY1+5l%iRF!|Ku_VFa-ZK3~;d>yJ(J!sl-!j-8yj$dxQ*{X0_H9m z(7Ykqf8ntW7vn*WuM`?C$+suia>?sTfZz2d6wEZaM4}fPt6wmgzeVQ5 zrY`ll!sKO-NlC`H_ta5^eRw`BaSe*yQ`Cp{LH0%MGF_%l(aK-=pVd8c2+p6=ViIvY z-q}`+5EDK?!2>Mh6e9!ZPNR2ibh-G=G|{pvL;ZBJ4Nl5HmK4q+P*((tCz z;))7g)W+5s&b7ti3^b?dYR#i2bbkDEw-2hsbJxEYeJM%2G~gC-hW4g;mc2+wv;#P1 z5YghN)D5O7uy8NcB}tibaXymdrFM${T=E;OpPUqw1ts8X1FHo7WqHG-1(EzT$ zH0z9YNyXZo4Np*>c8m`s^F2e3nr~-m0at_jW zXP>CMnPVxKCmx4I(`YzOEHR0P$nq>sP{nN_1aQo@vK#YT!TTG*O)N$Ds0qX%hQb3e zRP*2EulTlhSHMCi)A@)cOkAYsG-HFx4k|5srHz|WvPOk)*kGxqoLdWAdx(de4+3vK zv`Ep!NTU>QzAFBc*J>i8ugcrHX8mAM)dl|v{EU5KQ8ff(R(v_#FORd4W_M+3pw;ut z<3eyISdA`8?Wi5ImGCyNf`mAIPmfwJ6WL=U>8dx;@<| z-*mMMV#xp4k(9JbMVY4Iyz4#vhr%T1pGG~6|5{@ClVJ@B+XUZaLHFkbrtDN6#b;Pozs$(S zOo~tBQF%CST1v90DpEtYq_Zb?V>mtymr=9d1B}p*9 z$Tk}1Y8LU15Mhazg}#bClFr5`a=!CZ>vg*lD7y37e7gSB+G>IGO4tAq9z2vd@Lsrn za;eLC{g;t{xN(`|S#2mjz_Rner?5LGtqE7}2)&aOGW9(YR`mZ|79Bu@Cpfr0D5c4cgA3Hzj@ZvPdC-SO7xpB42wqC z#5TQxulg%mJ>+mwIk602j6k7RyJ0WaR*5qj6{5(BM$>+TK*`@TER9I$iv1b zGk>LGQ*^qk#sA73I{X^M3G?4L>JVn;z^!mi>r>41`%GGkj{!5)4a60C-wnSCe=cxq zJSa7-y%4~lu|M8i23#8zTu76zy2|%l?#_2yT;_T(P)P2%#_Ay5Ikc_)ZHe|K8(YM! zgn|gJFVE(lI%M_yLqS8FSy&}}(qU%iB%^HXYgwBf8p;Teb#;|zZ90{X zU%Qq+R2}e^c)na?@a$T&U|qGf=H6Rx5zw#$`cAEaYTI4P}4 zZFSjB1&ObD>D^vhZK?cR=A*#HjuTAP&>8Y{TfS>RY{3^Tw$=8E)2rxrT6!nFl7j4s zWMgrQ!fZGFE{fbj%jvP)$w%*?++g(f$c+wE##8hNKP%d2xY>ndBzi>JGae-{Qp$ZI zNaU*ymrYW}6Xk7D#liOu++gAA-*71J6s&fx51gJ{3e)&*r-&}Md~6n3RQ%k*jVsnx z#~yVD!uJ~4ZS0y*%l{hZNa%XgfL1ltc=*(^Wa-U^vg1zCJ#JC#$T)D=EO)5Frn>r6K+3G zPW!1^Zz0woPBIU0M*P|0{M`X@WrWPZetpu>@K$F@iXaE$&IFU1NJ<3y=3?#;1NkEZ zA#zgCePVA7XmBPIK@@tqW0|D6M8q9+>1Ui4`Y%iz zD`MhlY!dGFm!gR@HO|TPxBZ*O*0?!0`Qv|wl^zhPVmASB{e|EQeltB;az^v9vn7&!QD10Z>HqbjNt1JnDnVC9heWptDDpbRVCh z_R>mr&G6a<@t}L*2mEHEd4buU)-C<{$4Y0R>*7%Op7J4@3$Piw;!KK`xb;XSPL2{T zQ3J*h&VRm>2C9*d6(AD%LX+^ct5Ur*&t?C+rNt7kOC71#t&H>zTkSP+Wuhqa_8GJ zYo1@z5wWVgW^?Yh^{(NXqz3KGO|9*d+#1+ton{M!0JAjyio03am1UcP@vU<<&%%pM(VEuKzLKvZEbQQZf}Ov zOuQ7Nz<}}xo@6^DhvoD(#Y-+C_ILz)KKjXU>xR*^&Z?fk+T6Zti?-GJY+0EGdKbVk zq;vwU9t-n(usOc3G*JN7jPlyCybrmY2U`+4KL7$k;L#znoQUWNqBP*|-wL1q@d}@v z{r)0v8lsn%PQChllp^BJb;DaP14itQZn>OR$!=@?g;YjBiNznu(3H}~O z9**|kuMdRx-)Z?*9AH=cyG#Dn4v2RAS1bOj75~2-l3ile5fns3>OX9>?T!%T6cCCg zwkVwbuZ=cDg~%Pz<9V>H;4hWu(7n1TcUZFY@X*VOZ~ymeWP1Lc7AUI%MDzbc9DWs$ Y3)p)H(~=S`AwPd`PyTM!KhIwMFZl^|Qvd(} literal 0 HcmV?d00001 diff --git a/docs/images/diagrama_contexto_tecnico.drawio.png b/docs/images/diagrama_contexto_tecnico.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f0cf85dbb3039e2391e3f0d698cc6bc608985d GIT binary patch literal 18628 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

  • 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 literal 0 HcmV?d00001 diff --git a/docs/images/uiLevel2.png b/docs/images/uiLevel2.png new file mode 100644 index 0000000000000000000000000000000000000000..d12d34d09b87ad96466884b5148aa937dd8b0ed9 GIT binary patch literal 47550 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 literal 0 HcmV?d00001 diff --git a/docs/images/whiteLevel1.png b/docs/images/whiteLevel1.png new file mode 100644 index 0000000000000000000000000000000000000000..7563ab41b5c07809c571e06b4259a94c40592376 GIT binary patch literal 28069 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 literal 0 HcmV?d00001 diff --git a/docs/index.adoc b/docs/index.adoc index 468be5f..58bbabf 100644 --- a/docs/index.adoc +++ b/docs/index.adoc @@ -6,7 +6,7 @@ // configure EN settings for asciidoc include::src/config.adoc[] -= image:arc42-logo.png[arc42] Template += image:arc42-logo.png[arc42] Generador de preguntas :revnumber: 8.2 EN :revdate: January 2023 :revremark: (based upon AsciiDoc version) @@ -34,16 +34,6 @@ include::src/about-arc42.adoc[] // horizontal line *** -[role="arc42help"] -**** -[NOTE] -==== -This version of the template contains some help and explanations. -It is used for familiarization with arc42 and the understanding of the concepts. -For documentation of your own system you use better the _plain_ version. -==== -**** - // numbering from here on :numbered: diff --git a/docs/src/01_introduction_and_goals.adoc b/docs/src/01_introduction_and_goals.adoc index ddb2ae3..238da55 100644 --- a/docs/src/01_introduction_and_goals.adoc +++ b/docs/src/01_introduction_and_goals.adoc @@ -1,93 +1,52 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-introduction-and-goals]] -== Introduction and Goals +== Introducción y Objetivos (wiq_es04d) 🎇 -[role="arc42help"] -**** -Describes the relevant requirements and the driving forces that software architects and development team must consider. -These include - -* underlying business goals, -* essential features, -* essential functional requirements, -* quality goals for the architecture and -* relevant stakeholders and their expectations -**** - -=== Requirements Overview - -[role="arc42help"] -**** -.Contents -Short description of the functional requirements, driving forces, extract (or abstract) -of requirements. Link to (hopefully existing) requirements documents -(with version number and information where to find it). - -.Motivation -From the point of view of the end users a system is created or modified to -improve support of a business activity and/or improve the quality. - -.Form -Short textual description, probably in tabular use-case format. -If requirements documents exist this overview should refer to these documents. +El proyecto de wiq_es04d es un proyecto desarrollado en la asignatura Arquitectura del Software. Consiste en la creación de una aplicación web al estilo "Saber y Ganar". Es decir, es un juego de preguntas de cultura general. -Keep these excerpts as short as possible. Balance readability of this document with potential redundancy w.r.t to requirements documents. +Los desarrolladores de la aplicacion son por David Álvarez Díaz, Zohaib Akhtar Kausar, Sara Lamuño García, Yago Navajas González y Santiago López Laso. +La aplicación tendrá su base para las preguntas y las respuestas en Wikidata, la base de conocimiento editada en colaboración. -.Further Information -See https://docs.arc42.org/section-1/[Introduction and Goals] in the arc42 documentation. +=== Requisitos Funcionales 🛠️ **** +* Los usuarios se deberán loggearse en la página; esto servirá para tener registro de una serie de parámetros, como puede ser las veces que se ha jugado. +* Se podrán responder preguntas autogeneradas y se verá si han acertado o fallado, así como la respuesta correcta. +* Las preguntas deberán ser respondidas en un tiempo límite. +* Las preguntas seguirán la misma estructura: 1 pregunta correcta y 3 incorrectas, generadas automáticamente. +* Los usuarios podrán consultar datos sobre su cuentas, como pueden ser las veces que han jugado o el número de preguntas que han acertado o fallado. -=== Quality Goals -[role="arc42help"] **** -.Contents -The top three (max five) quality goals for the architecture whose fulfillment is of highest importance to the major stakeholders. -We really mean quality goals for the architecture. Don't confuse them with project goals. -They are not necessarily identical. - -Consider this overview of potential topics (based upon the ISO 25010 standard): - -image::01_2_iso-25010-topics-EN.drawio.png["Categories of Quality Requirements"] -.Motivation -You should know the quality goals of your most important stakeholders, since they will influence fundamental architectural decisions. -Make sure to be very concrete about these qualities, avoid buzzwords. -If you as an architect do not know how the quality of your work will be judged... +=== Atributos de Calidad 👑 -.Form -A table with quality goals and concrete scenarios, ordered by priorities -**** - -=== Stakeholders - -[role="arc42help"] -**** -.Contents -Explicit overview of stakeholders of the system, i.e. all person, roles or organizations that - -* should know the architecture -* have to be convinced of the architecture -* have to work with the architecture or with code -* need the documentation of the architecture for their work -* have to come up with decisions about the system or its development +[options="header",cols="1,2,2"] +|=== +| Prioridad | Objetivo | Descripción +| 1 | Usabilidad | Todos los usuarios deben poder usar la aplicación sin tener en cuenta sus limitaciones. +| 2 | Mantenibilidad | El código y documentación de la aplicación ha de estar conformado de tal forma que sea factible hacer cambios y ampliaciones en la aplicación. +| 3 | Eficiciencia | Los tiempos entre operaciones han de ser asumibles. +| 4 | Fiabilidad | Los datos usados en la aplicación deben ser los correctos. +| 5 | Privacidad | Los datos sensibles de los usuarios deben estar restringidos al mismo usuario. +|=== -.Motivation -You should know all parties involved in development of the system or affected by the system. -Otherwise, you may get nasty surprises later in the development process. -These stakeholders determine the extent and the level of detail of your work and its results. -.Form -Table with role names, person names, and their expectations with respect to the architecture and its documentation. -**** +=== Stakeholders 👨‍👩‍👦‍👦 [options="header",cols="1,2,2"] |=== |Role/Name|Contact|Expectations -| __ | __ | __ -| __ | __ | __ +| Equipo de Desarrollo | Yago Navajas Gonzalez -> UO287746@uniovi.es + +David Álvarez Díaz -> UO283196@uniovi.es + +Zohaib Akhtar Kausar -> UO291060@uniovi.es + +Sara Lamuño García -> UO283706@uniovi.es + +Santiago Lopez Laso -> UO277369@uniovi.es | Los estudiantes que llevarán a cabo el desarrollo de la aplicación. Serán los encargados de la arquitectura, la documentación y la codificación. +| Profesores | Jose Emilio Labra Gayo | Supervisores de los avances y encargados de evaluar la aplicación final y el desarrollo de la misma. +| Usuario | Jugador de la aplicación | Personas que puedan interactuar tanto con el registro de usuarios como con el juego en sí y pueda completar correctamente una partida. +| HappySw | Empresa responsable | Empresa contratada, cuyo trabajo sera el desarrollo del juego de la mano del equipo de desarrollo. +| RTVE | Empleador | Interesados en la creacion del juego e impulsores de su creacion. |=== diff --git a/docs/src/02_architecture_constraints.adoc b/docs/src/02_architecture_constraints.adoc index 226e501..dbedfc0 100644 --- a/docs/src/02_architecture_constraints.adoc +++ b/docs/src/02_architecture_constraints.adoc @@ -1,27 +1,27 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-architecture-constraints]] -== Architecture Constraints - - -[role="arc42help"] -**** -.Contents -Any requirement that constraints software architects in their freedom of design and implementation decisions or decision about the development process. These constraints sometimes go beyond individual systems and are valid for whole organizations and companies. - -.Motivation -Architects should know exactly where they are free in their design decisions and where they must adhere to constraints. -Constraints must always be dealt with; they may be negotiable, though. - -.Form -Simple tables of constraints with explanations. -If needed you can subdivide them into -technical constraints, organizational and political constraints and -conventions (e.g. programming or versioning guidelines, documentation or naming conventions) - - -.Further Information - -See https://docs.arc42.org/section-2/[Architecture Constraints] in the arc42 documentation. - -**** +== Restricciones de arquitectura ⛔ + + +=== Restricciones Técnicas 📛 +[options="header",cols="1,2"] +|=== +|Restricción|Descripción +|API Wikidata|El numero de consultas en un tiempo espcidfico es la mayor limitacion de la API, junto con la disponibilidad de los datos. Esto puede afectar a tiempos de carga, por ejemplo. +|Git|Conflictos al realizar trabajo por separado por parte de mas de um miembro sobre un mismo recurso. +|GitHub|La falta de experiencia puede conducir a problemas en la gestion del proyecto asi como en su despliegue y lo que ello conlleva. +|Integración continua/despliegue continuo (CI/CD)|Restricciones en la configuración de pipelines de CI/CD para automatizar las pruebas, compilaciones y despliegues de la aplicación en el servidor Docker, lo que podría afectar la velocidad y la frecuencia de las entregas de nuevas características o correcciones de errores. +|Maquina Virtual Azure|Esta plataforma impone limites a la cantidad de recursos que podemos usar con la licencia de estudiantes, por lo que debemos ir con cuidado de cuando tenemos la maquina encendida para no agotar el credito. +|=== + + +=== Resticciones organizacionales 🔗 +[options="header",cols="1,2"] +|=== +|Restricción | Descripción +|Horarios y Disponibilidad| Los diferentes compromisos personales y académicos de los miembros del grupo pueden dificultar la coordinación de horarios para reuniones y sesiones de trabajo en equipo. +|Expectativas y motivación| Los miembrosd del equipo tienen distintas expectativas sobre el trabajo y esto afecta a la dedicacion que realizan. +|Politicas de la Universidad|Las entregas de otra asignaturas se interponen en la realización del trabajo y puede derivar en una falta de tiempo para realizarlo. +|Diferencias en el nivel de habilidades técnicas|A pesar de no ser muy acusadas si que existen diferencias que pueden afectar en una distribucion igualitaria del trabajo. +|=== \ No newline at end of file diff --git a/docs/src/03_system_scope_and_context.adoc b/docs/src/03_system_scope_and_context.adoc index c528e90..05f4a75 100644 --- a/docs/src/03_system_scope_and_context.adoc +++ b/docs/src/03_system_scope_and_context.adoc @@ -1,75 +1,18 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-system-scope-and-context]] -== System Scope and Context +== Alcance del sistema y Contexto 💭 +=== Contexto de negocio 💰 +image::Diagrama de contexto de negocio.jpg["Diagrama de contexto de negocio"] +En esta tabla se muestra el contexto de negocio de la aplicación. Las entradas son los mensajes que van desde el agente externo hacia la aplicación, y las salidas son los mensajes que van desde la aplicación hacia al agente externo. +[options="header",cols="1,2,3"] +|=== +|Agente externo|Entradas|Salidas +|Usuario|Datos registro, datos login, respuesta a cada pregunta|Preguntas, histórico +|Wikidata|Items (elementos) de Wikidata|Petición a la API de Wikidata +|=== -[role="arc42help"] -**** -.Contents -System scope and context - as the name suggests - delimits your system (i.e. your scope) from all its communication partners -(neighboring systems and users, i.e. the context of your system). It thereby specifies the external interfaces. +=== Contexto técnico 🔧 -If necessary, differentiate the business context (domain specific inputs and outputs) from the technical context (channels, protocols, hardware). - -.Motivation -The domain interfaces and technical interfaces to communication partners are among your system's most critical aspects. Make sure that you completely understand them. - -.Form -Various options: - -* Context diagrams -* Lists of communication partners and their interfaces. - - -.Further Information - -See https://docs.arc42.org/section-3/[Context and Scope] in the arc42 documentation. - -**** - - -=== Business Context - -[role="arc42help"] -**** -.Contents -Specification of *all* communication partners (users, IT-systems, ...) with explanations of domain specific inputs and outputs or interfaces. -Optionally you can add domain specific formats or communication protocols. - -.Motivation -All stakeholders should understand which data are exchanged with the environment of the system. - -.Form -All kinds of diagrams that show the system as a black box and specify the domain interfaces to communication partners. - -Alternatively (or additionally) you can use a table. -The title of the table is the name of your system, the three columns contain the name of the communication partner, the inputs, and the outputs. - -**** - -**** - -**** - -=== Technical Context - -[role="arc42help"] -**** -.Contents -Technical interfaces (channels and transmission media) linking your system to its environment. In addition a mapping of domain specific input/output to the channels, i.e. an explanation which I/O uses which channel. - -.Motivation -Many stakeholders make architectural decision based on the technical interfaces between the system and its context. Especially infrastructure or hardware designers decide these technical interfaces. - -.Form -E.g. UML deployment diagram describing channels to neighboring systems, -together with a mapping table showing the relationships between channels and input/output. - -**** - -**** - -**** - -**** +image::Diagrama de contexto técnico.jpg["Diagrama de contexto técnico"] diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index 7bf03f7..d2319bf 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -1,32 +1,49 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-solution-strategy]] -== Solution Strategy - - -[role="arc42help"] -**** -.Contents -A short summary and explanation of the fundamental decisions and solution strategies, that shape system architecture. It includes - -* technology decisions -* decisions about the top-level decomposition of the system, e.g. usage of an architectural pattern or design pattern -* decisions on how to achieve key quality goals -* relevant organizational decisions, e.g. selecting a development process or delegating certain tasks to third parties. - -.Motivation -These decisions form the cornerstones for your architecture. They are the foundation for many other detailed decisions or implementation rules. - -.Form -Keep the explanations of such key decisions short. - -Motivate what was decided and why it was decided that way, -based upon problem statement, quality goals and key constraints. -Refer to details in the following sections. - - -.Further Information - -See https://docs.arc42.org/section-4/[Solution Strategy] in the arc42 documentation. - -**** +== Estrategia de Solución 📚 + +=== Decisiones tecnológicas 💻 + +[options="header",cols="1,2"] +|=== +|Aplicación|Breve explicación +|React / JS|Biblioteca de JavaScript que nos servirá para realizar las interfaces de usuario necesarias para el Front-End. Esto nos indica que el lenguaje principal usado en el proyecto es JavaScript. +|Microservicios|Se usaran microservicios diferentes para los diferentes componentes del proyecto como la generacion de preguntas o el registro de usuarios en el sistema. +|Azure|Para el alojamiemto de la pagina web se usara una maquina virtual Azure con el credito de estudiante proporcionado +|Docker +|Encargado de dividir el contenido del proyecto en diversos contenedores (en nuestro caso 4) y sea más fácil de manipular el contenido de dicho proyecto. +|GitHub Actions +|Nos servirá para el despliegue del proyecto, pero de forma automática en vez de desplegarlo todo a mano. Cabe a destacar que también están implementados +unos test para asegurar el correcto despliegue del proyecto. +|=== + +Decisiones de cómo llegar a las metas principales (En desarrollo): +[options="header",cols="1,2"] +|=== +| Decision | Como llegar +| Usabilidad | La aplicacion seguira los principios basicos de usabilidad y estos seran testeados en diferentes escenarios. +| Mantenibilidad | El sistema sera mantenible gracias a la mantenibilidad de sus subsistemas. +| Eficiciencia | Para que la aplicacion sea rapida se usaran la base de datos y no se tendran que generar datos en caliente que pueden perjudicar a los tiempo de carga. +| Fiabilidad | Todos los datos mostrados seran correctos y para esta comprobacion se usara la base de datos de Wikidata y sus entidades e ID's asociados. +| Privacidad | Los datos de los usuarios seran privados y no seran accesibles a ningun usuario. + +|=== + +=== Decisiones organizativas 👥 + +El equipo estara dividido en 2 grupos. Los equipos son de documentación y de desarrollo. Los miembros de los grupos podran ir cambiando de rol si el proyecto asi lo necesita. Esta es la distribucion inicial. + +[options="header",cols="1,2"] +|=== +|Equipo|Miembros +|Equipo documentación|Sara Lamuño García -> UO283706@uniovi.es + +Yago Navajas Gonzalez -> UO287746@uniovi.es +|Equipo desarrollo del proyecto|David Álvarez Díaz -> UO283196@uniovi.es + +Zohaib Akhtar Kausar -> UO291060@uniovi.es + +Santiago Lopez Laso -> UO277369@uniovi.es +|=== + +La realización de las actas de las reuniones diarias se le ha asignado la tarea a Sara Lamuño García. + +La división se ha realizado considerando la experiencia y los conocimientos previos de los integrantes del grupo. De esta manera, el trabajo se puede distribuir de manera realista y los integrantes podrán aportar de manera equitativa al proyecto. Todos los miembros comprenderán cómo funcionan las diferentes partes del proyecto; sin embargo, no todos tendrán las habilidades necesarias para realizar todas las tareas. Por lo tanto, esta es la forma más equilibrada de organizar al equipo. diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index df5c29c..013e9ba 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -3,210 +3,104 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-building-block-view]] -== Building Block View +== Vista de Bloque de Construcción (EN desarollo) 🗳️ +image::Building Block View.jpg["Building Block View"] -[role="arc42help"] -**** -.Content -The building block view shows the static decomposition of the system into building blocks (modules, components, subsystems, classes, interfaces, packages, libraries, frameworks, layers, partitions, tiers, functions, macros, operations, data structures, ...) as well as their dependencies (relationships, associations, ...) -This view is mandatory for every architecture documentation. -In analogy to a house this is the _floor plan_. +=== Sistema general de caja blanca 📏 -.Motivation -Maintain an overview of your source code by making its structure understandable through -abstraction. +Este diagrama del sistema general muestra una descripción del sistema con los componentes básicos. -This allows you to communicate with your stakeholder on an abstract level without disclosing implementation details. +image::Whitebox Overall System.jpg["Whitebox Overall System"] -.Form -The building block view is a hierarchical collection of black boxes and white boxes -(see figure below) and their descriptions. -image::05_building_blocks-EN.png["Hierarchy of building blocks"] -*Level 1* is the white box description of the overall system together with black -box descriptions of all contained building blocks. -*Level 2* zooms into some building blocks of level 1. -Thus it contains the white box description of selected building blocks of level 1, together with black box descriptions of their internal building blocks. +Bloques de Construcción Contenidos:: -*Level 3* zooms into selected building blocks of level 2, and so on. +* User Interface (Frontend) +* Logica de Negocio(Backend) -.Further Information +* Base datos -See https://docs.arc42.org/section-5/[Building Block View] in the arc42 documentation. +* API Preguntas -**** -=== Whitebox Overall System +Interfaces Importantes:: -[role="arc42help"] -**** -Here you describe the decomposition of the overall system using the following white box template. It contains - * an overview diagram - * a motivation for the decomposition - * black box descriptions of the contained building blocks. For these we offer you alternatives: +EN DESARROLLO. - ** use _one_ table for a short and pragmatic overview of all contained building blocks and their interfaces - ** use a list of black box descriptions of the building blocks according to the black box template (see below). - Depending on your choice of tool this list could be sub-chapters (in text files), sub-pages (in a Wiki) or nested elements (in a modeling tool). - - * (optional:) important interfaces, that are not explained in the black box templates of a building block, but are very important for understanding the white box. -Since there are so many ways to specify interfaces why do not provide a specific template for them. - In the worst case you have to specify and describe syntax, semantics, protocols, error handling, - restrictions, versions, qualities, necessary compatibilities and many things more. -In the best case you will get away with examples or simple signatures. - -**** - -_****_ - -Motivation:: - -__ - - -Contained Building Blocks:: -__ - -Important Interfaces:: -__ - -[role="arc42help"] -**** -Insert your explanations of black boxes from level 1: - -If you use tabular form you will only describe your black boxes with name and -responsibility according to the following schema: - -[cols="1,2" options="header"] +==== +[options="header",cols="1,2"] |=== -| **Name** | **Responsibility** -| __ | __ -| __ | __ +| UI | Descripción +| Proposito / Responsabilidad | La Interfaz de Usuario (UI) - Black Box 1 es responsable de proporcionar una interfaz interactiva y amigable para los usuarios finales. Sirve como el punto principal de interacción entre la aplicación y los usuarios, y facilita la experiencia general del usuario. +| Interface(s) | Interfaz de Entrada del Usuario: Acepta la entrada del usuario a través de varios controles, como botones, formularios y campos de entrada. +Interfaz de Visualización: Renderiza y muestra información al usuario, incluyendo datos, mensajes y elementos visuales. +| Caracteristicas de Calidad / Rendimiento | Capacidad de Respuesta: La UI debe responder de manera rápida a las interacciones del usuario para garantizar una experiencia fluida y eficiente. +Accesibilidad: Adhiere a los estándares de accesibilidad para proporcionar una experiencia inclusiva para los usuarios. |=== -If you use a list of black box descriptions then you fill in a separate black box template for every important building block . -Its headline is the name of the black box. -**** - - -==== - -[role="arc42help"] -**** -Here you describe -according the the following black box template: - -* Purpose/Responsibility -* Interface(s), when they are not extracted as separate paragraphs. This interfaces may include qualities and performance characteristics. -* (Optional) Quality-/Performance characteristics of the black box, e.g.availability, run time behavior, .... -* (Optional) directory/file location -* (Optional) Fulfilled requirements (if you need traceability to requirements). -* (Optional) Open issues/problems/risks - -**** - -__ +=== -__ +Su función principal es permitir el acceso a los usuarios a la aplicación , y guardar los resultados de estos. -_<(Optional) Quality/Performance Characteristics>_ -_<(Optional) Directory/File Location>_ -_<(Optional) Fulfilled Requirements>_ +==== +Su propósito es proporcionar preguntas de manera dinámica al usuario. -_<(optional) Open Issues/Problems/Risks>_ +EN DESARROLLO. +==== +Se encargará de gestionar toda la programación necesaria de cara a la lógica. +EN DESARROLLO. -==== - -__ - -==== - -__ - - -==== - -... - -==== - +==== +Dará almacenamiento al sistema de manera persistente y a los récords de los usuarios. +EN DESARROLLO. === Level 2 -[role="arc42help"] -**** -Here you can specify the inner structure of (some) building blocks from level 1 as white boxes. - -You have to decide which building blocks of your system are important enough to justify such a detailed description. -Please prefer relevance over completeness. Specify important, surprising, risky, complex or volatile building blocks. -Leave out normal, simple, boring or standardized parts of your system -**** +==== White Box __ -==== White Box __ +En desarollo. -[role="arc42help"] -**** -...describes the internal structure of _building block 1_. -**** +==== White Box __ -__ +En desarollo. -==== White Box __ +==== White Box __ -__ +En desarollo. -... +==== White Box __ -==== White Box __ +En desarollo. -__ - - - -=== Level 3 - -[role="arc42help"] -**** -Here you can specify the inner structure of (some) building blocks from level 2 as white boxes. - -When you need more detailed levels of your architecture please copy this -part of arc42 for additional levels. -**** +=== Level 3 En desarrollo. ==== White Box <_building block x.1_> -[role="arc42help"] -**** -Specifies the internal structure of _building block x.1_. -**** - - -__ +En desarollo. ==== White Box <_building block x.2_> -__ - +En desarollo. ==== White Box <_building block y.1_> -__ +En desarollo. diff --git a/docs/src/06_runtime_view.adoc b/docs/src/06_runtime_view.adoc index e10f375..316e097 100644 --- a/docs/src/06_runtime_view.adoc +++ b/docs/src/06_runtime_view.adoc @@ -1,65 +1,35 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-runtime-view]] -== Runtime View +== Vista de Ejecución 📽️ -[role="arc42help"] -**** -.Contents -The runtime view describes concrete behavior and interactions of the system’s building blocks in form of scenarios from the following areas: +=== Escenario de Ejecucion1️⃣ -* important use cases or features: how do building blocks execute them? -* interactions at critical external interfaces: how do building blocks cooperate with users and neighboring systems? -* operation and administration: launch, start-up, stop -* error and exception scenarios - -Remark: The main criterion for the choice of possible scenarios (sequences, workflows) is their *architectural relevance*. It is *not* important to describe a large number of scenarios. You should rather document a representative selection. - -.Motivation -You should understand how (instances of) building blocks of your system perform their job and communicate at runtime. -You will mainly capture scenarios in your documentation to communicate your architecture to stakeholders that are less willing or able to read and understand the static models (building block view, deployment view). - -.Form -There are many notations for describing scenarios, e.g. - -* numbered list of steps (in natural language) -* activity diagrams or flow charts -* sequence diagrams -* BPMN or EPCs (event process chains) -* state machines -* ... - - -.Further Information - -See https://docs.arc42.org/section-6/[Runtime View] in the arc42 documentation. +[plantuml,"Sequence diagram",png] -**** +image::Diagrama de secuencia plantuml.png["Diagrama de secuencia plantuml"] -=== +Diagrama de secuencia con plantuml (se contempla sólo el uso correcto de la aplicación) -* __ -* __ +=== Escenario de Ejecucion2️⃣ -It is possible to use a sequence diagram: +*** Diagrama de secuencia + ** Descripción: diagrama de los usos básicos en la aplicación, como inicio de sesión, empezar a jugar y contestar las preguntas. + ** Aspectos notables: + * El usuario tiene que estar autentificado en la aplicación para poder entrar al juego. + * Los usuarios estarán en una base de datos para recoger los datos de manera más sencilla. + * En el diagrama se pone la opción de respuesta correcta, pero si fuera incorrecta también se seguiría jugando. -[plantuml,"Sequence diagram",png] ----- -actor Alice -actor Bob -database Pod as "Bob's Pod" -Alice -> Bob: Authentication Request -Bob --> Alice: Authentication Response -Alice --> Pod: Store route -Alice -> Bob: Another authentication Request -Alice <-- Bob: another authentication Response ----- +image::Digrama de secuencia Juego de preguntas.jpg["Diagrama de secuencia"] -=== +=== Escenario de Ejecucion3️⃣ -=== ... +*** Diagrama de casos de uso: + ** Descripción: diagrama básico de los distintos casos de uso que hay en el proyecto + ** Aspectos notables: + * El caso de uso de iniciar sesión del usuario está relacionado con el caso de uso de autentificar sesión del sistema, ya que para que el usuario pueda iniciar sesión debe de estar autentificado. + * Lo mismo ocurre con el caso de uso de contestar preguntas del usuario con el caso de uso de verificar respuestas del sistema, ya que para que el usuario pueda contestar preguntas, el sistema primero debe de verificar si dicha respuesta es correcta o no para pasar a la siguiente pregunta. -=== +image::Diagrama de casos de uso para el juego de palabras.jpg["Diagrama de caso de uso"] diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 22b45c2..731d30e 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -3,92 +3,41 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-deployment-view]] -== Deployment View +== Vista de Despliegue 👀 -[role="arc42help"] -**** -.Content -The deployment view describes: - 1. technical infrastructure used to execute your system, with infrastructure elements like geographical locations, environments, computers, processors, channels and net topologies as well as other infrastructure elements and +=== Nivel de Infraestructura 1 ☝️ -2. mapping of (software) building blocks to that infrastructure elements. +EN DESARROLLO. -Often systems are executed in different environments, e.g. development environment, test environment, production environment. In such cases you should document all relevant environments. +==== Diagrama de Vista General 🎀 -Especially document a deployment view if your software is executed as distributed system with more than one computer, processor, server or container or when you design and construct your own hardware processors and chips. +EN DESARROLLO. -From a software perspective it is sufficient to capture only those elements of an infrastructure that are needed to show a deployment of your building blocks. Hardware architects can go beyond that and describe an infrastructure to any level of detail they need to capture. +==== Motivacion 🤩 -.Motivation -Software does not run without hardware. -This underlying infrastructure can and will influence a system and/or some -cross-cutting concepts. Therefore, there is a need to know the infrastructure. +1. Disponibilidad: Se busca una aplicación que sea capaz de prestar servicio de manera continuada, con resistencia a fallos. +2. Eficiencia: Se busca una aplicación que ofreza un rendimiento óptimo para la generación de preguntas desde dispositivos con pocas capacidades. +3. Cumplimiento de Requisitos Regulatorios: El uso de Wikidata como fuente de datos en nuestra aplicación está respaldado por la necesidad de cumplir con requisitos regulatorios y normativos específicos. Esta elección se basa en las siguientes consideraciones: + * Caracteristicas de Calidad y/o Rendimiento: + ** Rendimiento: Se busca que la aplicación tenga un rendimiento óptimo en dispositivos móviles y tablets. + ** Adaptabilidad: La aplicación tiene que ser adaptable en diferentes dispositivos para así poder garantizar su uso. -.Form -Maybe a highest level deployment diagram is already contained in section 3.2. as -technical context with your own infrastructure as ONE black box. In this section one can -zoom into this black box using additional deployment diagrams: -* UML offers deployment diagrams to express that view. Use it, probably with nested diagrams, -when your infrastructure is more complex. -* When your (hardware) stakeholders prefer other kinds of diagrams rather than a deployment diagram, let them use any kind that is able to show nodes and channels of the infrastructure. +EN DESARROLLO. -.Further Information +==== Mapeado de Bloques de Construccion a Infraestructura 📜 -See https://docs.arc42.org/section-7/[Deployment View] in the arc42 documentation. +EN DESARROLLO. -**** -=== Infrastructure Level 1 +=== Nivel de Infraestructura 2 ☝️ -[role="arc42help"] -**** -Describe (usually in a combination of diagrams, tables, and text): +EN DESARROLLO. -* distribution of a system to multiple locations, environments, computers, processors, .., as well as physical connections between them -* important justifications or motivations for this deployment structure -* quality and/or performance features of this infrastructure -* mapping of software artifacts to elements of this infrastructure -For multiple environments or alternative deployments please copy and adapt this section of arc42 for all relevant environments. -**** +==== Elemento 1 de insfraestructura -_****_ - -Motivation:: - -__ - -Quality and/or Performance Features:: - -__ - -Mapping of Building Blocks to Infrastructure:: -__ - - -=== Infrastructure Level 2 - -[role="arc42help"] -**** -Here you can include the internal structure of (some) infrastructure elements from level 1. - -Please copy the structure from level 1 for each selected element. -**** - -==== __ - -__ - -==== __ - -__ - -... - -==== __ - -__ +EN DESARROLLO. diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index 591ccf1..b4f1e2e 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -1,73 +1,58 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-concepts]] -== Cross-cutting Concepts +== Conceptos Transversales 🧭 +Estos conceptos todavía no han sido aprobados ni implementados, pero dan una idea general del proyecto. +=== Modelo de Dominio 🗺️ +Esta es una primera versión del modelo de dominio muy simple, para hacerse una idea como funcionará la aplicación. -[role="arc42help"] -**** -.Content -This section describes overall, principal regulations and solution ideas that are relevant in multiple parts (= cross-cutting) of your system. -Such concepts are often related to multiple building blocks. -They can include many different topics, such as +image::Diagrama de clases juego de preguntas.jpg["Modelo de dominio simple provisional"] -* models, especially domain models -* architecture or design patterns -* rules for using specific technology -* principal, often technical decisions of an overarching (= cross-cutting) nature -* implementation rules +=== Experiencia de Usuario 👨‍🦰 -.Motivation -Concepts form the basis for _conceptual integrity_ (consistency, homogeneity) of the architecture. -Thus, they are an important contribution to achieve inner qualities of your system. +La Experiencia de Usuario en nuestra aplicación es la impresión general que los usuarios tienen al interactuar con ella. Se trata de cómo se sienten y qué piensan cuando utilizan nuestra aplicación web. Esto incluye aspectos como la facilidad para registrarse o iniciar sesion o lo intiutivo que es la parte del juego de preguntas. -Some of these concepts cannot be assigned to individual building blocks, e.g. security or safety. +Para nuestra aplicacion, la Experiencia de Usuario significa entender profundamente las necesidades y expectativas de nuestros usuarios y diseñar cada aspecto de la interfaz para satisfacer esas necesidades de la manera más efectiva y agradable posible. Esto implica asegurarse de que la navegación sea intuitiva, que la información esté presentada de manera clara y accesible, que las acciones sean fáciles de realizar y que el sistema responda de manera rapida y confiable a las interacciones del usuario. +Nos esforzamos por crear una experiencia de usuario comoda y accesible, donde cada detalle esté cuidadosamente diseñado para brindar una experiencia fluida y satisfactoria. Nuestro objetivo es ofrecer un juego entretenido, a la par que funcional y educativo. -.Form -The form can be varied: -* concept papers with any kind of structure -* cross-cutting model excerpts or scenarios using notations of the architecture views -* sample implementations, especially for technical concepts -* reference to typical usage of standard frameworks (e.g. using Hibernate for object/relational mapping) +=== Arquitectura y Patrones de Diseño 📒 -.Structure -A potential (but not mandatory) structure for this section could be: +En Desarrollo. -* Domain concepts -* User Experience concepts (UX) -* Safety and security concepts -* Architecture and design patterns -* "Under-the-hood" -* development concepts -* operational concepts +=== Desarrollo ⚙️ -Note: it might be difficult to assign individual concepts to one specific topic -on this list. +En el desarrollo de nuestra aplicación, nos centramos en varios aspectos para garantizar su eficacia y fiabilidad: -image::08-Crosscutting-Concepts-Structure-EN.png["Possible topics for crosscutting concepts"] +* Arquitectura escalable: Diseñamos la arquitectura de nuestra aplicación de manera que pueda crecer y adaptarse a medida que aumenta el número de usuarios y funciones. Esto nos permite mantener un rendimiento óptimo incluso en momentos de alta demanda. +* Mantenibilidad del código: Escribimos nuestro código de manera clara y organizada, siguiendo las mejores prácticas de desarrollo, para facilitar su mantenimiento y futuras actualizaciones. Esto incluye el uso de comentarios claros, la modularización del código y la adopción de patrones de diseño eficientes. -.Further Information +* Automatización de pruebas: Implementamos pruebas automatizadas para garantizar que nuestra aplicación funcione correctamente en diferentes situaciones y escenarios. Esto nos ayuda a identificar y corregir errores de manera oportuna, manteniendo la calidad del software. -See https://docs.arc42.org/section-8/[Concepts] in the arc42 documentation. -**** +* Optimización de rendimiento: Nos esforzamos por mejorar el rendimiento de nuestra aplicación, optimizando el tiempo de carga, la velocidad de respuesta y el consumo de recursos. Esto garantiza una experiencia fluida para los usuarios, incluso en dispositivos y conexiones de red menos potentes. +En resumen, en el desarrollo de nuestra aplicación nos esforzamos por crear una arquitectura escalable, un código mantenible, pruebas automatizadas y un rendimiento aceptable . Esto nos permite ofrecer una aplicación confiable y de alta calidad a nuestros usuarios. -=== __ +=== Operaciones 🔢 -__ +En las operaciones de nuestra aplicación, nos enfocamos en garantizar un entorno de producción estable y eficiente: +* Gestión de infraestructura: Administramos la infraestructura de nuestra aplicacion con servicios en la nube, para garantizar su disponibilidad y rendimiento óptimo. +* Gestión de versiones: Utilizamos herramientas de control de versiones para gestionar el ciclo de vida del software y asegurarnos de que las actualizaciones se implementen de manera controlada y sin interrupciones en el servicio. -=== __ +* Capacitación de los integrantes del grupo: Brindamos capacitación regular al personal de operaciones para garantizar que estén familiarizados con el proyecto lo que ayuda a mantener un entorno operativo eficiente. -__ +En resumen, en las operaciones de nuestra aplicación nos enfocamos en garantizar la disponibilidad y el rendimiento. Implementamos prácticas y herramientas que nos permiten monitorear, gestionar y mantener nuestra aplicación de manera efectiva y eficiente. -... +=== Seguridad 🔒 -=== __ +La seguridad en nuestra aplicación es una de las prioridades. Nos comprometemos a proteger la información personal y sensible de nuestros usuarios, así como a prevenir cualquier amenaza o vulnerabilidad que pueda comprometer su seguridad mientras utilizan nuestra aplicación web dentro de nuetras capacidades y conocimientos. -__ +Para ello, implementamos medidas de seguridad, como la encriptación de datos y la autenticación de usuarios mediante contraseñass. + +Queremos que nuestros usuarios se sientan seguros y protegidos mientras utilizan nuestra aplicación. \ No newline at end of file diff --git a/docs/src/09_architecture_decisions.adoc b/docs/src/09_architecture_decisions.adoc index 51e9aad..e7441bb 100644 --- a/docs/src/09_architecture_decisions.adoc +++ b/docs/src/09_architecture_decisions.adoc @@ -1,35 +1,7 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-design-decisions]] -== Architecture Decisions +== Decisiones de Arquitectura 🗣️ +Los enlaces proporcionan las decisiones de arquitectura via GitHub. - -[role="arc42help"] -**** -.Contents -Important, expensive, large scale or risky architecture decisions including rationales. -With "decisions" we mean selecting one alternative based on given criteria. - -Please use your judgement to decide whether an architectural decision should be documented -here in this central section or whether you better document it locally -(e.g. within the white box template of one building block). - -Avoid redundancy. -Refer to section 4, where you already captured the most important decisions of your architecture. - -.Motivation -Stakeholders of your system should be able to comprehend and retrace your decisions. - -.Form -Various options: - -* ADR (https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions[Documenting Architecture Decisions]) for every important decision -* List or table, ordered by importance and consequences or: -* more detailed in form of separate sections per decision - -.Further Information - -See https://docs.arc42.org/section-9/[Architecture Decisions] in the arc42 documentation. -There you will find links and examples about ADR. - -**** +* https://github.com/Arquisoft/wiq_es04c/wiki/ADR-1-‐-Diseño-de-BD-para-Generación-de-Preguntas[ADR 01] ‐ Diseño de BD para Generación de Preguntas \ No newline at end of file diff --git a/docs/src/10_quality_requirements.adoc b/docs/src/10_quality_requirements.adoc index 68475e8..57811a0 100644 --- a/docs/src/10_quality_requirements.adoc +++ b/docs/src/10_quality_requirements.adoc @@ -1,73 +1,42 @@ ifndef::imagesdir[:imagesdir: ../images] - [[section-quality-scenarios]] -== Quality Requirements - - -[role="arc42help"] -**** - -.Content -This section contains all quality requirements as quality tree with scenarios. The most important ones have already been described in section 1.2. (quality goals) - -Here you can also capture quality requirements with lesser priority, -which will not create high risks when they are not fully achieved. - -.Motivation -Since quality requirements will have a lot of influence on architectural -decisions you should know for every stakeholder what is really important to them, -concrete and measurable. - - -.Further Information - -See https://docs.arc42.org/section-10/[Quality Requirements] in the arc42 documentation. +== Requisitos de Calidad 🌟 -**** +=== Árbol de Calidad 🌳 -=== Quality Tree +El árbol de calidad se organiza con "calidad" como raíz, desglosándose en varias ramas principales, que representan categorías de calidad relevantes para el proyecto WIQ. Estas ramas incluyen: -[role="arc42help"] -**** -.Content -The quality tree (as defined in ATAM – Architecture Tradeoff Analysis Method) with quality/evaluation scenarios as leafs. +- *Usabilidad*: Se refiere a la facilidad con la que los usuarios pueden utilizar un sistema para alcanzar sus objetivos de manera eficiente y satisfactoria. La usabilidad implica interfaces intuitivas, accesibilidad y una experiencia de usuario agradable. +- *Rendimiento*: Evalúa la eficiencia del sistema en términos de velocidad de respuesta, consumo de recursos y escalabilidad. Un buen rendimiento asegura que el sistema puede manejar cargas de trabajo elevadas con tiempos de respuesta rápidos. +- *Seguridad*: Implica proteger la información y los sistemas contra accesos no autorizados, divulgación, alteración o destrucción, garantizando la confidencialidad, integridad y disponibilidad de los datos. +- *Fiabilidad*: La capacidad del sistema de funcionar correctamente y sin fallos durante un período determinado bajo condiciones específicas. La fiabilidad se centra en la consistencia del rendimiento y la prevención de fallos. +- *Mantenibilidad*: Se refiere a la facilidad con la que un sistema puede ser modificado para corregir fallos, mejorar su funcionamiento o adaptarse a un entorno cambiante. Una alta mantenibilidad facilita las actualizaciones y reduce los costos a largo plazo. +- *Portabilidad*: La capacidad de un sistema para ser utilizado en diferentes entornos operativos con mínimas modificaciones. La portabilidad permite que el software sea compatible con diversos dispositivos, sistemas operativos o navegadores web. -.Motivation -The tree structure with priorities provides an overview for a sometimes large number of quality requirements. +image::10_Arbol_de_calidad.jpg[Árbol de Calidad,align="center"] -.Form -The quality tree is a high-level overview of the quality goals and requirements: +=== Escenarios de Calidad 🕹️ -* tree-like refinement of the term "quality". Use "quality" or "usefulness" as a root -* a mind map with quality categories as main branches +==== Usabilidad -In any case the tree should include links to the scenarios of the following section. +- *Escenario*: Un nuevo usuario puede registrarse e iniciar a jugar en menos de 5 minutos después de su primer acceso al sitio web. La interfaz intuitiva y la guía de inicio rápido facilitan este proceso. +==== Rendimiento -**** +- *Escenario*: El sistema responde a las solicitudes de los usuarios en menos de 2 segundos bajo condiciones normales de carga, asegurando una experiencia de juego fluida. -=== Quality Scenarios +==== Seguridad -[role="arc42help"] -**** -.Contents -Concretization of (sometimes vague or implicit) quality requirements using (quality) scenarios. +- *Escenario*: Todos los datos personales de los usuarios están cifrados tanto en tránsito como en reposo, utilizando estándares de seguridad actuales para prevenir accesos no autorizados. -These scenarios describe what should happen when a stimulus arrives at the system. +==== Mantenibilidad -For architects, two kinds of scenarios are important: +- *Escenario*: El sistema permite la adición de nuevas funcionalidades (como tipos de preguntas o temáticas) sin necesidad de una reestructuración mayor, promoviendo una arquitectura modular. -* Usage scenarios (also called application scenarios or use case scenarios) describe the system’s runtime reaction to a certain stimulus. This also includes scenarios that describe the system’s efficiency or performance. Example: The system reacts to a user’s request within one second. -* Change scenarios describe a modification of the system or of its immediate environment. Example: Additional functionality is implemented or requirements for a quality attribute change. +==== Fiabilidad -.Motivation -Scenarios make quality requirements concrete and allow to -more easily measure or decide whether they are fulfilled. +- *Escenario*: En caso de fallo del sistema, este debe ser capaz de recuperarse y volver a estar operativo en menos de 5 minutos, garantizando una alta disponibilidad. -Especially when you want to assess your architecture using methods like -ATAM you need to describe your quality goals (from section 1.2) -more precisely down to a level of scenarios that can be discussed and evaluated. +==== Portabilidad -.Form -Tabular or free form text. -**** +- *Escenario*: La aplicación web es compatible con los navegadores web más utilizados (Chrome, Firefox, Safari, Edge) en sus últimas dos versiones principales, asegurando un amplio acceso. diff --git a/docs/src/11_technical_risks.adoc b/docs/src/11_technical_risks.adoc index dc5575f..3c9e320 100644 --- a/docs/src/11_technical_risks.adoc +++ b/docs/src/11_technical_risks.adoc @@ -1,25 +1,28 @@ -ifndef::imagesdir[:imagesdir: ../images] [[section-technical-risks]] -== Risks and Technical Debts - - -[role="arc42help"] -**** -.Contents -A list of identified technical risks or technical debts, ordered by priority - -.Motivation -“Risk management is project management for grown-ups” (Tim Lister, Atlantic Systems Guild.) - -This should be your motto for systematic detection and evaluation of risks and technical debts in the architecture, which will be needed by management stakeholders (e.g. project managers, product owners) as part of the overall risk analysis and measurement planning. - -.Form -List of risks and/or technical debts, probably including suggested measures to minimize, mitigate or avoid risks or reduce technical debts. - - -.Further Information - -See https://docs.arc42.org/section-11/[Risks and Technical Debt] in the arc42 documentation. - -**** +== Riesgos y Deuda Técnina 🚀 + +=== Riesgos +[options="header",cols="1,2"] +|====================== +| Riesgo | Descripción +| Tiempo de entrega | Estamos limitados por el plazo de entrega y también por el tiempo que dedicaremos a trabajar en otras asignaturas. +| Proyecto grande y equipo grande | La coordinación y comunicación en un equipo grande pueden ser desafiantes. +| Diseño inadecuado o enfoque incorrecto | La presencia de errores en etapas tempranas puede ser devastadora, ya que estas son cruciales. Un mal diseño detectado en etapas avanzadas podría ser irreparable, subrayando la importancia de una planificación y visión previsoras. +| Falta de familiaridad con las tecnologías | El equipo comienza con conocimiento limitado sobre las herramientas necesarias, lo que puede resultar en un uso subóptimo de estas. +| Errores de implementación | Errores no críticos en la lógica de negocio pueden permanecer ocultos por largo tiempo, afectando la calidad del sistema. +| Comunicación deficiente entre miembros | Las diferencias y desacuerdos pueden obstaculizar la colaboración efectiva, esencial para el éxito del equipo. +| Distribución desigual del trabajo | Una asignación desequilibrada puede sobrecargar a algunos miembros mientras deja a otros con menos responsabilidades. +| Reducción del tamaño del equipo | La salida inesperada de miembros puede desafiar la continuidad y el avance del proyecto, requiriendo adaptaciones rápidas y eficientes. +|Incumplimiento de normas|Si el proyecto no cumple con las regulaciones o estándares de seguridad pertinentes, podría enfrentar sanciones legales o multas. +|====================== + +=== Deuda Tecnica +[options="header",cols="1,2"] +|====================== +| Deuda Técnina | Descripción +| Uso del proyecto base creado por los profesores | Para no tener que realizar la creacion del proyecto hemos decidido usar el proyecto ya creado. Esto implica tener que revisar codigo ya creado y entender su funcionamiento, asi como ampliarlo con codigo propio, dando lugar a errores y perdidas de tiempo. Tambien requiere tener que aprender tecnologias nuevas y como usarlas. +| Uso de React | El uso del framework nos puede facilitar el desarrolo en algunas etapas, pero nos lo puede complicar al no estar familiarizados con esta tecnologia y todas sus características. +|Dependencias desactualizadas|Usar versiones obsoletas de bibliotecas, frameworks o plataformas puede resultar en vulnerabilidades de seguridad o limitaciones de rendimiento que deben abordarse en el futuro. +|Falta de pruebas automatizada| A medida que avanza el proyecto la falta de pruebas pude hacer que se acumule deuda tecnica al no poder realizarse cambios de manera rapida y eficaz sin, ya que no se podran probar de manera inmediata. +|====================== \ No newline at end of file diff --git a/docs/src/12_glossary.adoc b/docs/src/12_glossary.adoc index 192b235..b24e254 100644 --- a/docs/src/12_glossary.adoc +++ b/docs/src/12_glossary.adoc @@ -1,42 +1,45 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-glossary]] -== Glossary +== Glosario ⁉️ -[role="arc42help"] -**** -.Contents -The most important domain and technical terms that your stakeholders use when discussing the system. - -You can also see the glossary as source for translations if you work in multi-language teams. - -.Motivation -You should clearly define your terms, so that all stakeholders - -* have an identical understanding of these terms -* do not use synonyms and homonyms +[cols="e,2e" options="header"] +|=== +|Término +|Definicion -.Form +|React +|Biblioteca de Javascript que se encarga en la creación de interfaces de usuario de una manera fácil. Es eficiente y se puede incorporar +al código de una forma sencilla. -A table with columns and . +|Node.js +|Entorno que usa Javascript, donde destaca en la creación de servidores web. Su programación es dirigida por eventos, es multi-plataforma, open-source +y soporta la concurrencia. -Potentially more columns in case you need translations. +|Microservicio +|Enfoque arquitectónico, donde el software se va a dividir en servicios de tamaño pequeño, que estarán unidos por la intervención de API's +(en nuestro caso Wikidata). Son rápidos, sencillos a la hora de su desarrollo y autonómos cuando estos están en ejecución. +|API +|También llamado Application Programming Interface, es un intermediario que ayuda a las diferentes aplicaciones del proyecto a posibilitar la comunicación +entre ellas. Favorece a la eficiencia y agilidad del funcionamiento de dichas aplicaciones. -.Further Information +|MongoDB +|Es uno de los tantos tipos de bases de datos, como MariaDB. Usa NoSQL, soporta múltiples lenguajes de programación y también soporta su funcionamiento en gran variedad de sistemas operativos. Algo a tener en cuenta es que MongoDB realiza el guardado de datos de una forma distinta a la de las bases de datos de tipo relacional, con tablas de datos, este lo guarda en archivos BSON, que es un derivado de JSON. -See https://docs.arc42.org/section-12/[Glossary] in the arc42 documentation. +|BSON +|Conocido como Binary JSON, son los archivos que usa la base de datos MongoDB para almacenar los datos de una manera más ágil y sencilla que con las tablas. Una curiosidad de este tipo de archivo es que no tiene un tipo de MIME definido, mientras que JSON sí que lo tiene. -**** +|Mongoose +|Biblioteca que es encargada de crear una conexión con la base de datos MongoDB con el entorno de Node.js. Hace que el acceso y creación de los datos de MongoDB sea más fácil de realizar que con MongoDB en sí. -[cols="e,2e" options="header"] -|=== -|Term |Definition +|Docker +|Aplicación que realiza el despliegue de cualquier aplicación en formato de contenedores, similares a los contenedores que tienen los barcos. Es open-source y permite que el proceso de desplegar una aplicación sea bastante más fácil y ordenado. -| -| +|GitHub Actions +|Plataforma que ayuda a automatizar los proyectos, haciendo posible el despliegue de estos desde el mismo Github. Soporta una gran variedad de lenguajes de programación y sistemas operativos. -| -| +|MySql +|Es un sistema de gestión de bases de datos relacional de código abierto ampliamente utilizado que se destaca por su velocidad, confiabilidad y facilidad de uso. Permite a los usuarios almacenar, organizar y recuperar datos de manera eficiente a través de consultas estructuradas utilizando el lenguaje estándar de SQL. Es compatible con una variedad de plataformas y se utiliza en una amplia gama de aplicaciones. |=== From 2dd9a15cdb2f3985a2cdbf8161038fd50bd2f1ab Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Thu, 21 Mar 2024 17:02:11 +0100 Subject: [PATCH 16/37] actualizados los nombres --- docs/src/01_introduction_and_goals.adoc | 4 +--- docs/src/04_solution_strategy.adoc | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/src/01_introduction_and_goals.adoc b/docs/src/01_introduction_and_goals.adoc index 238da55..dc18463 100644 --- a/docs/src/01_introduction_and_goals.adoc +++ b/docs/src/01_introduction_and_goals.adoc @@ -5,7 +5,7 @@ ifndef::imagesdir[:imagesdir: ../images] El proyecto de wiq_es04d es un proyecto desarrollado en la asignatura Arquitectura del Software. Consiste en la creación de una aplicación web al estilo "Saber y Ganar". Es decir, es un juego de preguntas de cultura general. -Los desarrolladores de la aplicacion son por David Álvarez Díaz, Zohaib Akhtar Kausar, Sara Lamuño García, Yago Navajas González y Santiago López Laso. +Los desarrolladores de la aplicacion son por Zohaib Akhtar Kausar, Yago Navajas González y Santiago López Laso. La aplicación tendrá su base para las preguntas y las respuestas en Wikidata, la base de conocimiento editada en colaboración. @@ -41,9 +41,7 @@ La aplicación tendrá su base para las preguntas y las respuestas en Wikidata, |=== |Role/Name|Contact|Expectations | Equipo de Desarrollo | Yago Navajas Gonzalez -> UO287746@uniovi.es + -David Álvarez Díaz -> UO283196@uniovi.es + Zohaib Akhtar Kausar -> UO291060@uniovi.es + -Sara Lamuño García -> UO283706@uniovi.es + Santiago Lopez Laso -> UO277369@uniovi.es | Los estudiantes que llevarán a cabo el desarrollo de la aplicación. Serán los encargados de la arquitectura, la documentación y la codificación. | Profesores | Jose Emilio Labra Gayo | Supervisores de los avances y encargados de evaluar la aplicación final y el desarrollo de la misma. | Usuario | Jugador de la aplicación | Personas que puedan interactuar tanto con el registro de usuarios como con el juego en sí y pueda completar correctamente una partida. diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index d2319bf..f22661c 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -37,10 +37,8 @@ El equipo estara dividido en 2 grupos. Los equipos son de documentación y de de [options="header",cols="1,2"] |=== |Equipo|Miembros -|Equipo documentación|Sara Lamuño García -> UO283706@uniovi.es + -Yago Navajas Gonzalez -> UO287746@uniovi.es -|Equipo desarrollo del proyecto|David Álvarez Díaz -> UO283196@uniovi.es + -Zohaib Akhtar Kausar -> UO291060@uniovi.es + +|Equipo documentación| Yago Navajas Gonzalez -> UO287746@uniovi.es +|Equipo desarrollo del proyecto|Zohaib Akhtar Kausar -> UO291060@uniovi.es + Santiago Lopez Laso -> UO277369@uniovi.es |=== From 42710fd6129756c5dd42a5c933bc010e82641546 Mon Sep 17 00:00:00 2001 From: Santiago21112001 Date: Mon, 25 Mar 2024 10:59:27 +0100 Subject: [PATCH 17/37] =?UTF-8?q?unido=20generador=20de=20preguntas=20al?= =?UTF-8?q?=20resto=20de=20la=20aplicaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gatewayservice/gateway-service.js | 18 +++++++++++++ questionservice/question-service.js | 20 +++++++------- webapp/src/components/pages/Jugar.js | 40 +++++++++++++++++++--------- 3 files changed, 56 insertions(+), 22 deletions(-) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index 9a4f490..73e2d10 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -13,6 +13,7 @@ const port = 8000; const authServiceUrl = process.env.AUTH_SERVICE_URL || 'http://localhost:8002'; const userServiceUrl = process.env.USER_SERVICE_URL || 'http://localhost:8001'; +const generateServiceURL = process.env.GENERATE_SERVICE_URL || 'http://localhost:8003'; const historyServiceUrl = process.env.HISTORY_SERVICE_URL || 'http://localhost:8004'; app.use(cors()); @@ -47,6 +48,23 @@ app.post('/adduser', async (req, res) => { } }); +app.get('/getquestions', async(req,res)=> { + try{ + // Redirige la solicitud al servicio de generación de preguntas sin enviar un cuerpo de solicitud. + const response = await axios.post(`${generateServiceURL}/getquestions`); + + // Devuelve la respuesta del servicio de generación de preguntas al cliente original. + res.json(response.data); + + } catch(error) { + if (error.response) { + res.status(error.response.status).json({ error: error.response.data.error }); + } else { + res.status(500).json({ error: 'An unexpected error occurred' }); + } + } +}); + app.post('/savehistory', async (req, res) => { try{ const historyResponse = await axios.post(historyServiceUrl+'/savehistory', req.body); diff --git a/questionservice/question-service.js b/questionservice/question-service.js index 6215ff0..8cf4e32 100644 --- a/questionservice/question-service.js +++ b/questionservice/question-service.js @@ -14,7 +14,7 @@ const Question = require('./question-model'); async function generateQuestions() { const template = templates.capital_of; - const newQuestions = await WikiQuery.getQuestions(template, 10); + const newQuestions = await WikiQuery.getQuestions(template, 20); newQuestions.forEach(q => { console.log(q.question); console.log(q.answers); @@ -22,28 +22,28 @@ async function generateQuestions() { Question.insertMany(newQuestions); } -app.get('/getquestion', async (req, res) => { +app.get('/getquestions', async (req, res) => { try { // Realizar consulta de agregación para obtener una pregunta aleatoria - const randomQuestion = await Question.aggregate([ - { $sample: { size: 1 } } // Selecciona una pregunta aleatoria + const randomQuestions = await Question.aggregate([ + { $sample: { size: 5 } } // Selecciona una pregunta aleatoria ]); //const questionAndAnswer = await getQuestionTemplate(); // Obtenemos el json de pregunta y sus respuestas - console.log(randomQuestion); // Imprime questionAndAnswer en la consola + console.log(randomQuestions); // Imprime questionAndAnswer en la consola - res.json(randomQuestion); //Devolvemos a la gateway el json + res.json(randomQuestions); //Devolvemos a la gateway el json } catch (error) { console.log("Error getting question from database: " + error); console.log("Adding new questions to database..."); await generateQuestions(); console.log("Questions added. Getting random question..."); - const randomQuestion = await Question.aggregate([ - { $sample: { size: 1 } } // Selecciona una pregunta aleatoria + const randomQuestions = await Question.aggregate([ + { $sample: { size: 5 } } // Selecciona una pregunta aleatoria ]); - console.log("Random question selected: " + randomQuestion); // Imprime questionAndAnswer en la consola - res.json(randomQuestion); //Devolvemos a la gateway el json + console.log("Random questions selected: " + randomQuestions); // Imprime questionAndAnswer en la consola + res.json(randomQuestions); //Devolvemos a la gateway el json } }); diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index 10d284a..87eb80b 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -6,7 +6,7 @@ import axios from 'axios'; // Configuración inicial y datos const INITIAL_TIMER = 20; -const questions = [ +let questions = [ { question: "¿Cuál es la capital de Francia?", answers: [ @@ -55,6 +55,8 @@ const questions = [ // Resto de las preguntas... ]; + + function calculateColor(percent) { const green = Math.min(255, Math.floor(255 * (percent / 100))); const red = Math.min(255, Math.floor(255 * ((100 - percent) / 100))); @@ -67,17 +69,31 @@ function Jugar() { const [timer, setTimer] = useState(INITIAL_TIMER); const [quizFinished, setQuizFinished] = useState(false); const [selectedAnswerIndex, setSelectedAnswerIndex] = useState(null); + const [questionsLoaded, setQuestionsLoaded] = useState(false); const navigate = useNavigate(); const { isLoggedIn, username } = useContext(AuthContext); + const getQuestions = async() => { + try { + console.log("Requesting random questions to " + apiEndpoint); + const response = await axios.get(`${apiEndpoint}/getquestions`); + questions = response; + setQuestionsLoaded(true); + } catch (error) { + console.error('Error getting questions', error); + } + } + useEffect(() => { if (!isLoggedIn) { navigate('/login'); + } else { + getQuestions(); } }, [isLoggedIn, navigate]); useEffect(() => { - if (!quizFinished) { + if (!quizFinished && questionsLoaded) { const countdown = setInterval(() => { setTimer((prevTimer) => { if (prevTimer === 1) { @@ -89,7 +105,7 @@ function Jugar() { }, 1000); return () => clearInterval(countdown); } - }, [quizFinished, currentQuestionIndex, timer]); + }, [quizFinished, questionsLoaded, currentQuestionIndex, timer]); const handleAnswerSelect = (index) => { setSelectedAnswerIndex(index); @@ -113,19 +129,19 @@ function Jugar() { } else { //Finaliza el quiz setQuizFinished(true); - + //Guardamos en el historial los datos de la partida - axios.post(`${apiEndpoint}/savehistory`,{ + axios.post(`${apiEndpoint}/savehistory`, { username: username, NumPreguntasJugadas: questions.length, // Número total de preguntas jugadas (la longitud de la matriz de preguntas) NumAcertadas: correctAnswers, // Número de preguntas respondidas correctamente }) - .then(response => { - console.log(response.data); // Mensaje de confirmación del servidor - }) - .catch(error => { - console.error('Error al guardar el historial:', error); - }); + .then(response => { + console.log(response.data); // Mensaje de confirmación del servidor + }) + .catch(error => { + console.error('Error al guardar el historial:', error); + }); } }; const videoSource = quizFinished ? "/videos/celebracion.mp4" : "/videos/question.mp4"; @@ -173,7 +189,7 @@ function Jugar() { ))}
      - +
      )} From 17e8d66817a7587573f60477e6a2e0f9a30006b3 Mon Sep 17 00:00:00 2001 From: Zohaib Akhtar Kausar Date: Mon, 25 Mar 2024 11:33:19 +0100 Subject: [PATCH 18/37] Arreglo --- gatewayservice/gateway-service.js | 2 +- questionservice/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index 73e2d10..de82312 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -51,7 +51,7 @@ app.post('/adduser', async (req, res) => { app.get('/getquestions', async(req,res)=> { try{ // Redirige la solicitud al servicio de generación de preguntas sin enviar un cuerpo de solicitud. - const response = await axios.post(`${generateServiceURL}/getquestions`); + const response = await axios.get(`${generateServiceURL}/getquestions`); // Devuelve la respuesta del servicio de generación de preguntas al cliente original. res.json(response.data); diff --git a/questionservice/package.json b/questionservice/package.json index a4b10fe..e43bd41 100644 --- a/questionservice/package.json +++ b/questionservice/package.json @@ -4,7 +4,7 @@ "description": "Microservicio de generar preguntas", "main": "service.js", "scripts": { - "start": "node question-Service.js", + "start": "node question-service.js", "test": "jest" }, "repository": { From 49cbe16edf5effa392e86a9609142a71ae11f055 Mon Sep 17 00:00:00 2001 From: Zohaib Akhtar Kausar Date: Mon, 25 Mar 2024 11:57:54 +0100 Subject: [PATCH 19/37] Arreglo jugar.js --- webapp/src/components/pages/Jugar.js | 61 ++++++---------------------- 1 file changed, 12 insertions(+), 49 deletions(-) diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index 87eb80b..e91160a 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -6,54 +6,7 @@ import axios from 'axios'; // Configuración inicial y datos const INITIAL_TIMER = 20; -let questions = [ - { - question: "¿Cuál es la capital de Francia?", - answers: [ - { answer: "París", correct: true }, - { answer: "Londres", correct: false }, - { answer: "Madrid", correct: false }, - { answer: "Berlín", correct: false }, - ], - }, - { - question: "¿Cuántos continentes hay en el mundo?", - answers: [ - { answer: "5", correct: false }, - { answer: "6", correct: false }, - { answer: "7", correct: true }, - { answer: "8", correct: false }, - ], - }, - { - question: "¿Cuál es el río más largo del mundo?", - answers: [ - { answer: "Amazonas", correct: true }, - { answer: "Nilo", correct: false }, - { answer: "Yangtsé", correct: false }, - { answer: "Misisipi", correct: false }, - ], - }, - { - question: "¿Cuál es el país más grande del mundo?", - answers: [ - { answer: "China", correct: false }, - { answer: "Estados Unidos", correct: false }, - { answer: "Canadá", correct: false }, - { answer: "Rusia", correct: true }, - ], - }, - { - question: "¿En qué año llegó el hombre a la Luna?", - answers: [ - { answer: "1965", correct: false }, - { answer: "1969", correct: true }, - { answer: "1971", correct: false }, - { answer: "1973", correct: false }, - ], - }, - // Resto de las preguntas... -]; + @@ -72,12 +25,22 @@ function Jugar() { const [questionsLoaded, setQuestionsLoaded] = useState(false); const navigate = useNavigate(); const { isLoggedIn, username } = useContext(AuthContext); + const [questions, setQuestions] = useState([{ + question: "¿Cuál es la capital de Francia?", + answers: [ + { answer: "París", correct: true }, + { answer: "Londres", correct: false }, + { answer: "Madrid", correct: false }, + { answer: "Berlín", correct: false }, + ] + }]); const getQuestions = async() => { try { console.log("Requesting random questions to " + apiEndpoint); const response = await axios.get(`${apiEndpoint}/getquestions`); - questions = response; + console.log(response); + setQuestions(response.data); setQuestionsLoaded(true); } catch (error) { console.error('Error getting questions', error); From 83383982247aa554bbade417518d8faebe226aca Mon Sep 17 00:00:00 2001 From: yagonavajas <145135281+yagonavajas@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:19:09 +0100 Subject: [PATCH 20/37] =?UTF-8?q?a=C3=B1adidos=20services=20a=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c926570..3d71767 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,9 @@ jobs: node-version: 20 - run: npm --prefix users/authservice ci - run: npm --prefix users/userservice ci + - run: npm --prefix users/historyservice ci - run: npm --prefix gatewayservice ci + - run: npm --prefix questionservice ci - run: npm --prefix webapp ci - run: npm --prefix users/authservice test -- --coverage - run: npm --prefix users/userservice test -- --coverage @@ -27,4 +29,4 @@ jobs: uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From dc4cfacd1bcd4daaf741e5b04de0fd7d1679d021 Mon Sep 17 00:00:00 2001 From: yagonavajas <145135281+yagonavajas@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:24:43 +0100 Subject: [PATCH 21/37] =?UTF-8?q?a=C3=B1adidos=20servicios=20al=20release.?= =?UTF-8?q?yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 40 ++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8a1aef8..03fed09 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -94,6 +94,23 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io workdir: users/userservice + docker-push-historyservice: + name: Push history service Docker Image to GitHub Packages + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + needs: [e2e-tests] + steps: + - uses: actions/checkout@v4 + - name: Publish to Registry + uses: elgohr/Publish-Docker-Github-Action@v5 + with: + name: arquisoft/wiq_es04d/historyservice + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + workdir: users/historyservice docker-push-gatewayservice: name: Push gateway service Docker Image to GitHub Packages runs-on: ubuntu-latest @@ -115,10 +132,31 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io workdir: gatewayservice + docker-push-questionservice: + name: Push question service Docker Image to GitHub Packages + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + needs: [e2e-tests] + steps: + - uses: actions/checkout@v4 + - name: Update OpenAPI configuration + run: | + DEPLOY_HOST=${{ secrets.DEPLOY_HOST }} + sed -i "s/SOMEIP/${DEPLOY_HOST}/g" gatewayservice/openapi.yaml + - name: Publish to Registry + uses: elgohr/Publish-Docker-Github-Action@v5 + with: + name: arquisoft/wiq_es04d/questionservice + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + workdir: questionservice deploy: name: Deploy over SSH runs-on: ubuntu-latest - needs: [docker-push-userservice,docker-push-authservice,docker-push-gatewayservice,docker-push-webapp] + needs: [docker-push-userservice,docker-push-authservice,docker-push-gatewayservice,docker-push-historyservice,docker-push-webapp,docker-push-questionservice] steps: - name: Deploy over SSH uses: fifsky/ssh-action@master From 8c22e090b632635bfa8b7f6df1296151ab6bb6bb Mon Sep 17 00:00:00 2001 From: yagonavajas <145135281+yagonavajas@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:25:41 +0100 Subject: [PATCH 22/37] Update release.yml --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 03fed09..2568676 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,8 +14,10 @@ jobs: node-version: 20 - run: npm --prefix users/authservice ci - run: npm --prefix users/userservice ci + - run: npm --prefix users/historyservice ci - run: npm --prefix gatewayservice ci - run: npm --prefix webapp ci + - run: npm --prefix questionservice ci - run: npm --prefix users/authservice test -- --coverage - run: npm --prefix users/userservice test -- --coverage - run: npm --prefix questionservice test -- --coverage From 2317287fb2bc326149dbd1fadf0ca0b5ed537125 Mon Sep 17 00:00:00 2001 From: yagonavajas <145135281+yagonavajas@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:30:55 +0100 Subject: [PATCH 23/37] Update release.yml --- .github/workflows/release.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2568676..f04c212 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -113,8 +113,8 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io workdir: users/historyservice - docker-push-gatewayservice: - name: Push gateway service Docker Image to GitHub Packages + docker-push-questionservice: + name: Push question service Docker Image to GitHub Packages runs-on: ubuntu-latest permissions: contents: read @@ -122,20 +122,16 @@ jobs: needs: [e2e-tests] steps: - uses: actions/checkout@v4 - - name: Update OpenAPI configuration - run: | - DEPLOY_HOST=${{ secrets.DEPLOY_HOST }} - sed -i "s/SOMEIP/${DEPLOY_HOST}/g" gatewayservice/openapi.yaml - name: Publish to Registry uses: elgohr/Publish-Docker-Github-Action@v5 with: - name: arquisoft/wiq_es04d/gatewayservice + name: arquisoft/wiq_es04d/questionservice username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io - workdir: gatewayservice - docker-push-questionservice: - name: Push question service Docker Image to GitHub Packages + workdir: questionservice + docker-push-gatewayservice: + name: Push gateway service Docker Image to GitHub Packages runs-on: ubuntu-latest permissions: contents: read @@ -150,11 +146,11 @@ jobs: - name: Publish to Registry uses: elgohr/Publish-Docker-Github-Action@v5 with: - name: arquisoft/wiq_es04d/questionservice + name: arquisoft/wiq_es04d/gatewayservice username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io - workdir: questionservice + workdir: gatewayservice deploy: name: Deploy over SSH runs-on: ubuntu-latest From bbe4b7401831efda73c25bb31c262b615ec72f94 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Mon, 25 Mar 2024 12:34:42 +0100 Subject: [PATCH 24/37] cambio menor --- questionservice/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/questionservice/package.json b/questionservice/package.json index a4b10fe..e43bd41 100644 --- a/questionservice/package.json +++ b/questionservice/package.json @@ -4,7 +4,7 @@ "description": "Microservicio de generar preguntas", "main": "service.js", "scripts": { - "start": "node question-Service.js", + "start": "node question-service.js", "test": "jest" }, "repository": { From 0fc94aba3c79bf4a5cea1c027842597b1a7a7ea7 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Mon, 25 Mar 2024 12:37:21 +0100 Subject: [PATCH 25/37] cambios en los yml --- .github/workflows/build.yml | 2 ++ .github/workflows/release.yml | 40 +++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c926570..0c2097f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,9 @@ jobs: node-version: 20 - run: npm --prefix users/authservice ci - run: npm --prefix users/userservice ci + - run: npm --prefix users/historyservice ci - run: npm --prefix gatewayservice ci + - run: npm --prefix questionservice ci - run: npm --prefix webapp ci - run: npm --prefix users/authservice test -- --coverage - run: npm --prefix users/userservice test -- --coverage diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8a1aef8..7c588ad 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,8 +14,10 @@ jobs: node-version: 20 - run: npm --prefix users/authservice ci - run: npm --prefix users/userservice ci + - run: npm --prefix users/historyservice ci - run: npm --prefix gatewayservice ci - run: npm --prefix webapp ci + - run: npm --prefix questionservice ci - run: npm --prefix users/authservice test -- --coverage - run: npm --prefix users/userservice test -- --coverage - run: npm --prefix questionservice test -- --coverage @@ -94,6 +96,40 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io workdir: users/userservice + docker-push-historyservice: + name: Push history service Docker Image to GitHub Packages + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + needs: [e2e-tests] + steps: + - uses: actions/checkout@v4 + - name: Publish to Registry + uses: elgohr/Publish-Docker-Github-Action@v5 + with: + name: arquisoft/wiq_es04d/historyservice + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + workdir: users/historyservice + docker-push-questionservice: + name: Push question service Docker Image to GitHub Packages + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + needs: [e2e-tests] + steps: + - uses: actions/checkout@v4 + - name: Publish to Registry + uses: elgohr/Publish-Docker-Github-Action@v5 + with: + name: arquisoft/wiq_es04d/questionservice + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + workdir: questionservice docker-push-gatewayservice: name: Push gateway service Docker Image to GitHub Packages runs-on: ubuntu-latest @@ -118,7 +154,7 @@ jobs: deploy: name: Deploy over SSH runs-on: ubuntu-latest - needs: [docker-push-userservice,docker-push-authservice,docker-push-gatewayservice,docker-push-webapp] + needs: [docker-push-userservice,docker-push-authservice,docker-push-gatewayservice,docker-push-historyservice,docker-push-webapp,docker-push-questionservice] steps: - name: Deploy over SSH uses: fifsky/ssh-action@master @@ -130,4 +166,4 @@ jobs: wget https://raw.githubusercontent.com/arquisoft/wiq_es04d/master/docker-compose.yml -O docker-compose.yml wget https://raw.githubusercontent.com/arquisoft/wiq_es04d/master/.env -O .env docker compose --profile prod down - docker compose --profile prod up -d --pull always + docker compose --profile prod up -d --pull always \ No newline at end of file From 4adba80626c63660bd5795d728ccfb1c4ff40080 Mon Sep 17 00:00:00 2001 From: Santiago21112001 <79706368+Santiago21112001@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:54:25 +0100 Subject: [PATCH 26/37] Update Jugar.js --- webapp/src/components/pages/Jugar.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index e91160a..86db3fc 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -53,7 +53,7 @@ function Jugar() { } else { getQuestions(); } - }, [isLoggedIn, navigate]); + }, [isLoggedIn, navigate, getQuestions]); useEffect(() => { if (!quizFinished && questionsLoaded) { @@ -68,7 +68,7 @@ function Jugar() { }, 1000); return () => clearInterval(countdown); } - }, [quizFinished, questionsLoaded, currentQuestionIndex, timer]); + }, [quizFinished, questionsLoaded, currentQuestionIndex, timer, handleNextQuestion]); const handleAnswerSelect = (index) => { setSelectedAnswerIndex(index); From d06180669079046b198bc9bb34602541adf29de7 Mon Sep 17 00:00:00 2001 From: Zohaib Akhtar Kausar Date: Mon, 25 Mar 2024 13:04:07 +0100 Subject: [PATCH 27/37] Arreglo test --- webapp/src/components/pages/Jugar.js | 59 ++++++++++++++-------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index 86db3fc..8ccb8d6 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -54,34 +54,12 @@ function Jugar() { getQuestions(); } }, [isLoggedIn, navigate, getQuestions]); - - useEffect(() => { - if (!quizFinished && questionsLoaded) { - const countdown = setInterval(() => { - setTimer((prevTimer) => { - if (prevTimer === 1) { - handleNextQuestion(true); // Agrega un indicador de que el cambio fue por tiempo - return INITIAL_TIMER; - } - return prevTimer - 1; - }); - }, 1000); - return () => clearInterval(countdown); - } - }, [quizFinished, questionsLoaded, currentQuestionIndex, timer, handleNextQuestion]); - - const handleAnswerSelect = (index) => { - setSelectedAnswerIndex(index); - }; - - const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; - const handleNextQuestion = (timeExpired = false) => { setTimer(INITIAL_TIMER); if (selectedAnswerIndex !== null || timeExpired) { const isCorrect = - selectedAnswerIndex !== null && - questions[currentQuestionIndex].answers[selectedAnswerIndex]?.correct; + selectedAnswerIndex !== null && + questions[currentQuestionIndex].answers[selectedAnswerIndex]?.correct; if (isCorrect) { setCorrectAnswers(correctAnswers + 1); } @@ -99,14 +77,37 @@ function Jugar() { NumPreguntasJugadas: questions.length, // Número total de preguntas jugadas (la longitud de la matriz de preguntas) NumAcertadas: correctAnswers, // Número de preguntas respondidas correctamente }) - .then(response => { - console.log(response.data); // Mensaje de confirmación del servidor - }) - .catch(error => { - console.error('Error al guardar el historial:', error); + .then(response => { + console.log(response.data); // Mensaje de confirmación del servidor + }) + .catch(error => { + console.error('Error al guardar el historial:', error); + }); + } + }; + + useEffect(() => { + if (!quizFinished && questionsLoaded) { + const countdown = setInterval(() => { + setTimer((prevTimer) => { + if (prevTimer === 1) { + handleNextQuestion(true); // Agrega un indicador de que el cambio fue por tiempo + return INITIAL_TIMER; + } + return prevTimer - 1; }); + }, 1000); + return () => clearInterval(countdown); } + }, [quizFinished, questionsLoaded, currentQuestionIndex, timer, handleNextQuestion]); + + const handleAnswerSelect = (index) => { + setSelectedAnswerIndex(index); }; + + const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; + + const videoSource = quizFinished ? "/videos/celebracion.mp4" : "/videos/question.mp4"; // Renderizado del componente return ( From 8a80d8ec036dc3eedd5351cd0511f15c5aa59519 Mon Sep 17 00:00:00 2001 From: Zohaib Akhtar Kausar Date: Mon, 25 Mar 2024 13:27:19 +0100 Subject: [PATCH 28/37] Arreglo test para despliegue --- webapp/e2e/steps/register-form.steps.js | 2 +- webapp/src/components/pages/Jugar.js | 29 +++++++++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/webapp/e2e/steps/register-form.steps.js b/webapp/e2e/steps/register-form.steps.js index b49a623..ba97d15 100644 --- a/webapp/e2e/steps/register-form.steps.js +++ b/webapp/e2e/steps/register-form.steps.js @@ -26,7 +26,7 @@ defineFeature(feature, test => { let password; given('An unregistered user', async () => { - username = "pablo" + username = "ProbandoV1" password = "pabloasw" await expect(page).toClick("a", { text: "Don't have an account? Register here." }); }); diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index 8ccb8d6..a940e9b 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -35,25 +35,26 @@ function Jugar() { ] }]); - const getQuestions = async() => { - try { - console.log("Requesting random questions to " + apiEndpoint); - const response = await axios.get(`${apiEndpoint}/getquestions`); - console.log(response); - setQuestions(response.data); - setQuestionsLoaded(true); - } catch (error) { - console.error('Error getting questions', error); - } - } - useEffect(() => { + const getQuestions = async() => { + try { + console.log("Requesting random questions to " + apiEndpoint); + const response = await axios.get(`${apiEndpoint}/getquestions`); + console.log(response); + setQuestions(response.data); + setQuestionsLoaded(true); + } catch (error) { + console.error('Error getting questions', error); + } + }; + if (!isLoggedIn) { navigate('/login'); } else { - getQuestions(); + getQuestions().then(r =>{}); } - }, [isLoggedIn, navigate, getQuestions]); + }, [isLoggedIn, navigate]); + const handleNextQuestion = (timeExpired = false) => { setTimer(INITIAL_TIMER); if (selectedAnswerIndex !== null || timeExpired) { From 223037841497b2cf8cff836f44bd80e2c1fec2da Mon Sep 17 00:00:00 2001 From: Zohaib Akhtar Kausar Date: Mon, 25 Mar 2024 13:37:51 +0100 Subject: [PATCH 29/37] Arreglo test para despliegue V2 --- webapp/src/components/pages/Jugar.js | 29 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index a940e9b..dd6310e 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -1,4 +1,4 @@ -import React, { useContext, useState, useEffect } from "react"; +import React, {useContext, useState, useEffect, useCallback} from "react"; import { useNavigate } from 'react-router-dom'; import { AuthContext } from '../../AuthContext'; import "./Jugar.css"; @@ -6,7 +6,7 @@ import axios from 'axios'; // Configuración inicial y datos const INITIAL_TIMER = 20; - +const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; @@ -35,8 +35,9 @@ function Jugar() { ] }]); + useEffect(() => { - const getQuestions = async() => { + const getQuestions = async () => { try { console.log("Requesting random questions to " + apiEndpoint); const response = await axios.get(`${apiEndpoint}/getquestions`); @@ -51,11 +52,12 @@ function Jugar() { if (!isLoggedIn) { navigate('/login'); } else { - getQuestions().then(r =>{}); + getQuestions(); } - }, [isLoggedIn, navigate]); + }, [isLoggedIn, navigate]); // Asegúrate de incluir apiEndpoint en las dependencias si su valor puede cambiar. + - const handleNextQuestion = (timeExpired = false) => { + const handleNextQuestion = useCallback((timeExpired = false) => { setTimer(INITIAL_TIMER); if (selectedAnswerIndex !== null || timeExpired) { const isCorrect = @@ -69,23 +71,24 @@ function Jugar() { setCurrentQuestionIndex(currentQuestionIndex + 1); setSelectedAnswerIndex(null); } else { - //Finaliza el quiz + // Finaliza el quiz setQuizFinished(true); - //Guardamos en el historial los datos de la partida + // Guardamos en el historial los datos de la partida axios.post(`${apiEndpoint}/savehistory`, { username: username, - NumPreguntasJugadas: questions.length, // Número total de preguntas jugadas (la longitud de la matriz de preguntas) - NumAcertadas: correctAnswers, // Número de preguntas respondidas correctamente + NumPreguntasJugadas: questions.length, + NumAcertadas: correctAnswers, }) .then(response => { - console.log(response.data); // Mensaje de confirmación del servidor + console.log(response.data); }) .catch(error => { console.error('Error al guardar el historial:', error); }); } - }; + }, [currentQuestionIndex, selectedAnswerIndex, correctAnswers, questions, username]); + useEffect(() => { if (!quizFinished && questionsLoaded) { @@ -106,8 +109,6 @@ function Jugar() { setSelectedAnswerIndex(index); }; - const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; - const videoSource = quizFinished ? "/videos/celebracion.mp4" : "/videos/question.mp4"; // Renderizado del componente From 53f4468a7d6d73dd73197ac84b0869194315f61b Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Mon, 25 Mar 2024 14:19:35 +0100 Subject: [PATCH 30/37] cambiado nombre de la aplicacion en el navegador --- webapp/public/manifest.json | 4 ++-- webapp/src/App.js | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/webapp/public/manifest.json b/webapp/public/manifest.json index fc7ce89..199da77 100644 --- a/webapp/public/manifest.json +++ b/webapp/public/manifest.json @@ -1,6 +1,6 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "WIQ", + "name": "WIQ 04 d ASW ", "icons": [ { "src": "favicon.ico", diff --git a/webapp/src/App.js b/webapp/src/App.js index 88bb539..fb36455 100644 --- a/webapp/src/App.js +++ b/webapp/src/App.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect } from 'react' import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import Layout from './components/Layout'; // Asegúrate de importar el nuevo componente Layout import Home from './components/pages/Home'; @@ -12,7 +12,12 @@ import AboutUS from "./components/pages/AboutUS"; import Error404Page from "./components/pages/Error404Page"; function App() { + useEffect(() => { + document.title = "WIQ"; // Titulo de la paginma + }, []); + return ( + {/* Envolver con AuthProvider */} From db5028b50c8532a2b100885563871eba06b8874f Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Tue, 26 Mar 2024 13:05:50 +0100 Subject: [PATCH 31/37] recuperacion del historial a la vista (sin usuario) --- gatewayservice/gateway-service.js | 11 ++++++ users/historyservice/history-service.js | 33 +++++++++++++++++ webapp/src/components/pages/Historial.js | 46 +++++++++++++++--------- 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index de82312..0623267 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -65,6 +65,7 @@ app.get('/getquestions', async(req,res)=> { } }); +//Guardar el historial app.post('/savehistory', async (req, res) => { try{ const historyResponse = await axios.post(historyServiceUrl+'/savehistory', req.body); @@ -74,6 +75,16 @@ app.post('/savehistory', async (req, res) => { } }); +//Obtener el historial +app.get('/gethistory', async (req, res) => { + try{ + const historyResponse = await axios.get(historyServiceUrl+'/gethistory', req.body); + res.json(historyResponse.data); + }catch(error){ + res.status(error.response.status).json({ error: error.response.data.error }); + } +}); + // Read the OpenAPI YAML file synchronously openapiPath='./openapi.yaml' if (fs.existsSync(openapiPath)) { diff --git a/users/historyservice/history-service.js b/users/historyservice/history-service.js index a0bbef8..bcf0a86 100644 --- a/users/historyservice/history-service.js +++ b/users/historyservice/history-service.js @@ -53,6 +53,39 @@ app.post('/savehistory', async (req, res) => { } }); +app.get('/gethistory', async (req, res) => { + try { + //let username = req.body.username; + let username = "noexiste"; + + // Buscar el historial en la base de datos basado en el nombre de usuario + let historyEntry = await History.findOne({ username: username }); + + if (historyEntry === null) { + + console.log('Entro'); + // Si no se encuentra ningún historial para el usuario, crear un nuevo historial con valores igualados a 0 + historyEntry = new History({ + username: username, + NumJugadas: 0, + NumPreguntasJugadas: 0, + NumAcertadas: 0, + NumFalladas: 0 + }) + + // Guardar el nuevo historial en la base de datos + await historyEntry.save(); + + } + + res.json(historyEntry); + + } catch (error) { + // Manejo de errores + res.status(500).json({ error: 'Error al obtener el historial' }); + } +}); + const server = app.listen(port, () => { console.log(`History Service listening at http://localhost:${port}`); }); diff --git a/webapp/src/components/pages/Historial.js b/webapp/src/components/pages/Historial.js index e06ab87..ba1c772 100644 --- a/webapp/src/components/pages/Historial.js +++ b/webapp/src/components/pages/Historial.js @@ -1,4 +1,5 @@ -import React, { useContext, useEffect } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; +import axios from 'axios'; import { useNavigate } from 'react-router-dom'; import { AuthContext } from '../../AuthContext'; import '../../App.css'; @@ -6,33 +7,46 @@ import './Historial.css'; export default function Historial() { const navigate = useNavigate(); - const { isLoggedIn } = useContext(AuthContext); + const { isLoggedIn, username } = useContext(AuthContext); + const [historialData, setHistorialData] = useState(false); + + const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; useEffect(() => { if (!isLoggedIn) { navigate('/login'); + } else { + fetchHistorialData(); } }, [isLoggedIn, navigate]); - // Datos de ejemplo - const example_data = { - username: 'nombre', - NumJugadas: '20', - NumPreguntasJugadas: '100', - NumAcertadas: '80', - NumFalladas: '20', + const fetchHistorialData = async () => { + try { + let response = await axios.get(`${apiEndpoint}/gethistory`, { + username: username + }); + + console.log(response.data); + + setHistorialData(response.data); + + } catch (error) { + console.error('Error al obtener el historial:', error); + } }; return (

      HISTORIAL

      -
      -

      {example_data.username}

      -

      Número de Partidas: {example_data.NumJugadas}

      -

      Número de Preguntas Jugadas: {example_data.NumPreguntasJugadas}

      -

      Número de acertadas: {example_data.NumAcertadas}

      -

      Número de falladas: {example_data.NumFalladas}

      -
      + {historialData && ( +
      +

      Nombre de usuario: {historialData.username}

      +

      Número de Partidas: {historialData.NumJugadas}

      +

      Número de Preguntas Jugadas: {historialData.NumPreguntasJugadas}

      +

      Número de acertadas: {historialData.NumAcertadas}

      +

      Número de falladas: {historialData.NumFalladas}

      +
      + )}
      ); } From f076fb4289db8df7a3b1b243e618324a5ae5a73c Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Tue, 26 Mar 2024 13:23:34 +0100 Subject: [PATCH 32/37] cambios menores --- users/historyservice/history-service.js | 9 ++++----- webapp/src/components/pages/Jugar.js | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/users/historyservice/history-service.js b/users/historyservice/history-service.js index bcf0a86..c40ee92 100644 --- a/users/historyservice/history-service.js +++ b/users/historyservice/history-service.js @@ -17,7 +17,7 @@ mongoose.connect(mongoUri); app.post('/savehistory', async (req, res) => { try { - let username = req.body.username;//necesitamos el username + let username = req.body.username; //necesitamos el username //Extraer los datos de la solicitud const { NumPreguntasJugadas, NumAcertadas } = req.body; @@ -55,15 +55,15 @@ app.post('/savehistory', async (req, res) => { app.get('/gethistory', async (req, res) => { try { - //let username = req.body.username; - let username = "noexiste"; + + let username = req.body.username; + console.log(username); // Buscar el historial en la base de datos basado en el nombre de usuario let historyEntry = await History.findOne({ username: username }); if (historyEntry === null) { - console.log('Entro'); // Si no se encuentra ningún historial para el usuario, crear un nuevo historial con valores igualados a 0 historyEntry = new History({ username: username, @@ -81,7 +81,6 @@ app.get('/gethistory', async (req, res) => { res.json(historyEntry); } catch (error) { - // Manejo de errores res.status(500).json({ error: 'Error al obtener el historial' }); } }); diff --git a/webapp/src/components/pages/Jugar.js b/webapp/src/components/pages/Jugar.js index dd6310e..b96b174 100644 --- a/webapp/src/components/pages/Jugar.js +++ b/webapp/src/components/pages/Jugar.js @@ -54,7 +54,7 @@ function Jugar() { } else { getQuestions(); } - }, [isLoggedIn, navigate]); // Asegúrate de incluir apiEndpoint en las dependencias si su valor puede cambiar. + }, [isLoggedIn, navigate]); const handleNextQuestion = useCallback((timeExpired = false) => { From 685d4e66bd54075ec2da43f38242d263eee8df7e Mon Sep 17 00:00:00 2001 From: Zohaib Akhtar Kausar Date: Tue, 26 Mar 2024 15:59:20 +0100 Subject: [PATCH 33/37] Arreglo obtener historial --- gatewayservice/gateway-service.js | 5 ++++- users/historyservice/history-service.js | 2 +- webapp/src/components/pages/Historial.js | 25 ++++++++++++------------ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index 0623267..462b04f 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -78,13 +78,16 @@ app.post('/savehistory', async (req, res) => { //Obtener el historial app.get('/gethistory', async (req, res) => { try{ - const historyResponse = await axios.get(historyServiceUrl+'/gethistory', req.body); + const historyResponse = await axios.get(historyServiceUrl+'/gethistory', { + params: { username: req.query.username } + }); res.json(historyResponse.data); }catch(error){ res.status(error.response.status).json({ error: error.response.data.error }); } }); + // Read the OpenAPI YAML file synchronously openapiPath='./openapi.yaml' if (fs.existsSync(openapiPath)) { diff --git a/users/historyservice/history-service.js b/users/historyservice/history-service.js index c40ee92..46bb87f 100644 --- a/users/historyservice/history-service.js +++ b/users/historyservice/history-service.js @@ -56,7 +56,7 @@ app.post('/savehistory', async (req, res) => { app.get('/gethistory', async (req, res) => { try { - let username = req.body.username; + let username = req.query.username; console.log(username); // Buscar el historial en la base de datos basado en el nombre de usuario diff --git a/webapp/src/components/pages/Historial.js b/webapp/src/components/pages/Historial.js index ba1c772..698be5a 100644 --- a/webapp/src/components/pages/Historial.js +++ b/webapp/src/components/pages/Historial.js @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useState } from 'react'; +import React, {useCallback, useContext, useEffect, useState} from 'react'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; import { AuthContext } from '../../AuthContext'; @@ -12,18 +12,10 @@ export default function Historial() { const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; - useEffect(() => { - if (!isLoggedIn) { - navigate('/login'); - } else { - fetchHistorialData(); - } - }, [isLoggedIn, navigate]); - - const fetchHistorialData = async () => { + const fetchHistorialData = useCallback(async () => { try { let response = await axios.get(`${apiEndpoint}/gethistory`, { - username: username + params: { username: username } }); console.log(response.data); @@ -33,7 +25,16 @@ export default function Historial() { } catch (error) { console.error('Error al obtener el historial:', error); } - }; + }, [apiEndpoint, username]); + + + useEffect(() => { + if (!isLoggedIn) { + navigate('/login'); + } else { + fetchHistorialData(); + } + }, [isLoggedIn, navigate, fetchHistorialData]); return (
      From 64429e26efc648e41e22c67846fbbe67c107e808 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Wed, 27 Mar 2024 10:32:24 +0100 Subject: [PATCH 34/37] primera version tests historial --- users/historyservice/history-service.test.js | 48 ++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 users/historyservice/history-service.test.js diff --git a/users/historyservice/history-service.test.js b/users/historyservice/history-service.test.js new file mode 100644 index 0000000..6b42c27 --- /dev/null +++ b/users/historyservice/history-service.test.js @@ -0,0 +1,48 @@ +const request = require('supertest'); +const { MongoMemoryServer } = require('mongodb-memory-server'); +const bcrypt = require('bcrypt'); +const User = require('./auth-model'); +const History = require('./history-model'); + +let mongoServer; +let app; + +//test user +const user = { + username: 'testuser', + password: 'testpassword', +}; + +async function addUser(user){ + const hashedPassword = await bcrypt.hash(user.password, 10); + const newUser = new User({ + username: user.username, + password: hashedPassword, + }); + + await newUser.save(); +} + +beforeAll(async () => { + mongoServer = await MongoMemoryServer.create(); + const mongoUri = mongoServer.getUri(); + process.env.MONGODB_URI = mongoUri; + app = require('./auth-service'); + //Load database with initial conditions + await addUser(user); + await request(app).post('/login').send(user); +}); + +afterAll(async () => { + app.close(); + await mongoServer.stop(); +}); + +describe('History Service', () => { + it('Should history /gethistory', async () => { + const response = await request(app).get('/gethistory'); + expect(response.status).toBe(200); + expect(response.body).toHaveProperty('username', 'testuser'); + expect(response.body).toHaveProperty('NumJugadas', '0'); + }); +}); \ No newline at end of file From 0f63eb24261bb9f9cc106c26de7440a01454efd4 Mon Sep 17 00:00:00 2001 From: yagonavajas Date: Wed, 27 Mar 2024 11:34:23 +0100 Subject: [PATCH 35/37] cambios en las vistas --- webapp/public/favicon.ico | Bin 3150 -> 152126 bytes webapp/public/index.html | 2 +- webapp/public/logo192.png | Bin 5347 -> 14833 bytes webapp/public/logo512.png | Bin 9664 -> 24484 bytes webapp/src/components/AddUser.js | 21 ++++++++++++-------- webapp/src/components/Login.js | 10 +++++----- webapp/src/components/Navbar.js | 14 ++++++------- webapp/src/components/pages/Error404Page.js | 10 +++++----- webapp/src/components/pages/Historial.js | 2 +- webapp/src/components/pages/Home.js | 2 +- 10 files changed, 33 insertions(+), 28 deletions(-) diff --git a/webapp/public/favicon.ico b/webapp/public/favicon.ico index bcd5dfd67cd0361b78123e95c2dd96031f27f743..a86895ef68597fa53243dd5d5255245749a55dd4 100644 GIT binary patch literal 152126 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 J82A}6@PEMU4k!Qs literal 3150 zcmaKtc{Ei0AIGn;MZ^<@lHD*OV;K7~W1q3jSjJcqNywTkMOhP*k~Oj?GO|6{m(*C2 zC7JA+hN%%Bp7T4;J@?%2_x=5zbI<2~->=X60stMr0B~{wzpi9D0MG|# zyuANt7z6;uz%?PEfAnimLl^)6h5ARwGXemG2>?hqQv-I^Gpyh$JH}Ag92}3{$a#z& zd`il2Sb#$U&e&4#^4R|GTgk!Qs+x*PCL{2+`uB5mqtnqLaaw`*H2oqJ?XF(zUACc2 zSibBrdQzcidqv*TK}rpEv1ie&;Famq2IK5%4c}1Jt2b1x_{y1C!?EU)@`_F)yN*NK z)(u03@%g%uDawwXGAMm%EnP9FgoucUedioDwL~{6RVO@A-Q$+pwVRR%WYR>{K3E&Q zzqzT!EEZ$_NHGYM6&PK#CGUV$pTWsiI5#~m>htoJ!vbc0=gm3H8sz8KzIiVN5xdCT z%;}`UH2Pc8))1VS-unh?v4*H*NIy5On{MRKw7BTmOO9oE2UApwkCl9Z?^dod9M^#w z51tEZhf+#dpTo#GDDy#kuzoIjMjZ?%v*h$ z*vwUMOjGc?R0(FjLWkMD)kca4z6~H45FIzQ!Zzu&-yWyMdCBsDr2`l}Q{8fH$H@O< z$&snNzbqLk?(GIe?!PVh?F~2qk4z^rMcp$P^hw^rUPjyCyoNTRw%;hNOwrCoN?G0E z!wT^=4Loa9@O{t;Wk(Nj=?ms1Z?UN_;21m%sUm?uib=pg&x|u)8pP#l--$;B9l47n zUUnMV0sXLe*@Gvy>XWjRoqc2tOzgYn%?g@Lb8C&WsxV1Kjssh^ZBs*Ysr+E6%tsC_ zCo-)hkYY=Bn?wMB4sqm?WS>{kh<6*DO)vXnQpQ9`-_qF6!#b;3Nf@;#B>e2j$yokl6F|9p1<($2 z=WSr%)Z?^|r6njhgbuMrIN>8JE05u0x5t@_dEfbGn9r0hK4c2vp>(*$GXsjeLL_uz zWpyfUgdv!~-2N;llVzik#s2*XB*%7u8(^sJv&T3pzaR&<9({17Zs~UY>#ugZZkHBs zD+>0_an$?}utGp$dcXtyFHnTQZJ}SF=oZ}X07dz~K>^o(vjTzw8ZQc!Fw1W=&Z?9% zv63|~l}70sJbY?H8ON8j)w5=6OpXuaZ}YT03`2%u8{;B0Vafo_iY7&BiQTbRkdJBYL}?%ATfmc zLG$uXt$@3j#OIjALdT&Ut$=9F8cgV{w_f5eS)PjoVi z&oemp-SKJ~UuGuCP1|iY?J^S&P z)-IG?O-*=z6kfZrX5H*G=aQ{ZaqnOqP@&+_;nq@mA>EcjgxrYX8EK|Iq4&E&rxR?R z8N$QOdRwY zr{P`O)=87>YLHtFfGXW z6P)ucrhj~It_9w<^v5>T6N1U}+BkS))=WX*2JY=}^b2czGhH<`?`(}}qMcpPx_%>M zM|fs(+I1m&_h(zqp-HgP>re$2O^o$q)xu#fl0ivOJE({duU)a*OD(eYgSi^cdTn}pqcPM(;S)2%1By^Wh%-CaC%>d9hi`7J zaxL7@;nhA>PE%s99&;z{8>VFgf{u!(-B-x7Of6ueme+ScryL`h(^qKE)DtieWY>-7 zgB)VJESQS4*1LU(2&@pgLvSt{(((C?K_V(rQk``i&5}ZPG;G^FiPlZ$7|-vEmMWlU z5lQ%iK2nu=h2wd_7>gK@vX=*AG+u~rQP$NwPC`ZA?4nh{3tui1x@bT6-;Rk3yDQ>d z?3qRD#+PeV7#FAa>s`Xwxsx_oRFcN$StW2=CW`=qObsT?SD^#^jM1Yk}PSPxJ zG@-_mnNU_)vM|iLRSI>UMp|hatyS}17R{10IuL0TLlupt>9dRs_SPQbv7BLYyC#qv16E-y@XZ= z-!p7I%#r-BVi$nQq3&ssRc_IC%R6$tA&^s_l46880~Wst3@>(|EO<}T4~ci~#!=e; zD)B>o%1+$ksURD1p7I-<3ehlFyVkqrySf&gg>Bp0Z9?JaG|gyTZ{Cb8SdvAWVmFX7v2ohs!OCc!Udk zUITUpmZ33rKLI#(&lDj}cKA#dpL4Fil=$5pu_wi1XJR!llw` zSItPBDEdMHk2>c7#%lBxZHHvtVUOZ$}v?=?AT~9!Jcqa@IJGuMg(s^7r>pcTrd)pS`{5Cu8WPey` z9)!!OUUY@L%9Q+bZa*S5`3f_|lFCPN6kdp_M2>{le8;cn^XUsPa+TUk47qd6)IBR% zk*&Ip?!Ge_gmmdj)BX}P_5o@VI2*wbZ^>UhFju}0gQZh!pP%4XT9{@w;G#b3XK8sN zF(7i$Jv(IM$8Akys9dhP^^~H2(7BfJp}yDW1#@!CL-!mGcSCnJ599WK9MV@yo_u$v MDeX2GIKR{Qf5okjU;qFB diff --git a/webapp/public/index.html b/webapp/public/index.html index 08b8031..769235c 100644 --- a/webapp/public/index.html +++ b/webapp/public/index.html @@ -7,7 +7,7 @@ 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 R{~p)`$;+rnS4*0P{2%I4_;LUM literal 5347 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 X@eDJUQo;Ye2mwlRs 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 literal 9664 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/webapp/src/components/AddUser.js b/webapp/src/components/AddUser.js index b488075..5ca9c58 100644 --- a/webapp/src/components/AddUser.js +++ b/webapp/src/components/AddUser.js @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import axios from 'axios'; import { Container, Typography, TextField, Button, Snackbar } from '@mui/material'; -import { useNavigate } from 'react-router-dom'; +import {Link, useNavigate} from "react-router-dom"; const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; @@ -17,7 +17,7 @@ const AddUser = () => { await axios.post(`${apiEndpoint}/adduser`, { username, password }); setOpenSnackbar(true); // Redirigir al usuario a /login después de mostrar el Snackbar - setTimeout(() => navigate('/login'), 1000); // Espera 1 segundos antes de redirigir + setTimeout(() => navigate('/login'), 750); // Espera 1 segundos antes de redirigir } catch (error) { setError(error.response.data.error); } @@ -30,13 +30,13 @@ const AddUser = () => { return ( - Add User + Registro de Usuario setUsername(e.target.value)} /> @@ -44,18 +44,23 @@ const AddUser = () => { name="password" margin="normal" fullWidth - label="Password" + label="Contraseña" type="password" value={password} onChange={(e) => setPassword(e.target.value)} /> - - + {error && ( setError('')} message={`Error: ${error}`} /> )} + + + ¿Ya tienes una cuenta? Incia sesión aquí. + + ); }; diff --git a/webapp/src/components/Login.js b/webapp/src/components/Login.js index 8f88c39..2117483 100644 --- a/webapp/src/components/Login.js +++ b/webapp/src/components/Login.js @@ -38,30 +38,30 @@ const Login = () => {
      - Login + Entrar setUsername(e.target.value)} /> setPassword(e.target.value)} /> - Don't have an account? Register here. + ¿No tienes una cuenta? Registrate aquí.
      diff --git a/webapp/src/components/Navbar.js b/webapp/src/components/Navbar.js index 2a4acc4..8bb1057 100644 --- a/webapp/src/components/Navbar.js +++ b/webapp/src/components/Navbar.js @@ -22,7 +22,7 @@ function Navbar() { const NavLinks = ({ isLoggedIn }) => (
      • - Home + Inicio
      • {isLoggedIn ? ( <> @@ -33,16 +33,16 @@ function Navbar() { Historial
      • - Logout + Salir
      • ) : ( <>
      • - Register + Registrarse
      • - Login + Entrar
      • )} @@ -58,11 +58,11 @@ function Navbar() {
      {isLoggedIn ? ( - showButton && + showButton && ) : ( <> - {showButton && } - {showButton && } + {showButton && } + {showButton && } )} diff --git a/webapp/src/components/pages/Error404Page.js b/webapp/src/components/pages/Error404Page.js index 64b766a..462ce7b 100644 --- a/webapp/src/components/pages/Error404Page.js +++ b/webapp/src/components/pages/Error404Page.js @@ -5,7 +5,7 @@ import './Error404Page.css'; // Asegúrate de tener este archivo en el mismo dir function Error404Page() { const navigate = useNavigate(); - const [countdown, setCountdown] = useState(123123); + const [countdown, setCountdown] = useState(15); useEffect(() => { if (countdown === 0) { @@ -22,10 +22,10 @@ function Error404Page() {
      -

      404 - Oops! You ran out of oxygen

      -

      The page you're looking for is now beyond our reach. Let's get you

      -
      Back Home in {countdown} segundos...
      - +

      404 - ¡Ups! Te quedaste sin oxígeno

      +

      La página que estas buscando está fuera de nuestro alcance. Vamos a por ti.

      +
      Vuelta al inicio en {countdown} segundos...
      +
      ); diff --git a/webapp/src/components/pages/Historial.js b/webapp/src/components/pages/Historial.js index 698be5a..2c9be1d 100644 --- a/webapp/src/components/pages/Historial.js +++ b/webapp/src/components/pages/Historial.js @@ -41,7 +41,7 @@ export default function Historial() {

      HISTORIAL

      {historialData && (
      -

      Nombre de usuario: {historialData.username}

      +

      {historialData.username}

      Número de Partidas: {historialData.NumJugadas}

      Número de Preguntas Jugadas: {historialData.NumPreguntasJugadas}

      Número de acertadas: {historialData.NumAcertadas}

      diff --git a/webapp/src/components/pages/Home.js b/webapp/src/components/pages/Home.js index b8dfa41..fef7cc9 100644 --- a/webapp/src/components/pages/Home.js +++ b/webapp/src/components/pages/Home.js @@ -8,7 +8,7 @@ function Home() {