diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..34a2706d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.vscode +.github +.node_modules +singularity diff --git a/.env.development.sample b/.env.development.sample new file mode 100644 index 00000000..db79cd79 --- /dev/null +++ b/.env.development.sample @@ -0,0 +1,16 @@ +# SERVER_PORT=8000 +# MONGODB_PORT=27017 +# MONGODB_ADMIN_USER=dpdash +# MONGODB_ADMIN_PASSWORD=Get the password from whoever gave you the backup.tar for mongodb. Should match the .env file +# MONGODB_URI=mongodb://${MONGODB_ADMIN_USER}:${MONGODB_ADMIN_PASSWORD}@mongodb:27017/dpdmongo?authSource=admin +# SESSION_SECRET=This can be any secure value + +# RABBIT_PORT=5672 +# RABBIT_HOST=app-tier +# RABBIT_USERNAME=dpdash +# RABBIT_PASSWORD=Use any secure value, but make sure it's the same in the .env file +# RABBIT_ADDRESS=amqp://${RABBIT_USERNAME}:${RABBIT_PASSWORD}@app-tier:5672 +# RABBIT_PUBLISHER_QUEUE=dpdash +# RABBIT_CONSUMER_QUEUE=dpdashResponse + +# LOG_FILE_PATH=logs/app.log diff --git a/.env.sample b/.env.sample new file mode 100644 index 00000000..b9cbfb67 --- /dev/null +++ b/.env.sample @@ -0,0 +1,20 @@ +MONGODB_URI=mongodb://mongodb:27017/dpdmongo?authSource=admin +SESSION_SECRET=foooo +SMTP_HOST=your.smtpserver.com +SMTP_PORT=587 +SMTP_USER=yoursmtpuser +SMTP_PASS=yoursmtppassword +SMTP_REJECT_UNAUTHORIZED=false +ADMIN_EMAIL=adminaccountemail@example.com +EMAIL_SENDER=automatedemailfromaddress@example.com +HOME_URL=your.domain.com +IMPORT_API_USERS=api-user-1,api-user-2 +IMPORT_API_KEYS=api-key-1,api-key-2 + +# For local development with smtp4dev +# SMTP_HOST=smtp4dev +# SMTP_PORT=2525 +# SMTP_USER= +# SMTP_PASS= +# SMTP4DEV_UI_PORT=8080 +# SMTP4DEV_SMTP_PORT=2525 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..4908a276 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +dist/ +node_modules/ +cdk_lib/ +public/ +ts_bin/ diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..d869f2b0 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,65 @@ +{ + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "prettier", + "universe/web", + "universe/node", + ], + "parser": "@babel/eslint-parser", + "env": { + "browser": true, + "node": true, + }, + "parserOptions": { + "requireConfigFile": false, + "babelOptions": { + "presets": ["@babel/preset-react"], + }, + "ecmaFeatures": { + "jsx": true, + }, + "ecmaVersion": 15, + "sourceType": "module", + "parserOptions": { + "project": "./tsconfig.json", + }, + }, + "plugins": [ + "react", + "jest", + "testing-library", + "no-only-tests", + "sort-keys-fix", + "prettier", + "promise", + ], + "rules": { + "react/prop-types": "off", + "no-unused-vars": [ + "error", + { "varsIgnorePattern": "^_", "argsIgnorePattern": "^_" }, + ], + "import/order": [ + "error", + { + "alphabetize": { + "caseInsensitive": true, + "order": "asc", + }, + "groups": ["builtin", "external", "internal"], + "newlines-between": "always", + "pathGroups": [ + { + "group": "external", + "pattern": "react", + "position": "before", + }, + ], + "pathGroupsExcludedImportTypes": ["react"], + }, + ], + "no-only-tests/no-only-tests": "error", + "react/react-in-jsx-scope": "off", + }, +} diff --git a/.github/workflows/bootstrap_cdk.yaml b/.github/workflows/bootstrap_cdk.yaml new file mode 100644 index 00000000..81bde36e --- /dev/null +++ b/.github/workflows/bootstrap_cdk.yaml @@ -0,0 +1,34 @@ +name: Bootstrap CDK +on: + workflow_dispatch: +jobs: + deploy: + name: Deploy with AWS CDK + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + if: ${{ startsWith(vars.ROLE_ARN, 'arn:aws:iam') }} + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Configure AWS credentials from Test account + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ vars.ROLE_ARN }} + aws-region: us-east-1 + - name: Install dependencies + run: npm ci --legacy-peer-deps + - name: Bootstrap CDK + env: + CDK_DEFAULT_ACCOUNT: ${{ vars.CDK_DEFAULT_ACCOUNT }} + CDK_DEFAULT_REGION: ${{ vars.CDK_DEFAULT_REGION }} + CERT_ARN: ${{ vars.CERT_ARN_STAGING }} + SES_IDENTITY_ARN: ${{ vars.SES_IDENTITY_ARN }} + EMAIL_SENDER: ${{ vars.EMAIL_SENDER }} + ADMIN_EMAIL: ${{ vars.ADMIN_EMAIL }} + BASE_DOMAIN: ${{ vars.BASE_DOMAIN_STAGING }} + APP_MEMORY: ${{ vars.APP_MEMORY || '2048' }} + APP_CPU: ${{ vars.APP_CPU || '1024' }} + run: npm run bootstrap -- --require-approval never diff --git a/.github/workflows/build_images.yaml b/.github/workflows/build_images.yaml new file mode 100644 index 00000000..3e09a633 --- /dev/null +++ b/.github/workflows/build_images.yaml @@ -0,0 +1,45 @@ +name: Build Images +on: + workflow_dispatch: +jobs: + build-and-push: + name: Build and Push Docker Dependencies + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + if: ${{ startsWith(vars.ROLE_ARN, 'arn:aws:iam') }} + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ vars.ROLE_ARN }} + role-session-name: dpdash-ghactions-session + aws-region: us-east-1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build, tag, and push dpdash docker image to Amazon ECR + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + REPOSITORY: dpdash + IMAGE_TAG: latest + run: | + docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG . + docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG + + - name: Build, tag, and push mongo docker image to Amazon ECR + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + REPOSITORY: mongo + IMAGE_TAG: '5.0.21' + run: | + docker pull $REPOSITORY:$IMAGE_TAG + docker tag $REPOSITORY:$IMAGE_TAG $REGISTRY/$REPOSITORY:$IMAGE_TAG + docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG diff --git a/.github/workflows/create_repositories.yaml b/.github/workflows/create_repositories.yaml new file mode 100644 index 00000000..a8daa416 --- /dev/null +++ b/.github/workflows/create_repositories.yaml @@ -0,0 +1,38 @@ +name: Create Repositories +on: + workflow_dispatch: +jobs: + create-repositories: + name: Create Repositories for Docker Dependencies + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + if: ${{ startsWith(vars.ROLE_ARN, 'arn:aws:iam') }} + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ vars.ROLE_ARN }} + role-session-name: dpdash-ghactions-session + aws-region: us-east-1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Create dpdash docker repository in Amazon ECR + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + REPOSITORY: dpdash + run: aws ecr create-repository --repository-name ${REPOSITORY} + + - name: Create mongo docker repository in Amazon ECR + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + REPOSITORY: mongo + run: aws ecr create-repository --repository-name ${REPOSITORY} diff --git a/.github/workflows/deploy_app_prod.yaml b/.github/workflows/deploy_app_prod.yaml new file mode 100644 index 00000000..ecbda462 --- /dev/null +++ b/.github/workflows/deploy_app_prod.yaml @@ -0,0 +1,76 @@ +name: Deploy App Production +on: + workflow_dispatch: + push: + branches: + - master +jobs: + test: + name: Test on Node ${{ matrix.node }} and ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + node: ['latest'] + os: [ubuntu-latest] + steps: + - name: Checkout repo + uses: actions/checkout@v3 + - name: Use Node ${{ matrix.node }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + - name: Install deps + run: npm ci + - name: Test + run: npm run test + build-and-deploy: + name: Build and Deploy Docker Image + needs: test + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + if: ${{ startsWith(vars.ROLE_ARN, 'arn:aws:iam') }} + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ vars.ROLE_ARN }} + role-session-name: dpdash-ghactions-session + aws-region: us-east-1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build, tag, and push docker image to Amazon ECR + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + REPOSITORY: dpdash + IMAGE_TAG: ${{ github.sha }} + run: | + docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG . + docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG + + - name: Update ECS Task + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + REPOSITORY: dpdash + IMAGE_TAG: ${{ github.sha }} + CLUSTER_NAME: dpDashCluster + TASK_NAME: dpDashTaskDefinition + SERVICE_NAME: dpDashService + run: + | # Grab JSON of current DP Dash task definition, replace container image field with the new container and fix up the JSON, then upload the task and update the service with the new task + export ECR_IMAGE="$REGISTRY/$REPOSITORY:$IMAGE_TAG" + export TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_NAME" --region="us-east-1") + export NEW_TASK_DEFINITION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibilities) | del(.registeredAt) | del(.registeredBy)') + export NEW_REVISION=$(aws ecs register-task-definition --region "us-east-1" --cli-input-json "${NEW_TASK_DEFINITION}") + export NEW_REVISION_DATA=$(echo $NEW_REVISION | jq '.taskDefinition.revision') + export NEW_SERVICE=$(aws ecs update-service --cluster "$CLUSTER_NAME" --service "$SERVICE_NAME" --task-definition "$TASK_NAME" --force-new-deployment) + echo "done" + echo "DP Dash, Revision: ${NEW_REVISION_DATA}, Image: $REGISTRY/$REPOSITORY:$IMAGE_TAG" diff --git a/.github/workflows/deploy_app_staging.yaml b/.github/workflows/deploy_app_staging.yaml new file mode 100644 index 00000000..996c6138 --- /dev/null +++ b/.github/workflows/deploy_app_staging.yaml @@ -0,0 +1,76 @@ +name: Deploy App Staging +on: + workflow_dispatch: + push: + branches: + - pnl-devel +jobs: + test: + name: Test on Node ${{ matrix.node }} and ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + node: ['latest'] + os: [ubuntu-latest] + steps: + - name: Checkout repo + uses: actions/checkout@v3 + - name: Use Node ${{ matrix.node }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + - name: Install deps + run: npm ci + - name: Test + run: npm run test + build-and-deploy: + name: Build and Deploy Docker Image + needs: test + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + if: ${{ startsWith(vars.ROLE_ARN, 'arn:aws:iam') }} + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ vars.ROLE_ARN }} + role-session-name: dpdash-ghactions-session + aws-region: us-east-1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build, tag, and push docker image to Amazon ECR + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + REPOSITORY: dpdash + IMAGE_TAG: ${{ github.sha }} + run: | + docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG . + docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG + + - name: Update ECS Task + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + REPOSITORY: dpdash + IMAGE_TAG: ${{ github.sha }} + CLUSTER_NAME: dpDashDevCluster + TASK_NAME: dpDashDevTaskDefinition + SERVICE_NAME: dpDashDevService + run: + | # Grab JSON of current DP Dash task definition, replace container image field with the new container and fix up the JSON, then upload the task and update the service with the new task + export ECR_IMAGE="$REGISTRY/$REPOSITORY:$IMAGE_TAG" + export TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_NAME" --region="us-east-1") + export NEW_TASK_DEFINITION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibilities) | del(.registeredAt) | del(.registeredBy)') + export NEW_REVISION=$(aws ecs register-task-definition --region "us-east-1" --cli-input-json "${NEW_TASK_DEFINITION}") + export NEW_REVISION_DATA=$(echo $NEW_REVISION | jq '.taskDefinition.revision') + export NEW_SERVICE=$(aws ecs update-service --cluster "$CLUSTER_NAME" --service "$SERVICE_NAME" --task-definition "$TASK_NAME" --force-new-deployment) + echo "done" + echo "DP Dash, Revision: ${NEW_REVISION_DATA}, Image: $REGISTRY/$REPOSITORY:$IMAGE_TAG" diff --git a/.github/workflows/deploy_infrastructure_prod.yaml b/.github/workflows/deploy_infrastructure_prod.yaml new file mode 100644 index 00000000..afbca4fc --- /dev/null +++ b/.github/workflows/deploy_infrastructure_prod.yaml @@ -0,0 +1,34 @@ +name: Deploy Infrastructure Production +on: + workflow_dispatch: +jobs: + deploy: + name: Deploy with AWS CDK + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + if: ${{ startsWith(vars.ROLE_ARN, 'arn:aws:iam') }} + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Configure AWS credentials from Test account + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ vars.ROLE_ARN }} + aws-region: us-east-1 + - name: Install dependencies + run: npm ci + - name: Deploy Dev + env: + CDK_DEFAULT_ACCOUNT: ${{ vars.CDK_DEFAULT_ACCOUNT }} + CDK_DEFAULT_REGION: ${{ vars.CDK_DEFAULT_REGION }} + CERT_ARN: ${{ vars.CERT_ARN_PRODUCTION }} + SES_IDENTITY_ARN: ${{ vars.SES_IDENTITY_ARN }} + EMAIL_SENDER: ${{ vars.EMAIL_SENDER }} + ADMIN_EMAIL: ${{ vars.ADMIN_EMAIL }} + BASE_DOMAIN: ${{ vars.BASE_DOMAIN_PRODUCTION }} + APP_MEMORY: ${{ vars.APP_MEMORY || '2048' }} + APP_CPU: ${{ vars.APP_CPU || '1024' }} + run: npm run deploy -- --require-approval never diff --git a/.github/workflows/deploy_infrastructure_staging.yaml b/.github/workflows/deploy_infrastructure_staging.yaml new file mode 100644 index 00000000..5b93a9b9 --- /dev/null +++ b/.github/workflows/deploy_infrastructure_staging.yaml @@ -0,0 +1,35 @@ +name: Deploy Infrastructure Staging +on: + workflow_dispatch: +jobs: + deploy: + name: Deploy with AWS CDK + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + if: ${{ startsWith(vars.ROLE_ARN, 'arn:aws:iam') }} + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Configure AWS credentials from Test account + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ vars.ROLE_ARN }} + aws-region: us-east-1 + - name: Install dependencies + run: npm ci + - name: Deploy Dev + env: + CDK_DEFAULT_ACCOUNT: ${{ vars.CDK_DEFAULT_ACCOUNT }} + CDK_DEFAULT_REGION: ${{ vars.CDK_DEFAULT_REGION }} + CERT_ARN: ${{ vars.CERT_ARN_STAGING }} + SES_IDENTITY_ARN: ${{ vars.SES_IDENTITY_ARN }} + EMAIL_SENDER: ${{ vars.EMAIL_SENDER }} + ADMIN_EMAIL: ${{ vars.ADMIN_EMAIL }} + BASE_DOMAIN: ${{ vars.BASE_DOMAIN_STAGING }} + APP_MEMORY: ${{ vars.APP_MEMORY || '2048' }} + APP_CPU: ${{ vars.APP_CPU || '1024' }} + DPDASH_INFRA_STAGING: '1' + run: npm run deploy -- --require-approval never diff --git a/.github/workflows/display_infrastructure_template.yaml b/.github/workflows/display_infrastructure_template.yaml new file mode 100644 index 00000000..d523c76a --- /dev/null +++ b/.github/workflows/display_infrastructure_template.yaml @@ -0,0 +1,35 @@ +name: Display Infrastructure Template +on: + workflow_dispatch: +jobs: + synth: + name: Synthesize Cloudformation with AWS CDK + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + if: ${{ startsWith(vars.ROLE_ARN, 'arn:aws:iam') }} + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Configure AWS credentials from Test account + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ vars.ROLE_ARN }} + aws-region: us-east-1 + - name: Install dependencies + run: npm ci + - name: Synthesize Cloudformation + env: + CDK_DEFAULT_ACCOUNT: ${{ vars.CDK_DEFAULT_ACCOUNT }} + CDK_DEFAULT_REGION: ${{ vars.CDK_DEFAULT_REGION }} + CERT_ARN: ${{ vars.CERT_ARN_STAGING }} + SES_IDENTITY_ARN: ${{ vars.SES_IDENTITY_ARN }} + EMAIL_SENDER: ${{ vars.EMAIL_SENDER }} + ADMIN_EMAIL: ${{ vars.ADMIN_EMAIL }} + BASE_DOMAIN: ${{ vars.BASE_DOMAIN_STAGING }} + APP_MEMORY: ${{ vars.APP_MEMORY || '2048' }} + APP_CPU: ${{ vars.APP_CPU || '1024' }} + DPDASH_INFRA_STAGING: '1' + run: npx cdk synth diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..42294191 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,25 @@ +name: CI +on: [push] +jobs: + test: + name: Test on Node ${{ matrix.node }} and ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + node: ['latest'] + os: [ubuntu-latest] + steps: + - name: Checkout repo + uses: actions/checkout@v3 + - name: Use Node ${{ matrix.node }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + - name: Install deps + run: npm ci + - name: Lint + run: npm run lint + - name: Format + run: npm run format + - name: Test + run: npm run test diff --git a/.gitignore b/.gitignore index f411dc58..d7c676ca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,37 @@ +# pip Pipfile.lock -docs/build + +# node +node_modules + +# VSCode +.vscode + +# Logs *.log +*.dump + +# Local configs config.js +.env +.env.development +!server/ +server/configs/* +!server/configs/basePathConfig.js +!server/configs/defaultUserConfig.js + +# Built code *.map *.min.js +docs/build +public/js +public/css +public/index.html +dist + +app_build + + +# CDK asset staging directory +.cdk.staging +cdk.out diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..1eae0cf6 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..0b495108 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "semi": false, + "trailingComma": "es5" +} diff --git a/AWS_SETUP.md b/AWS_SETUP.md new file mode 100644 index 00000000..6b224030 --- /dev/null +++ b/AWS_SETUP.md @@ -0,0 +1,140 @@ +### 1. Request DNS Certificate + +### This step is only necessary if your domain is not hosted in AWS Route53. If it is, proceed directly to step 3 + +AWS Documentation: https://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html + +For this step you will require two things: + +1. A domain name for the DP Dash application +2. The ability to set CNAME records for that domain which reference AWS DNS names + +Log in to your AWS console and navigate to the Certificate Manager service. + +![Screenshot of the AWS Certificate Manager link](/doc/assets/aws_setup/01_request_certificate//create_certificate_01.png) + +Click the Request button in the top right corner. + +![Screenshot of the Request Certificate button](/doc/assets/aws_setup/01_request_certificate//create_certificate_02.png) + +Select "Request a public certificate". + +![Screenshot of the Request Certificate form](/doc/assets/aws_setup/01_request_certificate//create_certificate_04.png) + +Enter the fully qualified domain name at which the DP Dash app will be hosted, e.g. `dpdash.mydomain.com` if using a subdomain. Leave all other settings unchanged and click "Request". + +AWS will provide a CNAME record to add to your DNS records. Set this record in the management system for your domain and AWS will automatically verify it and create your certificate. + +![Screenshot of CNAME values for certificate verification](/doc/assets/aws_setup/01_request_certificate//create_certificate_05.png) + +Copy the ARN of the issued certificate and save it locally. We will use it when configuring the deployment for your environment. + +![Screenshot of ARN for certificate](/doc/assets/aws_setup/01_request_certificate//create_certificate_06.png) + +### 2. Verify an email identity with Simple Email Service + +### This step is only necessary if your domain is not hosted in AWS Route53. If it is, proceed directly to step 3 + +AWS Documentation: https://docs.aws.amazon.com/ses/latest/dg/creating-identities.html#just-verify-domain-proc + +On the AWS Simple Email Service dashboard, navigate to "Verified Identities" and select "Create Identity". + +![Screenshot of the SES Verified Identities page](/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_01.png) + +On the Create Identity form, select Identity Type of Domain and a domain of your root domain (e.g. `dpdash.com` even if hosting at `app.dpdash.com`). + +![Screenshot of the SES Create Domain page](/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_02.png) + +Select Create Identity. On the page for the new identity, scroll down to the "Publish DNS Records" section and select Download CSV Record Set at the bottom of the section. Set all of these records in the DNS records for your domain and wait for AWS to automatically verify domain ownership. + +![Screenshot of the Download CSV Record Set link](/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_03.png) + +Save the domain you used locally. We will use it when configuring the deployment for your environment. + +### 3. Create AWS Role for Github Actions + +AWS Documentation: https://aws.amazon.com/blogs/security/use-iam-roles-to-connect-github-actions-to-actions-in-aws/ + +Navigate to the IAM service in the AWS Console. + +![Screenshot of the IAM link](/doc/assets/aws_setup/03_create_github_role/create_github_role_01.png) + +Select "Roles" from the IAM Dashboard and click the Create button. + +![Screenshot of IAM dashboard](/doc/assets/aws_setup/03_create_github_role/create_github_role_02.png) + +For Trusted Entity select "Web Identity". For Identity Provider select "token.actions.githubusercontent.com". For Audience select "sts.amazonaws.com". Enter your Github Organization Name and the repo you wish to grant access to. Click "Create". + +![Screenshot of role creation form with values filled out](/doc/assets/aws_setup/03_create_github_role/create_github_role_03.png) + +Copy the ARN of the new role and save it locally. We will use it when configuring the deployment for your environment. + +### 4. Bootstrap the CDK and Generate Secrets + +This step will only need to be completed if the CDK has not been bootstrapped for your account/AWS environment. Ensure you are logged in via the AWS CLI. From the root of the project directory run: + +```bash +npm i +npm run bootstrap +``` + +Create secret values in AWS encrypted SSM Parameter store: + +```bash +export DPDASH_MONGODB_ADMIN_USER_DEV=dpdash +export DPDASH_IMPORT_API_USERS_DEV=dev-api-user +./bin/generate-secrets.sh +``` + +Secret values can be retrieved and decryted via the `./bin/echo-secrets.sh` script. THIS WILL LOG SECRET VALUES TO THE CONSOLE. + +### 5. Build and Deploy Docker Images + +Run the following commands from the root of this repository: + +```bash +export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account") +docker pull mongo:5.0.21 +docker build -t dpdash:latest . +aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com +docker tag mongo:5.0.21 $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/mongo:5.0.21 +docker push $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/mongo:5.0.21 + +docker tag dpdash:latest $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/dpdash:latest +docker push $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/dpdash:latest +``` + +### 6. Set Github Action Variables and Deploy + +Github Documentation: https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository + +Navigate to your Github repository and select the Settings tab. Open the "Secrets and Variables" menu on the left-hand side and select "Actions", then "New Variable". + +![Screenshot of the Github Settings Menu](/doc/assets/aws_setup/06_set_github_variables/set_github_variables_01.png) + +![Screenshot of Github Actions Variables](/doc/assets/aws_setup/06_set_github_variables/set_github_variables_02.png) + +Create 2 variables: + +1. Create the variable ROLE_ARN with a value of the ARN of your Role from Step 3. +2. Create the variable BASE_DOMAIN with the root domain you will use to host the app (e.g. `dpdash.com`). If you use an outside DNS rather than Route53, this will be the domain used in Step 2. + +If you keep your domain outside of Route53, create one more variable: + +1. Create the variable CERT_ARN with a value of the ARN of your AWS Certificate from Step 1. + +Navigate to the Actions tab and the Deploy Infrastructure workflow. Select "Run Workflow". The application will deploy. + +![Screenshot of Actions tab with Run Workflow button](/doc/assets/aws_setup/06_set_github_variables/set_github_variables_03.png) + +### 7. Check the Deployment and Set CNAME Record + +To verify that the application is deployed, view the DNS name with the following command: + +```bash +aws elbv2 describe-load-balancers --names dpDashDevLoadBalancer --query "LoadBalancers[0].DNSName" +``` + +Visit this domain in your browser via `https://`. You will get a warning from your browser that the certificate is incorrect. This is the expected behavior and means that the server is responding appropriately. It is not necessary to override the browser warning + +You may then set a CNAME record in your DNS system for the intended domain of this application, and direct requests to the URL retrieved from the above command. diff --git a/Docker_SETUP.md b/Docker_SETUP.md new file mode 100644 index 00000000..04beef45 --- /dev/null +++ b/Docker_SETUP.md @@ -0,0 +1,58 @@ +# Local Development Using Docker + +## Requirements + +- Download Docker +- Set up local ENV Variables +- Import Data + +## Docker + +Download Docker for your os type [Docker Website](https://www.docker.com/) + +## Set Up ENV Variables + +- Create a .env file +- Add these [variables to your file ](/.env.sample) +- Create a env.development file +- Add these [variables to your file ](/.env.development.sample) +- Ask a Team Member for the values and an export of their `dpdash-mongodb` volume + +## Import Data + +Create a new docker volume with the `dpdash-mongodb`. + +```sh +docker volume create dpdash-mongodb +``` + +Create a container to hold the volume + +```sh + docker run -v dpdash-mongodb:/dpdash-mongodb --name mongo_restore ubuntu /bin/bash +``` + +Unpack the `backup.tar` file into the volume. + +```sh + docker run --rm --volumes-from mongo_restore -v $(pwd):/backup ubuntu bash -c "cd /dpdash-mongodb && tar xvf /backup/backup.tar --strip 1" + +``` + +## Start the project + +- Once Set up, use the command `docker compose up` + +## For Onboarding: Export Data + +Spin up a container with the volume. Use Ubuntu because we gotta keep Mongo from writing to it. + +```sh + docker run -v dpdash-mongodb:/dpdash-mongodb --name mongo_backup ubuntu /bin/bash +``` + +Copy the volume contents to `./backup.tar` + +```sh +docker run --rm --volumes-from mongo_backup -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dpdash-mongodb +``` diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..604d9bec --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22 + +COPY . /src + +WORKDIR /src + +RUN wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem +RUN npm install + +ENV NODE_OPTIONS=--openssl-legacy-provider + +RUN npm run build +RUN npm run transpile + +ENV NODE_ENV=production +CMD [ "node", "dist/bin/www.js" ] + +EXPOSE 8000 + diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..ebbeef73 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +START=$(pwd) + +dev: + docker compose --env-file .env.development up + +dev-smtp: + docker compose --env-file .env.development --profile smtp up + +close: + docker compose --env-file .env.development down --rmi all diff --git a/ON_PREM_DEPLOYMENT.md b/ON_PREM_DEPLOYMENT.md new file mode 100644 index 00000000..067d28ff --- /dev/null +++ b/ON_PREM_DEPLOYMENT.md @@ -0,0 +1,264 @@ +# Running the Application On Premise with Docker Compose + +## Prerequisites + +1. Docker and Docker Compose should be installed on your system. +2. Port `27017/tcp` should be opened through `firewall-cmd` for external mongodb connection. +3. MGB mail relay server should be set in postfix configuration and postfix should be running. + +## Setup Instructions + +### In an MGB Provisioned VM + +#### 1. Environment Configuration + +i. Create a `.env` file in application root directory + +ii. Copy the contents from `.env.sample` + +iii. Set the following required variables: + ``` + MONGODB_URI=mongodb://mongodb:27017/dpdmongo?authSource=admin + SESSION_SECRET= + SMTP_HOST=MGB mail relay server + SMTP_PORT=25 + SMTP_USER= + SMTP_PASS= + SMTP_REJECT_UNAUTHORIZED=false + ADMIN_EMAIL= + EMAIL_SENDER= + HOME_URL=https://hostname.mgb.org + IMPORT_API_USERS= + IMPORT_API_KEYS= + ``` + +#### 2. Obtain official SSL certificate from rcc[dot]partners[dot]org + +Obtain official SSL certificate from rcc[dot]partners[dot]org. You can just +download the certificate and key in your computer. You will need to upload +these to Nginx proxy manager using GUI later. + +#### 3. Launch the Application + +From the application root directory, run: + +```bash +docker compose up +``` + +This will start all required services in background: + +- nginx-proxy-manager (web server that allows configuring SSL certificates and proxy) +- node-app (application server) +- mongodb (database) + +To run in detached mode: + +```bash +docker compose up -d +``` + +To stop the application: + +```bash +docker compose down +``` + +#### 4. Access the Application + +First, you will have to set up Nginx proxy via http://hostname.mgb.org:81. Then you can access the application at https://hostname.mgb.org + +i. Open up `81/tcp` port through `firewall-cmd` in hostname.mgb.org. Since the VM is head-less, this is the only way you can access +Nginx Proxy Manager from outside the VM. + +ii. Access the Nginx Proxy Manager admin interface at: http://hostname.mgb.org:81 + + - Default login: `admin@example.com` / `changeme` + + - Upload the official SSL certificate that you downloaded: + Image + + - From Nginx Proxy Manager dashboard, add this proxy: + + Image + + - From SSL tab, also attach the uploaded certificate to your domain. + +iii. Access the application at: https://hostname.mgb.org + - Upon signing up, you may get some `Forbidden` issues. But those should go away once the DPdash admin grants you access to some data. + - Import data to mongodb and contact the DPdash admin to get access. + + +--- + + +### In a Private Workstation + +#### 1. Environment Configuration + +i. Create a `.env` file in application root directory + +ii. Copy the contents from `.env.sample` + +iii. Set the following required variables: + ``` + MONGODB_URI=mongodb://mongodb:27017/dpdmongo?authSource=admin + SESSION_SECRET= + SMTP_HOST= + SMTP_PORT=25 + SMTP_USER= + SMTP_PASS= + ADMIN_EMAIL= + EMAIL_SENDER= + HOME_URL=https://dpdash.local + IMPORT_API_USERS= + IMPORT_API_KEYS= + ``` + +To find `SMTP_HOST`, send yourself an email from the server. Open the email within Outlook and `View`-->`View message details`. +Look for something like: + +``` +Received: from unknown (HELO pnl-xtreme.partners.org) ([170.123.12.123]) + by ob1.hc6077-55.iphmx.com +``` + +The last one is the `SMTP_HOST`. + +#### 2. Local Domain Setup + +The application is configured to use the hostname `dpdash.local`. Add this to your hosts file: + +``` +# On Linux/Mac: Edit /etc/hosts +# On Windows: Edit C:\Windows\System32\drivers\etc\hosts +127.0.0.1 dpdash.local +``` + +#### 3. Generate Self-Signed Certificate + +Run the provided script to generate a self-signed certificate: + +```bash +chmod +x make-cert.sh +./make-cert.sh +``` + +It will create two files in `certs/` directory: + +``` +$ ls certs/ +selfsigned.crt selfsigned.key +``` + +#### 4. Launch the Application + +From the application root directory, run: + +```bash +docker compose up +``` + +This will start all required services in background: + +- nginx-proxy-manager (web server that allows configuring SSL certificates and proxy) +- node-app (application server) +- mongodb (database) + +To run in detached mode: + +```bash +docker compose up -d +``` + +To include the SMTP testing server: + +```bash +docker compose --profile smtp up +``` + +To stop the application: + +```bash +docker compose down +``` + +#### 5. Access the Application + +First, you will have to set up Nginx proxy via http://dpdash.local:81. Then you can access the application at https://dpdash.local + +i. Access the Nginx Proxy Manager admin interface at: http://dpdash.local:81 + + - Default login: `admin@example.com` / `changeme` + - Upload the custom SSL certificate that you created: + image + + - From Nginx Proxy Manager dashboard, add this proxy: + image + + - Attach the SSL certificate: + image + + +ii. Access the application at: https://dpdash.local/ + + - Your browser will show a security warning because of the self-signed certificate. This is expected for local development. + - Upon signing up, you may get some `Forbidden` issues. But those should go away once the DPdash admin grants you access to some data. + - Import data to mongodb and contact the DPdash admin to get access. + +##### Security Warning + +Nginx Proxy Manager should not be exposed to the internet. It is recommended to run it behind another web server that handles authentication and SSL termination. It also isn't required for production, as you can configure SSL termination and authentication at the load balancer level. It is necessary for local development because the application uses secure cookies AND it is considered a best practice to route all traffic over https. + + +## Maintenance + +### 1. Connecting directly to Mongo + +Find the container ID of the mongo container with `docker ps` and then run `docker exec -it /bin/bash` to get a terminal within the container. From there you can run `mongosh` to connect to the database. + +Alternatively, you can download [mongosh](https://www.mongodb.com/try/download/shell) and connect directly as: + +``` +mongosh "mongodb://127.0.0.1:27017/dpdmongo?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.8" +``` + +### 2. Importing charts, configs, users + +Due to Gnar company's changes in database structure, [this](https://github.com/AMP-SCZ/utility/blob/f84e3d5a211d5e10020c670994dd78e79f07fb17/dpdash_ci_cd/dpdash_ci_cd.sh#L22-L29) method of `mongoimport` no longer works. The new method is: + +``` +mongoimport --uri="mongodb://127.0.0.1:27017/dpdmongo?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.8" --collection=charts charts_20230728_ci_cd.json +mongoimport --uri="mongodb://127.0.0.1:27017/dpdmongo?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.8" --collection=configs configs_20230728_ci_cd.json +mongoimport --uri="mongodb://127.0.0.1:27017/dpdmongo?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.8" --collection=users users_20230728_ci_cd.json +``` + +The trailing JSONs can be obtained from rc-predict.partners.org's `mongoexport`. + +
+ mongoexport + + ``` + mongoexport --ssl --sslCAFile=$state/ssl/ca/cacert.pem --sslPEMKeyFile=$state/ssl/mongo_client.pem --uri="mongodb://dpdash:$MONGO_PASS@$HOST:$PORT/dpdata?authSource=admin" --collection=charts --out=/tmp/charts_${datestamp}.json + mongoexport --ssl --sslCAFile=$state/ssl/ca/cacert.pem --sslPEMKeyFile=$state/ssl/mongo_client.pem --uri="mongodb://dpdash:$MONGO_PASS@$HOST:$PORT/dpdmongo?authSource=admin" --collection=configs --out=/tmp/configs_${datestamp}.json + mongoexport --ssl --sslCAFile=$state/ssl/ca/cacert.pem --sslPEMKeyFile=$state/ssl/mongo_client.pem --uri="mongodb://dpdash:$MONGO_PASS@$HOST:$PORT/dpdmongo?authSource=admin" --collection=users --out=/tmp/users_${datestamp}.json + ``` + +
+ + +### 2. Importing data + +The `IMPORT_API_USERS` and `IMPORT_API_KEYS` environment variables are used to authenticate API requests to import data. You can use these credentials with the import script at https://github.com/AMP-SCZ/dpimport to import data to the database. The updated script is on the branch `381-update-import-script-to-json-payload` and can be run by creating a config file like so: + +```yaml +api_url: http://your.app.example.com/api/v1/import/data/ +api_user: importer +api_key: super_secret +``` + +And running the script with the following command: + +```bash +python import.py -c config.yaml /PATH/TO/CSV/DATA +``` diff --git a/README.md b/README.md deleted file mode 100644 index d3027b9a..00000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -Read the documentation [here](http://docs.neuroinfo.org/dpdash/en/latest/)! diff --git a/app.js b/app.js deleted file mode 100644 index 7b17d9b1..00000000 --- a/app.js +++ /dev/null @@ -1,198 +0,0 @@ -var createError = require('http-errors'); -var express = require('express'); -var path = require('path'); -var helmet = require('helmet'); -var morgan = require('morgan'); -var winston = require('winston'); -var favicon = require('serve-favicon'); -var cookieParser = require('cookie-parser'); -var expressSession = require('express-session'); -var MongoStore = require('connect-mongo')(expressSession); -var MongoDB = require('mongodb'); -var MongoClient = MongoDB.MongoClient; -var passport = require('passport'); -var ldapStrategy = require('passport-ldapauth'); -var passportLocal = require('passport-local'); -var localStrategy = passportLocal.Strategy; -var co = require('co'); -var bodyParser = require('body-parser'); -var methodOverride = require('method-override'); - - -var indexRouter = require('./routes/index'); -//var usersRouter = require('./routes/users'); -var configPath = process.env.DPDASH_CONFIG || './config'; -var config = require(configPath); - -var app = express(); - -/** favicon setup */ -app.use(favicon(path.join(__dirname, '/public/img/favicon.png'))); - -/** security setup */ -app.use(helmet({ - noCache: true, - noSniff: true -})); - -/** logger setup */ -morgan.token('remote-user', function(req, res) { - return (req.user) ? req.user : 'unidentified'; -}); -var logger = winston.createLogger({ - transports: [ - new winston.transports.File({ - level: 'verbose', - filename: config.app.logfile, - handleExceptions: true, - json: true, - colorize: false - }), - new winston.transports.Console({ - level: 'debug', - handleExceptions: true, - json: false, - colorize: true - }) - ], - exitOnError: false -}); -logger.stream = { - write: function(message, encoding) { - logger.info(message) - } -}; -app.use(morgan('combined', {'stream': logger.stream})); - -/** parsers setup */ -app.use(express.static(path.join(__dirname, 'public'))); -app.use(cookieParser(config.session.secret)); -app.use(bodyParser.json({limit: '50mb', extended: true})); -app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); -app.set('view engine', 'html'); -app.use(methodOverride()); - - -/* database setup */ -var mongodb; -var mongodbPromise = co(function* () { - var mongoURI = 'mongodb://' + config.database.mongo.username + ':'; - mongoURI = mongoURI + config.database.mongo.password + '@' + config.database.mongo.host; - mongoURI = mongoURI + ':' + config.database.mongo.port + '/' + config.database.mongo.authSource; - return yield MongoClient.connect(mongoURI, config.database.mongo.server); -}).then(function(res) { - mongodb = res.db(config.database.mongo.appDB); - mongodb.dropCollection('sessions'); //clear outstanding sessions - return mongodb; -}); - -/** session store setup */ -app.set('trust proxy', 1); -app.use(expressSession({ - secret: config.session.secret, - saveUninitialized: config.session.saveUninitialized, - resave: config.session.resave, - cookie: config.session.cookie, - store: new MongoStore({ - dbPromise : mongodbPromise, - autoRemove: 'native' - }) -})); - -/** authenticator setup */ -if(config.auth.useLDAP) { - //passport ldap strategy - passport.use(new ldapStrategy({ - server: config.auth.ldap, - usernameField: config.auth.usernameField, - passwordField: config.auth.passwordField - })); -} - -//passport local strategy -passport.use('local-login', new localStrategy({ - usernameField: config.auth.usernameField, - passwordField: config.auth.passwordField - }, - function(username, password, done) { - mongodb.collection('users').findOne({uid: username}).then(function (user) { - if (!user) { - return done(null, false); - } else { - return done(null, user); - } - }); - } -)); - -//passport local registeration -passport.use('local-signup', new localStrategy({ - usernameField: config.auth.usernameField, - passwordField: config.auth.passwordField, - passReqToCallback : true - }, - function(req, username, password, done) { - mongodb.collection('users').findOne({uid: username}).then(function (err, user) { - if (!user) { - return done(null, false, req.body); - } - return done(null, true, null); - }); - } -)); - -app.use(passport.initialize()); -app.use(passport.session()); - -app.use('/', indexRouter); -app.use('/css', express.static(path.join(__dirname, '/public/css'))); -app.use('/js', express.static(path.join(__dirname, '/public/js'))); -app.use('/img', express.static(path.join(__dirname, '/public/img'))); -//app.use('/users', usersRouter); - -/** error handlers setup */ - -//catch 404 and forward to error handler -app.use(function(req, res, next) { - if(req.accepts('html')) { - res.status(404); - return; - } - - if(req.accepts('json')) { - res.status(404).json({ error: '404: Page not found.' }); - return; - } - - res.status(404).type('txt').send('ERROR 404: Page not found.'); - - next(err); -}); - -//catch any other error -app.use(function(err, req, res, next) { - console.log(err); - var errStatus = err.status || 500; - var errMessage = ''; - switch (errStatus) { - case 400: - errMessage = 'Bad Request'; - break; - case 401: - errMessage = 'Unauthorized'; - break; - case 403: - errMessage = 'Forbidden'; - break; - case 500: - errMessage = 'Internal Server Error'; - break; - } /* - res.status(errStatus).json({ - status: 'error', - message: errMessage - }); */ -}); - - -module.exports = app; diff --git a/assets/dpdash.png b/assets/dpdash.png new file mode 100755 index 00000000..2d8715b4 Binary files /dev/null and b/assets/dpdash.png differ diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 00000000..252b1547 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/favicon.png b/assets/favicon.png new file mode 100644 index 00000000..252b1547 Binary files /dev/null and b/assets/favicon.png differ diff --git a/bin/echo-secrets.sh b/bin/echo-secrets.sh new file mode 100755 index 00000000..41f3b368 --- /dev/null +++ b/bin/echo-secrets.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Before executing: +# Login to the AWS CLI with an account that has access to the SSM service + +read -p "This script will log secret values to the console. Are you sure you wish to proceed? (y/n)" +if [[ $REPLY =~ ^[Yy]$ ]] +then + echo "Staging Secret Values:" + aws ssm get-parameter \ + --name "DPDASH_IMPORT_API_USERS_DEV" \ + --with-decryption + + aws ssm get-parameter \ + --name "DPDASH_IMPORT_API_KEYS_DEV" \ + --with-decryption + + aws ssm get-parameter \ + --name "DPDASH_SESSION_SECRET_DEV" \ + --with-decryption + + echo "Production Secret Values:" + + aws ssm get-parameter \ + --name "DPDASH_IMPORT_API_USERS" \ + --with-decryption + + aws ssm get-parameter \ + --name "DPDASH_IMPORT_API_KEYS" \ + --with-decryption + + aws ssm get-parameter \ + --name "DPDASH_SESSION_SECRET" \ + --with-decryption +fi diff --git a/bin/generate-secrets.sh b/bin/generate-secrets.sh new file mode 100755 index 00000000..69e20b67 --- /dev/null +++ b/bin/generate-secrets.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Before executing: +# Login to the AWS CLI with an account that has access to the SSM service + +# Set an environment variable as a comma separated list of usernames for the +# staging API users named DPDASH_IMPORT_API_USERS_DEV + +# Set an environment variable as a comma separated list of usernames for the +# production API users named DPDASH_IMPORT_API_USERS + +aws ssm put-parameter \ + --name "DPDASH_IMPORT_API_USERS_DEV" \ + --value $DPDASH_IMPORT_API_USERS_DEV \ + --type SecureString \ + --tags "Key=Name,Value=dpdash" + +aws ssm put-parameter \ + --name "DPDASH_IMPORT_API_USERS" \ + --value $DPDASH_IMPORT_API_USERS \ + --type SecureString \ + --tags "Key=Name,Value=dpdash" + +export DPDASH_NUMBER_OF_USERS_DEV=$(($(echo $DPDASH_IMPORT_API_USERS_DEV | tr -cd , | wc -c) + 1)) +aws ssm put-parameter \ + --name "DPDASH_IMPORT_API_KEYS_DEV" \ + --value $( + for i in seq $DPDASH_NUMBER_OF_USERS_DEV; do + echo $(openssl rand -base64 32 | tr -d "+=/") + done | tr '\n' ',' + ) \ + --type SecureString \ + --tags "Key=Name,Value=dpdash" + +export DPDASH_NUMBER_OF_USERS=$(($(echo $DPDASH_IMPORT_API_USERS | tr -cd , | wc -c) + 1)) +aws ssm put-parameter \ + --name "DPDASH_IMPORT_API_KEYS" \ + --value $( + for i in seq $DPDASH_NUMBER_OF_USERS; do + echo $(openssl rand -base64 32 | tr -d "+=/") + done | tr '\n' ',' + ) \ + --type SecureString \ + --tags "Key=Name,Value=dpdash" + +aws ssm put-parameter \ + --name "DPDASH_SESSION_SECRET" \ + --value $(openssl rand -base64 32 | tr -d "+=/") \ + --type SecureString \ + --tags "Key=Name,Value=dpdash" + +aws ssm put-parameter \ + --name "DPDASH_SESSION_SECRET_DEV" \ + --value $(openssl rand -base64 32 | tr -d "+=/") \ + --type SecureString \ + --tags "Key=Name,Value=dpdash" diff --git a/bin/manual-app-deploy.sh b/bin/manual-app-deploy.sh new file mode 100644 index 00000000..3bbb826a --- /dev/null +++ b/bin/manual-app-deploy.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Set the following environment variables to deploy to Staging: +# export CLUSTER_NAME: dpDashDevCluster +# export TASK_NAME: dpDashDevTaskDefinition +# export SERVICE_NAME: dpDashDevService + +AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account") + +docker build -t dpdash:latest . +aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com + +ECR_IMAGE="$AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/dpdash:latest" + +docker tag dpdash:latest $ECR_IMAGE +docker push $ECR_IMAGE + +TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_NAME" --region="us-east-1") +NEW_TASK_DEFINITION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibilities) | del(.registeredAt) | del(.registeredBy)') +aws ecs register-task-definition --region "us-east-1" --cli-input-json "${NEW_TASK_DEFINITION}" +aws ecs update-service --cluster "$CLUSTER_NAME" --service "$SERVICE_NAME" --task-definition "$TASK_NAME" --force-new-deployment diff --git a/bin/www b/bin/www deleted file mode 100755 index b53f9d21..00000000 --- a/bin/www +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('po:server'); -var http = require('http'); -var configPath = process.env.DPDASH_CONFIG || '../config'; -var config = require(configPath); -var amqp = require('amqplib/callback_api'); -var CronJob = require('cron').CronJob; - -const { spawn } = require('child_process'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(config.app.port); -app.set('port', port); - -console.log(port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port, config.app.address); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Create a websocket - */ -var io = require('socket.io')(server, { - transports: ['websocket', 'polling'], - pingInterval: 1500, - pingTimeout: 2000 -}); //squid v2 - -app.set('socketio', io); - -/* authenticated */ -io.use(function(socket, next){ - if (socket.request.headers.cookie) return next(); - next(new Error('Authentication error')); -}); - -/* Not authenticated */ -io.on('connection', function(socket) { - socket.on('subscribe', function(roomID) { - socket.join(roomID); - }); - socket.on('unsubscribe', function(roomID) { - socket.leave(roomID); - }); -}); - -/** - * Create a rabbitmq connection - */ -var amqpAddress = 'amqps://' + config.rabbitmq.username; -amqpAddress = amqpAddress + ':' + config.rabbitmq.password; -amqpAddress = amqpAddress + '@' + config.rabbitmq.host + ':' + config.rabbitmq.port; -amqp.connect(amqpAddress, config.rabbitmq.opts, function(err, conn) { - if(err) console.log(err); - conn.createChannel(function(err, ch) { - if(err) console.log(err); - ch.assertQueue(config.rabbitmq.consumerQueue, {durable: false}, function(err, q) { - if(err) console.log(err); - consumer(conn, ch, q.queue); - }); - }); -}); - - -/* -* Set up crons for data and acl import -*/ -for(hour in config.rabbitmq.sync.hours) { - if (config.rabbitmq.sync.hours[hour] < 10) { - var syncTime = '00 00 0' + config.rabbitmq.sync.hours[hour] + ' * * 0-6'; - } else { - var syncTime = '00 00 ' + config.rabbitmq.sync.hours[hour] + ' * * 0-6'; - } - new CronJob({ - cronTime: syncTime, - onTick: function() { - var importer = spawn('node', ['./utils/importer.js']); - - importer.stdout.on('data', (data) => { - console.log(`stdout: ${data}`); - }); - - importer.stderr.on('data', (data) => { - console.log(`stderr: ${data}`); - }); - - importer.on('close', (code) => { - console.log(`child process exited with code ${code}`); - }); - }, - start: true, - timeZone: config.rabbitmq.sync.timezone - }); -} - -/* socket.io connection */ -var dashboardNsp = io.of('/dashboard'); - -function consumer(conn, ch, replyTo) { - ch.consume(replyTo, function(msg) { - var response = JSON.parse(msg.content.toString()); - var taskStatus = response.status; - if (taskStatus === 'PROCESSING') { - dashboardNsp.emit(taskStatus, { taskId : response.task_id }); - } else if (taskStatus === 'SUCCESS') { - dashboardNsp.emit(taskStatus, { taskId : response.task_id }); - } - }); -} - - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/cdk.json b/cdk.json new file mode 100644 index 00000000..228e9158 --- /dev/null +++ b/cdk.json @@ -0,0 +1,58 @@ +{ + "app": "npx ts-node --prefer-ts-exts ts_bin/dpdash-cdk.ts", + "watch": { + "include": ["**"], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": ["aws", "aws-cn"], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true + } +} diff --git a/cdk_lib/dpdash-cdk-stack.test.ts b/cdk_lib/dpdash-cdk-stack.test.ts new file mode 100644 index 00000000..81ba59a1 --- /dev/null +++ b/cdk_lib/dpdash-cdk-stack.test.ts @@ -0,0 +1,239 @@ +import { createTemplate } from './test/fixtures' +import { DpdashCdkStack } from './dpdash-cdk-stack' + +describe('DPDashCDKStack', () => { + const OLD_ENV = process.env + const setEnv = (overrides = {}) => { + process.env = { + CDK_DEFAULT_ACCOUNT: '000000000000', + CDK_DEFAULT_REGION: 'us-east-1', + CERT_ARN: 'aws:certarn', + SES_IDENTITY_ARN: 'aws:sesarn', + EMAIL_SENDER: 'noreply@dpdash.example.com', + ADMIN_EMAIL: 'alice@example.com', + BASE_DOMAIN: 'dpdash.example.com', + APP_MEMORY: '2048', + APP_CPU: '1024', + DPDASH_INFRA_STAGING: '1', + ...overrides, + } + } + + beforeEach(() => { + jest.resetModules() + process.env = { ...OLD_ENV } + }) + + afterAll(() => { + process.env = OLD_ENV + }) + + it('throws an error if the CERT_ARN and SES_IDENTITY_ARN are missing', () => { + setEnv({ CERT_ARN: undefined, SES_IDENTITY_ARN: undefined }) + expect(() => createTemplate(DpdashCdkStack)).toThrowError( + 'Missing required environment variables: CERT_ARN, SES_IDENTITY_ARN' + ) + }) + + it('creates a VPC', () => { + setEnv() + const template = createTemplate(DpdashCdkStack) + + template.hasResource('AWS::EC2::VPC', {}) + }) + + it('creates a DocumentDB Cluster', () => { + setEnv() + const template = createTemplate(DpdashCdkStack) + + template.hasResource('AWS::DocDB::DBCluster', {}) + template.hasResource('AWS::DocDB::DBInstance', {}) + }) + + describe('when the DPDASH_INFRA_STAGING flag is set to "1"', () => { + it('creates a public Application Load Balanced Fargate Service with Dev names', () => { + setEnv() + const template = createTemplate(DpdashCdkStack) + + template.hasResource('AWS::ElasticLoadBalancingV2::LoadBalancer', { + Properties: { + Scheme: 'internet-facing', + }, + }) + template.hasResource('AWS::ECS::Cluster', { + Properties: { + ClusterName: 'dpDashDevCluster', + }, + }) + template.hasResource('AWS::ECS::Service', { + Properties: { + ServiceName: 'dpDashDevService', + }, + }) + template.hasResource('AWS::ECS::TaskDefinition', { + Properties: { + Family: 'dpDashDevTaskDefinition', + }, + }) + }) + it('uses the _DEV suffix for secret names', () => { + setEnv() + const template = createTemplate(DpdashCdkStack) + + template.hasResource('AWS::ECS::TaskDefinition', { + Properties: { + ContainerDefinitions: [ + { + Secrets: [ + { + Name: 'MONGODB_PASSWORD', + ValueFrom: { + Ref: 'DocumentDBPassword52497A47', + }, + }, + { + Name: 'SESSION_SECRET', + ValueFrom: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':ssm:us-east-1:000000000000:parameter/DPDASH_SESSION_SECRET_DEV', + ], + ], + }, + }, + { + Name: 'IMPORT_API_USERS', + ValueFrom: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':ssm:us-east-1:000000000000:parameter/DPDASH_IMPORT_API_USERS_DEV', + ], + ], + }, + }, + { + Name: 'IMPORT_API_KEYS', + ValueFrom: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':ssm:us-east-1:000000000000:parameter/DPDASH_IMPORT_API_KEYS_DEV', + ], + ], + }, + }, + ], + }, + ], + }, + }) + }) + }) + describe('when the DPDASH_INFRA_STAGING flag is not set to "1"', () => { + it('creates a public Application Load Balanced Fargate Service with production names', () => { + setEnv({ DPDASH_INFRA_STAGING: undefined }) + const template = createTemplate(DpdashCdkStack) + + template.hasResource('AWS::ElasticLoadBalancingV2::LoadBalancer', { + Properties: { + Scheme: 'internet-facing', + }, + }) + template.hasResource('AWS::ECS::Cluster', { + Properties: { + ClusterName: 'dpDashCluster', + }, + }) + template.hasResource('AWS::ECS::Service', { + Properties: { + ServiceName: 'dpDashService', + }, + }) + template.hasResource('AWS::ECS::TaskDefinition', { + Properties: { + Family: 'dpDashTaskDefinition', + }, + }) + }) + it('does not use the _DEV suffix for secret names', () => { + setEnv({ DPDASH_INFRA_STAGING: undefined }) + const template = createTemplate(DpdashCdkStack) + + template.hasResource('AWS::ECS::TaskDefinition', { + Properties: { + ContainerDefinitions: [ + { + Secrets: [ + { + Name: 'MONGODB_PASSWORD', + ValueFrom: { + Ref: 'DocumentDBPassword52497A47', + }, + }, + { + Name: 'SESSION_SECRET', + ValueFrom: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':ssm:us-east-1:000000000000:parameter/DPDASH_SESSION_SECRET', + ], + ], + }, + }, + { + Name: 'IMPORT_API_USERS', + ValueFrom: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':ssm:us-east-1:000000000000:parameter/DPDASH_IMPORT_API_USERS', + ], + ], + }, + }, + { + Name: 'IMPORT_API_KEYS', + ValueFrom: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':ssm:us-east-1:000000000000:parameter/DPDASH_IMPORT_API_KEYS', + ], + ], + }, + }, + ], + }, + ], + }, + }) + }) + }) +}) diff --git a/cdk_lib/dpdash-cdk-stack.ts b/cdk_lib/dpdash-cdk-stack.ts new file mode 100644 index 00000000..20f0de9d --- /dev/null +++ b/cdk_lib/dpdash-cdk-stack.ts @@ -0,0 +1,222 @@ +import * as cdk from 'aws-cdk-lib' +import * as ec2 from 'aws-cdk-lib/aws-ec2' +import * as ecs from 'aws-cdk-lib/aws-ecs' +import * as ssm from 'aws-cdk-lib/aws-ssm' +import * as ecr from 'aws-cdk-lib/aws-ecr' +import * as iam from 'aws-cdk-lib/aws-iam' +import * as docdb from 'aws-cdk-lib/aws-docdb' +import * as certificate_manager from 'aws-cdk-lib/aws-certificatemanager' +import * as ecs_patterns from 'aws-cdk-lib/aws-ecs-patterns' +import * as secrets_manager from 'aws-cdk-lib/aws-secretsmanager' +import { Construct } from 'constructs' + +export class DpdashCdkStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, { + env: { + account: process.env.CDK_DEFAULT_ACCOUNT, + region: process.env.CDK_DEFAULT_REGION, + }, + ...props, + }) + const IS_DEV = process.env.DPDASH_INFRA_STAGING === '1' + const APP_NAME = IS_DEV ? 'DpDashDev' : 'DPDash' + + if ( + !process.env.BASE_DOMAIN || + !process.env.ADMIN_EMAIL || + !process.env.EMAIL_SENDER + ) { + throw new Error( + 'Missing required environment variables: BASE_DOMAIN, ADMIN_EMAIL, EMAIL_SENDER' + ) + } + + if (!process.env.CERT_ARN || !process.env.SES_IDENTITY_ARN) { + throw new Error( + 'Missing required environment variables: CERT_ARN, SES_IDENTITY_ARN' + ) + } + + const certArn = process.env.CERT_ARN + const sesIdentityArn = process.env.SES_IDENTITY_ARN + + const secrets = { + sessionSecretDev: ecs.Secret.fromSsmParameter( + ssm.StringParameter.fromSecureStringParameterAttributes( + this, + `${APP_NAME}SessionDevSecret`, + { + parameterName: 'DPDASH_SESSION_SECRET' + (IS_DEV ? '_DEV' : ''), + version: 1, + } + ) + ), + importApiUsersDev: ecs.Secret.fromSsmParameter( + ssm.StringParameter.fromSecureStringParameterAttributes( + this, + `${APP_NAME}ImportApiUsers`, + { + parameterName: 'DPDASH_IMPORT_API_USERS' + (IS_DEV ? '_DEV' : ''), + version: 1, + } + ) + ), + importApiKeysDev: ecs.Secret.fromSsmParameter( + ssm.StringParameter.fromSecureStringParameterAttributes( + this, + `${APP_NAME}ImportApiKeysDev`, + { + parameterName: 'DPDASH_IMPORT_API_KEYS' + (IS_DEV ? '_DEV' : ''), + version: 1, + } + ) + ), + } + const vpc = new ec2.Vpc(this, `${APP_NAME}Vpc`, { + availabilityZones: [`${cdk.Aws.REGION}a`, `${cdk.Aws.REGION}b`], + }) + + const ddbPassSecret = new secrets_manager.Secret( + this, + 'DocumentDB Password', + { + secretName: 'DPDASH_MONGODB_ADMIN_PASSWORD' + (IS_DEV ? '_DEV' : ''), + generateSecretString: { + excludePunctuation: true, + excludeCharacters: "/¥'%:;{}", + }, + } + ) + + const mongoCluster = new docdb.DatabaseCluster( + this, + `${APP_NAME}DatabaseDbCluster`, + { + vpc: vpc, + masterUser: { + username: 'dpdash', + password: ddbPassSecret.secretValue, + }, + instances: 1, + instanceType: ec2.InstanceType.of( + ec2.InstanceClass.MEMORY5, + ec2.InstanceSize.LARGE + ), + vpcSubnets: { + subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, + }, + } + ) + + const dpdashRepository = ecr.Repository.fromRepositoryName( + this, + `${APP_NAME}DpdashRepository`, + 'dpdash' + ) + + const appTaskDefinition = new ecs.FargateTaskDefinition( + this, + `${APP_NAME}AppTaskDefinition`, + { + memoryLimitMiB: process.env.DEV_APP_MEMORY + ? Number(process.env.DEV_APP_MEMORY) + : 2048, + cpu: process.env.DEV_APP_CPU ? Number(process.env.DEV_APP_CPU) : 1024, + family: IS_DEV ? 'dpDashDevTaskDefinition' : 'dpDashTaskDefinition', + taskRole: new iam.Role(this, `${APP_NAME}AppTaskRole`, { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + inlinePolicies: { + readDbPassword: new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [ddbPassSecret.secretArn], + }), + ], + }), + sendEmail: new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: ['ses:SendEmail', 'ses:SendRawEmail'], + resources: [sesIdentityArn], + }), + ], + }), + }, + }), + } + ) + + appTaskDefinition.addContainer(`${APP_NAME}AppContainer`, { + image: ecs.ContainerImage.fromEcrRepository(dpdashRepository, 'latest'), + portMappings: [{ containerPort: 8000 }], + environment: { + MONGODB_HOST: mongoCluster.clusterEndpoint.hostname, + MONGODB_USER: 'dpdash', + ADMIN_EMAIL: process.env.ADMIN_EMAIL, + EMAIL_SENDER: process.env.EMAIL_SENDER, + HOME_URL: `https://${process.env.BASE_DOMAIN}/admin`, + }, + secrets: { + MONGODB_PASSWORD: ecs.Secret.fromSecretsManager(ddbPassSecret), + SESSION_SECRET: secrets.sessionSecretDev, + IMPORT_API_USERS: secrets.importApiUsersDev, + IMPORT_API_KEYS: secrets.importApiKeysDev, + }, + logging: ecs.LogDrivers.awsLogs({ + streamPrefix: `${APP_NAME}AppContainer`, + }), + }) + + const dpDashServiceSg = new ec2.SecurityGroup( + this, + `${APP_NAME}ServiceSG`, + { + vpc: vpc, + allowAllOutbound: true, + } + ) + + const dpDashService = + new ecs_patterns.ApplicationLoadBalancedFargateService( + this, + `${APP_NAME}AppService`, + { + serviceName: IS_DEV ? 'dpDashDevService' : 'dpDashService', + loadBalancerName: IS_DEV ? 'dpDashDevService' : 'dpDashLoadBalancer', + cluster: new ecs.Cluster(this, `${APP_NAME}Cluster`, { + vpc, + clusterName: IS_DEV ? 'dpDashDevCluster' : 'dpDashCluster', + }), + taskDefinition: appTaskDefinition, + securityGroups: [dpDashServiceSg], + assignPublicIp: true, + publicLoadBalancer: true, + redirectHTTP: true, + certificate: certificate_manager.Certificate.fromCertificateArn( + this, + `${APP_NAME}Certificate`, + certArn + ), + taskSubnets: { + subnets: vpc.publicSubnets.concat(vpc.privateSubnets), + }, + } + ) + + const mongoClusterSecurityGroup = ec2.SecurityGroup.fromSecurityGroupId( + this, + `${APP_NAME}MongoSG`, + mongoCluster.securityGroupId, + { + mutable: false, + } + ) + + mongoClusterSecurityGroup.addIngressRule( + ec2.Peer.securityGroupId(dpDashServiceSg.securityGroupId), + ec2.Port.tcp(27017) + ) + } +} diff --git a/cdk_lib/test/fixtures.ts b/cdk_lib/test/fixtures.ts new file mode 100644 index 00000000..2c49c89b --- /dev/null +++ b/cdk_lib/test/fixtures.ts @@ -0,0 +1,16 @@ +import { Template } from 'aws-cdk-lib/assertions' +import * as cdk from 'aws-cdk-lib' +import { Construct } from 'constructs' + +type StackConstructor = new ( + construct: Construct, + id: string +) => T + +export const createTemplate = ( + stackConstructor: StackConstructor +) => { + const app = new cdk.App() + const stack = new stackConstructor(app, 'StackUnderTest') + return Template.fromStack(stack) +} diff --git a/config.schema b/config.schema deleted file mode 100755 index 6f650a61..00000000 --- a/config.schema +++ /dev/null @@ -1,50 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Configuration", - "description": "DPdash configuration file", - "type": "array", - "items": { - "title": "row", - "description": "Configuration file row", - "type": "object", - "properties": { - "category": { - "description": "Category name", - "type": "string", - "pattern": "^[0-9a-zA-Z]+$" - }, - "analysis": { - "description": "Assessment name", - "type": "string", - "pattern": "^[0-9a-zA-Z_]+$" - }, - "variable": { - "description": "Variable description", - "type": "string", - "pattern": "^[0-9a-zA-Z_]+$" - }, - "label": { - "description": "Label", - "type": "string", - "pattern": "^[0-9a-zA-Z_]+$" - }, - "range": { - "description": "Tick marks", - "type": "array", - "uniqueItems": true, - "items": { - "type": "number" - } - }, - "colorbar": { - "description": "Color bar", - "enum": ["YlGn", "RdYlBu", "RdBu"] - }, - "text" : { - "description" : "Show number", - "type" : "boolean" - } - }, - "required": ["category", "analysis", "variable", "label", "range", "text"] - } -} diff --git a/config/networks.json b/config/networks.json new file mode 100644 index 00000000..e1dc462d --- /dev/null +++ b/config/networks.json @@ -0,0 +1,36 @@ +{ + "SITES_BY_NETWORK": { + "PRESCIENT": ["ME", "CG", "JE", "CP", "BM", "ST", "LS", "GW", "SG", "HK"], + "ProNET": [ + "LA", + "OR", + "BI", + "NL", + "NC", + "SD", + "CA", + "YA", + "SF", + "PA", + "SI", + "PI", + "NN", + "IR", + "TE", + "GA", + "WU", + "HA", + "MT", + "KC", + "PV", + "MA", + "CM", + "MU", + "SH", + "SL", + "OH", + "UR", + "CU" + ] + } +} diff --git a/config/vars.json b/config/vars.json new file mode 100644 index 00000000..b8a5b0d3 --- /dev/null +++ b/config/vars.json @@ -0,0 +1,14 @@ +{ + "N_A": "N/A", + "TOTAL_LABEL": "Total", + "TOTALS": "Totals", + "DISALLOWED_STUDIES": ["combined", "files", "ProNET"], + "FILTER_CATEGORIES": { + "chrcrit_part": "Cohort", + "included_excluded": "Included Criteria", + "sex_at_birth": "Sex At Birth", + "sites": "Sites", + "networks": "Networks", + "recruitment_status": "Recruitment Status" + } +} diff --git a/constants/index.js b/constants/index.js new file mode 100644 index 00000000..d7aed4b2 --- /dev/null +++ b/constants/index.js @@ -0,0 +1,62 @@ +import { SITES_BY_NETWORK } from './networks' +import { + ADMIN_TABLE_COLUMN_NUMBER, + ADMIN_TABLE_MAX_WIDTH, + TABLE_ROW_HEIGHT, + baseGridWidth, + baseInnerWidth, + colors, + DRAWER_WIDTH, + presetColors, + MIN_WIDTH, +} from './styles' +import { THEME, borderRadius, fontSize, lineHeight } from './theme' +import { + ADMIN_ROLE, + DATA_URL_PATTERN, + DATE_FORMAT, + DISALLOWED_STUDIES, + EMAIL_REGEX, + FILTER_CATEGORIES, + NETWORKS_FILTER_KEY, + N_A, + NOTIFICATION_DEFAULT, + ROLE_OPTIONS, + SAFE_URL_PATTERN, + SITES_FILTER_KEY, + SORT_DIRECTION, + TOTAL_LABEL, + TOTALS, +} from './vars' + +export { + ADMIN_ROLE, + ADMIN_TABLE_COLUMN_NUMBER, + ADMIN_TABLE_MAX_WIDTH, + baseGridWidth, + baseInnerWidth, + borderRadius, + colors, + DATA_URL_PATTERN, + DATE_FORMAT, + DRAWER_WIDTH, + DISALLOWED_STUDIES, + EMAIL_REGEX, + FILTER_CATEGORIES, + fontSize, + lineHeight, + MIN_WIDTH, + N_A, + NETWORKS_FILTER_KEY, + NOTIFICATION_DEFAULT, + presetColors, + ROLE_OPTIONS, + SAFE_URL_PATTERN, + SITES_BY_NETWORK, + SITES_FILTER_KEY, + SORT_DIRECTION, + TABLE_ROW_HEIGHT, + TOTAL_LABEL, + TOTALS, + THEME, +} diff --git a/constants/networks.js b/constants/networks.js new file mode 100644 index 00000000..174d2c85 --- /dev/null +++ b/constants/networks.js @@ -0,0 +1,3 @@ +import networksConfig from '../config/networks.json' + +export const SITES_BY_NETWORK = networksConfig.SITES_BY_NETWORK diff --git a/constants/styles.js b/constants/styles.js new file mode 100644 index 00000000..0f2ef0e1 --- /dev/null +++ b/constants/styles.js @@ -0,0 +1,45 @@ +export const colors = { + dark_sky_blue: '#97C0CE', + neutral_blue: '#5790BD', + anti_flash_white: '#EDEFFA', + white: '#ffffff', + black: 'rgba(0,0,0,0.7)', + disabled_gray: '#ccc', + configWhite: '#fefefe', + lemon_curry: '#cd9323', + new_car: '#1a53d8', + big_dip_ruby: '#9a2151', + deep_green: '#0d6416', + smokey_topaz: '#8d2808', + gold: '#FFD700', + alloy_orange: '#B95E00', + iguana_green: '#7AAA7B', + deep_saffron: '#F89235', + transparentWhite: 'rgba(255, 255, 255, 0.9)', + columbia_blue: '#c0d9e1', + gray: 'rgba(0, 0, 0, 0.54)', + gray68: '#adadad', + sasquatch: 'rgb(255, 64, 129)', + container_grey: '#f9f9f9', +} + +export const presetColors = [ + colors.dark_sky_blue, + colors.gold, + colors.alloy_orange, + colors.iguana_green, + colors.deep_saffron, + colors.new_car, + colors.lemon_curry, + colors.big_dip_ruby, + colors.deep_green, + colors.smokey_topaz, +] + +export const baseGridWidth = 300 +export const baseInnerWidth = 768 +export const TABLE_ROW_HEIGHT = 48 +export const ADMIN_TABLE_MAX_WIDTH = 960 +export const ADMIN_TABLE_COLUMN_NUMBER = 6 +export const DRAWER_WIDTH = 248 +export const MIN_WIDTH = 620 diff --git a/constants/theme.js b/constants/theme.js new file mode 100644 index 00000000..3b570758 --- /dev/null +++ b/constants/theme.js @@ -0,0 +1,69 @@ +export const THEME = { + palette: { + common: { + white: '#FFFFFF', + black: '#000000DE', + }, + primary: { + light: '#ADDBFF', + main: '#2196F3', + dark: '#096BDE', + }, + secondary: { + main: '#F4EAFF', + dark: '#5F35AE', + }, + text: { + primary: '#272930', + secondary: '#054DA7', + disabled: '#000000de', + }, + blue: { + 100: '#DDF1FF', + }, + grey: { + A100: '#81848F', + A200: '#646872', + A300: '#EEEFF0', + A400: '#0000008f', + A700: '#000000cc', + 100: '#DDDEE0', + 400: '#484848', + }, + black: { + A100: 'rgba(0, 0, 0, 0.87)', + }, + purple: { + 100: '#F4EAFF', + 600: '#5F35AE', + }, + green: { + 500: '#5FD85F', + }, + error: { + main: '#D32F2F', + light: '#FDEDED', + }, + }, +} + +export const fontSize = { + 9: '0.56rem', + 12: '0.75rem', + 14: '0.875rem', + 16: '1rem', + 18: '1.15rem', + 20: '1.20rem', +} + +export const lineHeight = { + 21: '21px', + 28: '28px', + 56: '56.02px', +} + +export const borderRadius = { + 8: '8px', + 24: '24px', + 50: '50%', +} diff --git a/constants/vars.js b/constants/vars.js new file mode 100644 index 00000000..6cfc86c6 --- /dev/null +++ b/constants/vars.js @@ -0,0 +1,38 @@ +import varsConfig from '../config/vars.json' + +export const { + N_A, + TOTAL_LABEL, + TOTALS, + DISALLOWED_STUDIES, + FILTER_CATEGORIES, +} = varsConfig + +export const EMAIL_REGEX = '[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{2,4}$' +export const NOTIFICATION_DEFAULT = { + open: false, + message: '', +} +export const ROLE_OPTIONS = [ + { value: 'admin', label: 'System Admins' }, + { value: 'manager', label: 'Study Manager' }, + { value: 'member', label: 'Member' }, +] + +export const SORT_DIRECTION = { + ASC: 'ASC', + DESC: 'DESC', +} + +export const ADMIN_ROLE = 'admin' + +export const SAFE_URL_PATTERN = + /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi + +export const DATA_URL_PATTERN = + /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i + +export const DATE_FORMAT = 'MM/DD/YYYY' + +export const NETWORKS_FILTER_KEY = 'networks' +export const SITES_FILTER_KEY = 'sites' diff --git a/defaultStudyConfig.js b/defaultStudyConfig.js deleted file mode 100644 index cf1f44a1..00000000 --- a/defaultStudyConfig.js +++ /dev/null @@ -1,76 +0,0 @@ -var configs = {}; -configs.colormap = [ - { - category : "daily_survey", - analysis : "timestamp", - variable : "daily_surveyAnswers_hours_since_1", - label : "daily_survey", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "daily_survey", - analysis : "questionnaireStat", - variable : "DAILY_1_NUM_UNANSWERED", - label : "unanswered_num", - range : [0, 10], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "voice", - analysis : "timestamp", - variable : "daily_voiceRecording_hours_since_1", - label : "daily_voice", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "weekly_survey", - analysis : "timestamp", - variable : "weekly_surveyAnswers_hours_since_1", - label : "weekly_survey", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "weekly_survey", - analysis : "questionnaireStat", - variable : "WEEKLY_1_NUM_UNANSWERED", - label : "unanswered_num", - range : [0, 10], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "actigraphy", - analysis : "Geneactivwrist", - variable : "button", - label : "button", - range : [10, 50], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "balancesheet", - analysis : "balancesheetGps", - variable : "gps_count", - label : "gps_file_count", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text : true - }, - { - category : "balancesheet", - analysis : "balancesheetAccel", - variable : "accel_count", - label : "accel_file_count", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text : true - } - ]; -module.exports = configs; diff --git a/defaultUserConfig.js b/defaultUserConfig.js deleted file mode 100644 index ee65b447..00000000 --- a/defaultUserConfig.js +++ /dev/null @@ -1,1949 +0,0 @@ -var userConfig = {}; -userConfig.colormap =[ - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_00_filesize", - label : "callLog_00HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_01_filesize", - label : "callLog_01HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_02_filesize", - label : "callLog_02HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_03_filesize", - label : "callLog_03HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_04_filesize", - label : "callLog_04HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_05_filesize", - label : "callLog_05HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_06_filesize", - label : "callLog_06HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_07_filesize", - label : "callLog_07HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_08_filesize", - label : "callLog_08HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_09_filesize", - label : "callLog_09HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_10_filesize", - label : "callLog_10HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_11_filesize", - label : "callLog_11HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_12_filesize", - label : "callLog_12HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_13_filesize", - label : "callLog_13HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_14_filesize", - label : "callLog_14HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_15_filesize", - label : "callLog_15HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_16_filesize", - label : "callLog_16HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_17_filesize", - label : "callLog_17HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_18_filesize", - label : "callLog_18HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_19_filesize", - label : "callLog_19HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_20_filesize", - label : "callLog_20HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_21_filesize", - label : "callLog_21HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_22_filesize", - label : "callLog_22HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_23_filesize", - label : "callLog_23HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_00_filesize", - label : "textsLog_00HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_01_filesize", - label : "textsLog_01HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_02_filesize", - label : "textsLog_02HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_03_filesize", - label : "textsLog_03HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_04_filesize", - label : "textsLog_04HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_05_filesize", - label : "textsLog_05HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_06_filesize", - label : "textsLog_06HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_07_filesize", - label : "textsLog_07HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_08_filesize", - label : "textsLog_08HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_09_filesize", - label : "textsLog_09HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_10_filesize", - label : "textsLog_10HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_11_filesize", - label : "textsLog_11HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_12_filesize", - label : "textsLog_12HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_13_filesize", - label : "textsLog_13HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_14_filesize", - label : "textsLog_14HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_15_filesize", - label : "textsLog_15HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_16_filesize", - label : "textsLog_16HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_17_filesize", - label : "textsLog_17HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_18_filesize", - label : "textsLog_18HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_19_filesize", - label : "textsLog_19HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_20_filesize", - label : "textsLog_20HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_21_filesize", - label : "textsLog_21HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_22_filesize", - label : "textsLog_22HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_23_filesize", - label : "textsLog_23HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_00_filesize", - label : "surveyAnswers_00HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_01_filesize", - label : "surveyAnswers_01HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_02_filesize", - label : "surveyAnswers_02HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_03_filesize", - label : "surveyAnswers_03HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_04_filesize", - label : "surveyAnswers_04HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_05_filesize", - label : "surveyAnswers_05HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_06_filesize", - label : "surveyAnswers_06HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_07_filesize", - label : "surveyAnswers_07HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_08_filesize", - label : "surveyAnswers_08HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_09_filesize", - label : "surveyAnswers_09HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_10_filesize", - label : "surveyAnswers_10HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_11_filesize", - label : "surveyAnswers_11HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_12_filesize", - label : "surveyAnswers_12HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_13_filesize", - label : "surveyAnswers_13HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_14_filesize", - label : "surveyAnswers_14HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_15_filesize", - label : "surveyAnswers_15HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_16_filesize", - label : "surveyAnswers_16HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_17_filesize", - label : "surveyAnswers_17HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_18_filesize", - label : "surveyAnswers_18HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_19_filesize", - label : "surveyAnswers_19HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_20_filesize", - label : "surveyAnswers_20HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_21_filesize", - label : "surveyAnswers_21HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_22_filesize", - label : "surveyAnswers_22HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_23_filesize", - label : "surveyAnswers_23HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_00_filesize", - label : "voiceRecording_00HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_01_filesize", - label : "voiceRecording_01HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_02_filesize", - label : "voiceRecording_02HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_03_filesize", - label : "voiceRecording_03HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_04_filesize", - label : "voiceRecording_04HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_05_filesize", - label : "voiceRecording_05HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_06_filesize", - label : "voiceRecording_06HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_07_filesize", - label : "voiceRecording_07HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_08_filesize", - label : "voiceRecording_08HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_09_filesize", - label : "voiceRecording_09HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_10_filesize", - label : "voiceRecording_10HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_11_filesize", - label : "voiceRecording_11HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_12_filesize", - label : "voiceRecording_12HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_13_filesize", - label : "voiceRecording_13HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_14_filesize", - label : "voiceRecording_14HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_15_filesize", - label : "voiceRecording_15HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_16_filesize", - label : "voiceRecording_16HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_17_filesize", - label : "voiceRecording_17HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_18_filesize", - label : "voiceRecording_18HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_19_filesize", - label : "voiceRecording_19HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_20_filesize", - label : "voiceRecording_20HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_21_filesize", - label : "voiceRecording_21HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_22_filesize", - label : "voiceRecording_22HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_23_filesize", - label : "voiceRecording_23HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_00_filesize", - label : "powerState_00HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_01_filesize", - label : "powerState_01HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_02_filesize", - label : "powerState_02HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_03_filesize", - label : "powerState_03HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_04_filesize", - label : "powerState_04HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_05_filesize", - label : "powerState_05HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_06_filesize", - label : "powerState_06HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_07_filesize", - label : "powerState_07HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_08_filesize", - label : "powerState_08HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_09_filesize", - label : "powerState_09HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_10_filesize", - label : "powerState_10HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_11_filesize", - label : "powerState_11HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_12_filesize", - label : "powerState_12HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_13_filesize", - label : "powerState_13HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_14_filesize", - label : "powerState_14HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_15_filesize", - label : "powerState_15HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_16_filesize", - label : "powerState_16HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_17_filesize", - label : "powerState_17HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_18_filesize", - label : "powerState_18HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_19_filesize", - label : "powerState_19HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_20_filesize", - label : "powerState_20HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_21_filesize", - label : "powerState_21HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_22_filesize", - label : "powerState_22HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_23_filesize", - label : "powerState_23HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_00_filesize", - label : "gps_00HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_01_filesize", - label : "gps_01HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_02_filesize", - label : "gps_02HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_03_filesize", - label : "gps_03HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_04_filesize", - label : "gps_04HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_05_filesize", - label : "gps_05HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_06_filesize", - label : "gps_06HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_07_filesize", - label : "gps_07HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_08_filesize", - label : "gps_08HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_09_filesize", - label : "gps_09HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_10_filesize", - label : "gps_10HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_11_filesize", - label : "gps_11HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_12_filesize", - label : "gps_12HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_13_filesize", - label : "gps_13HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_14_filesize", - label : "gps_14HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_15_filesize", - label : "gps_15HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_16_filesize", - label : "gps_16HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_17_filesize", - label : "gps_17HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_18_filesize", - label : "gps_18HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_19_filesize", - label : "gps_19HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_20_filesize", - label : "gps_20HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_21_filesize", - label : "gps_21HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_22_filesize", - label : "gps_22HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_23_filesize", - label : "gps_23HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_00_filesize", - label : "accel_00HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_01_filesize", - label : "accel_01HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_02_filesize", - label : "accel_02HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_03_filesize", - label : "accel_03HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_04_filesize", - label : "accel_04HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_05_filesize", - label : "accel_05HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_06_filesize", - label : "accel_06HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_07_filesize", - label : "accel_07HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_08_filesize", - label : "accel_08HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_09_filesize", - label : "accel_09HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_10_filesize", - label : "accel_10HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_11_filesize", - label : "accel_11HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_12_filesize", - label : "accel_12HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_13_filesize", - label : "accel_13HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_14_filesize", - label : "accel_14HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_15_filesize", - label : "accel_15HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_16_filesize", - label : "accel_16HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_17_filesize", - label : "accel_17HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_18_filesize", - label : "accel_18HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_19_filesize", - label : "accel_19HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_20_filesize", - label : "accel_20HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_21_filesize", - label : "accel_21HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_22_filesize", - label : "accel_22HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_23_filesize", - label : "accel_23HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_00_filesize", - label : "wifiLog_00HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_01_filesize", - label : "wifiLog_01HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_02_filesize", - label : "wifiLog_02HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_03_filesize", - label : "wifiLog_03HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_04_filesize", - label : "wifiLog_04HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_05_filesize", - label : "wifiLog_05HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_06_filesize", - label : "wifiLog_06HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_07_filesize", - label : "wifiLog_07HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_08_filesize", - label : "wifiLog_08HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_09_filesize", - label : "wifiLog_09HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_10_filesize", - label : "wifiLog_10HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_11_filesize", - label : "wifiLog_11HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_12_filesize", - label : "wifiLog_12HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_13_filesize", - label : "wifiLog_13HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_14_filesize", - label : "wifiLog_14HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_15_filesize", - label : "wifiLog_15HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_16_filesize", - label : "wifiLog_16HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_17_filesize", - label : "wifiLog_17HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_18_filesize", - label : "wifiLog_18HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_19_filesize", - label : "wifiLog_19HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_20_filesize", - label : "wifiLog_20HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_21_filesize", - label : "wifiLog_21HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_22_filesize", - label : "wifiLog_22HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_23_filesize", - label : "wifiLog_23HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_00_filesize", - label : "bluetoothLog_00HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_01_filesize", - label : "bluetoothLog_01HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_02_filesize", - label : "bluetoothLog_02HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_03_filesize", - label : "bluetoothLog_03HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_04_filesize", - label : "bluetoothLog_04HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_05_filesize", - label : "bluetoothLog_05HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_06_filesize", - label : "bluetoothLog_06HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_07_filesize", - label : "bluetoothLog_07HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_08_filesize", - label : "bluetoothLog_08HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_09_filesize", - label : "bluetoothLog_09HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_10_filesize", - label : "bluetoothLog_10HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_11_filesize", - label : "bluetoothLog_11HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_12_filesize", - label : "bluetoothLog_12HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_13_filesize", - label : "bluetoothLog_13HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_14_filesize", - label : "bluetoothLog_14HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_15_filesize", - label : "bluetoothLog_15HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_16_filesize", - label : "bluetoothLog_16HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_17_filesize", - label : "bluetoothLog_17HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_18_filesize", - label : "bluetoothLog_18HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_19_filesize", - label : "bluetoothLog_19HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_20_filesize", - label : "bluetoothLog_20HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_21_filesize", - label : "bluetoothLog_21HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_22_filesize", - label : "bluetoothLog_22HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_23_filesize", - label : "bluetoothLog_23HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - } -]; -module.exports = userConfig; - diff --git a/dev.rabbitmq.Dockerfile b/dev.rabbitmq.Dockerfile new file mode 100644 index 00000000..85f1e4e5 --- /dev/null +++ b/dev.rabbitmq.Dockerfile @@ -0,0 +1,18 @@ +FROM rabbitmq + +ADD rabbitmq-init.sh /rabbitmq-init.sh +RUN chmod +x /rabbitmq-init.sh + +ARG RABBIT_USERNAME=something +ENV RABBIT_USERNAME=${RABBIT_USERNAME} + +ARG RABBIT_PASSWORD=something +ENV RABBIT_PASSWORD=${RABBIT_PASSWORD} + +ENV RABBITMQ_PID_FILE=/var/lib/rabbitmq/mnesia/rabbitmq + + +EXPOSE 5671 5672 + +# Define default command +CMD ["/rabbitmq-init.sh"] diff --git a/dev.server.Dockerfile b/dev.server.Dockerfile new file mode 100644 index 00000000..6b37e78c --- /dev/null +++ b/dev.server.Dockerfile @@ -0,0 +1,12 @@ +FROM node:22 + +COPY . /src + +WORKDIR /src + +RUN npm install + +CMD [ "npm", "run", "dev" ] + +EXPOSE 8000 35729 + diff --git a/doc/assets/aws_setup/01_request_certificate/create_certificate_01.png b/doc/assets/aws_setup/01_request_certificate/create_certificate_01.png new file mode 100644 index 00000000..2b519f39 Binary files /dev/null and b/doc/assets/aws_setup/01_request_certificate/create_certificate_01.png differ diff --git a/doc/assets/aws_setup/01_request_certificate/create_certificate_02.png b/doc/assets/aws_setup/01_request_certificate/create_certificate_02.png new file mode 100644 index 00000000..e2d2443c Binary files /dev/null and b/doc/assets/aws_setup/01_request_certificate/create_certificate_02.png differ diff --git a/doc/assets/aws_setup/01_request_certificate/create_certificate_03.png b/doc/assets/aws_setup/01_request_certificate/create_certificate_03.png new file mode 100644 index 00000000..9f8f0440 Binary files /dev/null and b/doc/assets/aws_setup/01_request_certificate/create_certificate_03.png differ diff --git a/doc/assets/aws_setup/01_request_certificate/create_certificate_04.png b/doc/assets/aws_setup/01_request_certificate/create_certificate_04.png new file mode 100644 index 00000000..a06d64bf Binary files /dev/null and b/doc/assets/aws_setup/01_request_certificate/create_certificate_04.png differ diff --git a/doc/assets/aws_setup/01_request_certificate/create_certificate_05.png b/doc/assets/aws_setup/01_request_certificate/create_certificate_05.png new file mode 100644 index 00000000..a7af0fb6 Binary files /dev/null and b/doc/assets/aws_setup/01_request_certificate/create_certificate_05.png differ diff --git a/doc/assets/aws_setup/01_request_certificate/create_certificate_06.png b/doc/assets/aws_setup/01_request_certificate/create_certificate_06.png new file mode 100644 index 00000000..c6d2fff0 Binary files /dev/null and b/doc/assets/aws_setup/01_request_certificate/create_certificate_06.png differ diff --git a/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_01.png b/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_01.png new file mode 100644 index 00000000..301ce5d3 Binary files /dev/null and b/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_01.png differ diff --git a/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_02.png b/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_02.png new file mode 100644 index 00000000..a5175b7e Binary files /dev/null and b/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_02.png differ diff --git a/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_03.png b/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_03.png new file mode 100644 index 00000000..b7c44dbe Binary files /dev/null and b/doc/assets/aws_setup/02_verify_email_domain/verify_email_domain_03.png differ diff --git a/doc/assets/aws_setup/03_create_github_role/create_github_role_01.png b/doc/assets/aws_setup/03_create_github_role/create_github_role_01.png new file mode 100644 index 00000000..8a75d58c Binary files /dev/null and b/doc/assets/aws_setup/03_create_github_role/create_github_role_01.png differ diff --git a/doc/assets/aws_setup/03_create_github_role/create_github_role_02.png b/doc/assets/aws_setup/03_create_github_role/create_github_role_02.png new file mode 100644 index 00000000..b184c0b0 Binary files /dev/null and b/doc/assets/aws_setup/03_create_github_role/create_github_role_02.png differ diff --git a/doc/assets/aws_setup/03_create_github_role/create_github_role_03.png b/doc/assets/aws_setup/03_create_github_role/create_github_role_03.png new file mode 100644 index 00000000..f4043cae Binary files /dev/null and b/doc/assets/aws_setup/03_create_github_role/create_github_role_03.png differ diff --git a/doc/assets/aws_setup/03_create_github_role/create_github_role_04.png b/doc/assets/aws_setup/03_create_github_role/create_github_role_04.png new file mode 100644 index 00000000..51549fcb Binary files /dev/null and b/doc/assets/aws_setup/03_create_github_role/create_github_role_04.png differ diff --git a/doc/assets/aws_setup/06_set_github_variables/set_github_variables_01.png b/doc/assets/aws_setup/06_set_github_variables/set_github_variables_01.png new file mode 100644 index 00000000..6b4ac741 Binary files /dev/null and b/doc/assets/aws_setup/06_set_github_variables/set_github_variables_01.png differ diff --git a/doc/assets/aws_setup/06_set_github_variables/set_github_variables_02.png b/doc/assets/aws_setup/06_set_github_variables/set_github_variables_02.png new file mode 100644 index 00000000..80d05968 Binary files /dev/null and b/doc/assets/aws_setup/06_set_github_variables/set_github_variables_02.png differ diff --git a/doc/assets/aws_setup/06_set_github_variables/set_github_variables_03.png b/doc/assets/aws_setup/06_set_github_variables/set_github_variables_03.png new file mode 100644 index 00000000..44d0d678 Binary files /dev/null and b/doc/assets/aws_setup/06_set_github_variables/set_github_variables_03.png differ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..0bfe1811 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,75 @@ +services: + # Nginx Proxy Manager instead of standard nginx + nginx-proxy-manager: + image: 'jc21/nginx-proxy-manager:latest' + restart: unless-stopped + ports: + - 80:80 + - 443:443 + - 81:81 # Admin UI + volumes: + - npm_data:/data + - npm_letsencrypt:/etc/letsencrypt + - ./npm/config.json:/app/config/production.json + depends_on: + - node-app + networks: + - default + - app-tier + environment: + # Default credentials: admin@example.com / changeme + DB_SQLITE_FILE: '/data/database.sqlite' + + node-app: + build: + dockerfile: Dockerfile + context: . + depends_on: + - mongodb + env_file: .env + networks: + - app-tier + # Expose port for Nginx Proxy Manager to access + ports: + - 8000:8000 + environment: + - HOME_URL=https://dpdash.local + + mongodb: + image: mongo:5 + restart: unless-stopped + environment: + MONGO_INITDB_ROOT_USERNAME: ${MONGODB_ADMIN_USER} + MONGO_INITDB_ROOT_PASSWORD: ${MONGODB_ADMIN_PASSWORD} + ports: + - 27017:27017 + expose: + - 27017 + volumes: + - mongodb:/data/db + networks: + - app-tier + + # SMTP testing server (optional) + mailcatcher: + image: sj26/mailcatcher + restart: unless-stopped + ports: + - 1080:1080 # Web UI + - 1025:1025 # SMTP port + command: --smtp-ip=0.0.0.0 --smtp-port=1025 --http-ip=0.0.0.0 --http-port=1080 + networks: + - app-tier + profiles: + - smtp + +networks: + default: + driver: bridge + app-tier: + +volumes: + mongodb: + name: dpdash-mongodb + npm_data: + npm_letsencrypt: diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 69fe55ec..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SOURCEDIR = source -BUILDDIR = build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/source/building.rst b/docs/source/building.rst deleted file mode 100644 index 727b6b9f..00000000 --- a/docs/source/building.rst +++ /dev/null @@ -1,90 +0,0 @@ -Building a DPdash image -======================= -.. note:: - If you intend to build DPdash on an operating system other than Linux, - head over to the `Vagrant section <#vagrant>`_. - -This guide will show you how to build a DPdash image from the ground up. - -Building --------- -First, clone the DPdash repository and change into the ``singularity`` directory :: - - git clone https://github.com/harvard-nrg/dpdash.git - cd dpdash/singularity - -Now, run the ``singularity build`` command. This requires ``sudo`` privilege :: - - sudo /usr/local/bin/singularity build dpdash.sif Singularity - -.. attention:: - While DPdash on GitHub is under development, you may be prompted for your - GitHub username and password during this build process. - -Starting and stopping ---------------------- -Once you have your ``dpdash.sif`` image, you'll want to head over to the -`quick start guide `_ to learn how to initialize, start, -and stop DPdash. - -Vagrant -------- -Building DPdash as a `Singularity `_ container -requires Linux. `Vagrant `_ offers a fast and -reproducible way to stand up a Linux virtual machine. If you take this route, -you can use the following ``Vagrantfile`` to install Singularity on CentOS and -forward port ``8000`` :: - - Vagrant.configure("2") do |config| - config.vm.network "forwarded_port", guest: 8000, host: 8000 - config.vm.box = "bento/centos-7.6" - config.vm.provider "virtualbox" do |vb| - vb.memory = "1024" - end - config.vm.provision "shell", inline: <<-SHELL - yum -y install libgpgme11-devel libseccomp-devel pkgconfig \ - openssl-devel libuuid-devel gcc git patch vim autoconf \ - automake libtool squashfs-tools - cd /tmp - if [ ! -f '/usr/local/bin/singularity' ]; then - # install go - export VERSION=1.12 OS=linux ARCH=amd64 - wget -q https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz - sudo tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz - rm go$VERSION.$OS-$ARCH.tar.gz - echo 'export PATH=/usr/local/go/bin:$PATH' >> ~/.bashrc - source ~/.bashrc - # install singularity - export VERSION=3.3.0 - wget -q https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz - tar -xzf singularity-${VERSION}.tar.gz - cd singularity - ./mconfig - make -C builddir - sudo make -C builddir install - fi - SHELL - end - -vagrant proxy-conf -~~~~~~~~~~~~~~~~~~ -If you're going to build this Vagrant box behind a web proxy, you're going to -need the ``vagrant-proxyconf`` plugin :: - - vagrant plugin install vagrant-proxyconf - -and you will have to add the following ``config.proxy`` directives to the -``Vagrantfile`` :: - - config.proxy.http = "..." - config.proxy.https = "..." - -cookies -~~~~~~~ -For good reason, `Express.js `_ will **not** send cookies over -unencrypted HTTP. If you're just kicking the tires on DPdash and you don't care about -sending cookies over HTTP, you must change the cookie security policy within the DPdash -configuration file :: - - config.session.cookie.secure = false; - diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index eebafd08..00000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,173 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- Project information ----------------------------------------------------- - -project = u'DPdash' -copyright = u'2019, Neuroinformatics Research Group' -author = u'Neuroinformatics Research Group' - -# The short X.Y version -version = u'' -# The full version, including alpha/beta/rc tags -release = u'' - - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['ntemplates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'alabaster' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['nstatic'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = 'DPdashdoc' - - -# -- Options for LaTeX output ------------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'DPdash.tex', u'DPdash Documentation', - u'Neuroinformatics Research Group', 'manual'), -] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'dpdash', u'DPdash Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'DPdash', u'DPdash Documentation', - author, 'DPdash', 'One line description of project.', - 'Miscellaneous'), -] - - -# -- Options for Epub output ------------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = project - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -# -# epub_identifier = '' - -# A unique identification for the text. -# -# epub_uid = '' - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ['search.html'] diff --git a/docs/source/images/reverse_proxy.png b/docs/source/images/reverse_proxy.png deleted file mode 100644 index 7c6745a4..00000000 Binary files a/docs/source/images/reverse_proxy.png and /dev/null differ diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index bd09b976..00000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,19 +0,0 @@ -DPdash: Digital Phenotyping Dashboard -===================================== - -Guide -^^^^^ - -.. toctree:: - :maxdepth: 2 - - quick_start - building - tips_tricks - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/source/quick_start.rst b/docs/source/quick_start.rst deleted file mode 100644 index 05cf47e0..00000000 --- a/docs/source/quick_start.rst +++ /dev/null @@ -1,200 +0,0 @@ -Quick Start Guide -================= -This quick start guide will show you how to download, initialize, and run DPdash -as a standalone Singularity container instance. - -.. note:: - Instead of downloading a DPdash image, you can build one yourself. To do that, - please follow the `building tutorial `_. - -Install Singularity -------------------- -.. attention:: - Installing Singularity will require administrative privilege. - -Follow the official Singularity `installation guide `_. -We highly recommend using Singularity version 3.0 or greater. - -Download the application image ------------------------------- -Submit a request for the latest DPdash ``Singularity Image Format`` image by -sending an email to :: - - dpdash@neuroinfo.org - -Or you can create the DPdash image yourself by following the -`building tutorial `_. - -Create data persistence directories ------------------------------------ -.. warning:: - When you stop a container, all data saved within the container will be - lost unless it is saved to a bind mount. - -DPdash requires two directories for successful operation, a `data directory <#data-directory>`_ -to store files that should be scanned and imported into the DPdash database, and a -`state directory <#state-directory>`_ to persist the DPdash database files, log -files, SSL certificates, and configuration files. - -data directory -~~~~~~~~~~~~~~ -The DPdash importer process will periodically crawl and import any DPdash -formatted text files that live under the ``data`` directory. DPdash administrators -should create a dedicated directory for these files. This directory will be shared -into the DPdash container at runtime :: - - mkdir data - -This directory can exist anywhere on the host filesystem. Administrators are -free to create any non-DPdash files or subdirectories under this directory, -however it should be understood that every filename will be inspected by the -DPdash importer process unless the file is under a directory named ``raw``. - -To keep your files neatly organized, we recommend creating a ``PHOENIX`` style -directory tree. Generally, there should be a directory for each study and within -each study directory additional subdirectories for each subject :: - - data - └── STUDY_A - └── SUBJECT_01 - -.. note:: - Remember that all file names under the ``data`` directory will be inspected - by the DPdash file importer unless the file is stored under a subdirectory - named ``raw``. - -metadata files -~~~~~~~~~~~~~~ -Within the ``data`` directory, DPdash administrators must create metadata files -for each study. The metadata file name should contain the study name followed by -``_metadata.csv``. - -The following is the recommended metadata CSV columns and format requirements:: - - Active,Study,Subject ID,Consent Date - 0,STUDY_A,SUBJECT_01,2019-01-01 - -Here are the formatting requirements for each column - -+--------------+------------------------------+--------------+------------+ -| Column | Description | Format | Example | -+==============+==============================+==============+============+ -| Active | Indicates participant status | Boolean | 1 | -+--------------+------------------------------+--------------+------------+ -| Study | Study ID | Alphanumeric | STUDY_A | -+--------------+------------------------------+--------------+------------+ -| Subject ID | Subject ID | Alphanumeric | SUBJECT_01 | -+--------------+------------------------------+--------------+------------+ -| Consent Date | Consent date | ``%Y-%m-%d`` | 2019-01-01 | -+--------------+------------------------------+--------------+------------+ - -The DPdash importer process will read these metadata files and use the -``Consent Date`` field to add relative date-specific information to each -dashboard page. - -state directory -~~~~~~~~~~~~~~~ -DPdash administrators must create a dedicated directory to persist the DPdash -state. DPdash state includes any database files, log files, configuration files, -and internally used SSL certificates. This directory will be shared into the -DPdash container at runtime :: - - mkdir state - -This directory can exist anywhere on the host filesystem. - -Initialize DPdash ------------------ -Before you can start DPdash, there are several steps that must be performed -by you, **within your environment**. These steps include initializing the -database, initializing the queuing system, generating SSL certificates, -generating any service-related usernames, passwords, and so on. The DPdash -repository includes an initialization script to streamline this task. - -clone the repository -~~~~~~~~~~~~~~~~~~~~ -.. note:: - If you haven’t downloaded or generated a DPdash application image, please - follow the `instructions above <#download-the-application-image>`_. - -Clone the DPdash repository, change into the ``singularity`` directory, and -copy (or move) your ``dpdash.sif`` image file into that directory :: - - git clone https://github.com/harvard-nrg/dpdash.git - cd dpdash/singularity - cp /path/to/dpdash.sif . - -run the initialization script -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The initialization script will configure the database, queuing system, generate -any necessary SSL certificates, any necessary service-related usernames, passwords, -and render the templated configuration files (exhale). - -.. attention:: - You cannot resume DPdash initialization from a failed state. If you encounter - any issue with this step and need to re-run ``init.sh``, be sure to delete the - entire contents of the `state directory <#state-directory>`_. - -To begin the initialization process, execute the ``init.sh`` script. In the command -below, be sure to replace ``${data}`` with the absolute path to your -`data directory <#data-directory>`_ and ``${state}`` with the absolute path to your -`state directory <#state-directory>`_ :: - - bash init.sh ${data} ${state} - -Starting --------- -To start DPdash, simply start an instance of the ``dpdash.sif``. In the command -below, be sure to replace ``${data}`` with the absolute path to your -`data directory <#data-directory>`_ and ``${state}`` with the absolute path to your -`state directory <#state-directory>`_ :: - - singularity instance start \ - -B ${state}:/data \ - –B ${data}:${data} \ - dpdash.sif \ - dpdash - -.. note:: - The last argument to ``singularity instance start`` is the name you will use - to refer to the container instance e.g., ``instance://dpash``. - -Stopping --------- -To stop DPdash, execute the ``quit.sh`` script within the container. This will stop -any databases and other services gracefully :: - - singularity exec instance://dpdash /data/scripts/quit.sh - -Now you can safely stop the Singularity instance :: - - singularity instance stop dpdash - -Setting up a reverse proxy --------------------------- -.. attention:: - Installing NGINX, copying SSL certificates under /etc, and binding to ports - below 1024 all require superuser privileges. - -By default, DPdash listens over HTTP on port ``8000`` on ``0.0.0.0``. These details -are configurable within the DPdash configuration file. It is highly recommended that -you change the network interface to the loopback ``127.0.0.1`` and use a reverse proxy. - -Your reverse proxy should accept incoming requests over HTTPS (port ``443``), on an -external network interface and forward traffic to DPdash running on ``127.0.0.1:8000`` -as illustrated below - -.. image:: images/reverse_proxy.png - :width: 900 - -We recommend that you use NGINX for your reverse proxy. To install NGINX, refer -to the `official documentation `_. -To configure NGINX as a reverse proxy, again refer to the -`documentation `_. - -.. note:: - Most web browsers will present a security warning if your application does - not provide a valid SSL certificate, or if your application provides one that - is not signed by a recognized Certificate Authority. Contact your system - administrator for a properly signed SSL certificate. - diff --git a/docs/source/tips_tricks.rst b/docs/source/tips_tricks.rst deleted file mode 100644 index 419446e0..00000000 --- a/docs/source/tips_tricks.rst +++ /dev/null @@ -1,23 +0,0 @@ -Tips and tricks -=============== -The following tips and tricks will help you troubleshoot and hack on -DPdash. - -Binding the source code ------------------------ -The ``dpdash.sif`` is a read-only Singularity image file. During the build -process, DPdash is written to a directory within the directory :: - - /sw/apps/dpdash - -If you feel the need to modify the DPdash code, you either have to build the -container in ``sandbox`` mode, or use ``-B|--bind`` to bind a local directory -containing the DPdash application source into the container :: - - singularity instance start \ - -B ${state}:/data \ - -B ${data}:${data} \ - -B /path/to/dpdash/src:/sw/apps/dpdash \ - dpdash.sif - dpdash - diff --git a/dpdash.service b/dpdash.service new file mode 100644 index 00000000..79aa65ea --- /dev/null +++ b/dpdash.service @@ -0,0 +1,19 @@ +[Unit] +Description=Gnar company developed DPdash (unstable) at https://predict-dp.mgb.org/ +After=network-online.target docker.service +Wants=network-online.target docker.service + +[Service] +User=root +Type=oneshot +RemainAfterExit=yes +WorkingDirectory=/opt/dpdash +ExecStart=docker compose up -d +ExecStop=docker compose down +KillMode=process +TimeoutSec=60 + +[Install] +WantedBy=multi-user.target + + diff --git a/jest-mongodb-config.js b/jest-mongodb-config.js new file mode 100644 index 00000000..47f858f5 --- /dev/null +++ b/jest-mongodb-config.js @@ -0,0 +1,10 @@ +module.exports = { + mongodbMemoryServerOptions: { + binary: { + skipMD5: true, + }, + instance: {}, + autoStart: false, + }, + mongoURLEnvName: 'MONGODB_URI', +} diff --git a/jestCdkConfig.js b/jestCdkConfig.js new file mode 100644 index 00000000..650c513d --- /dev/null +++ b/jestCdkConfig.js @@ -0,0 +1,3 @@ +module.exports = { + preset: 'ts-jest', +} diff --git a/jestServerConfig.js b/jestServerConfig.js new file mode 100644 index 00000000..f146ce07 --- /dev/null +++ b/jestServerConfig.js @@ -0,0 +1,4 @@ +module.exports = { + preset: '@shelf/jest-mongodb', + setupFilesAfterEnv: ['/jestServerSetup.js'], +} diff --git a/jestServerSetup.js b/jestServerSetup.js new file mode 100644 index 00000000..dc48daa8 --- /dev/null +++ b/jestServerSetup.js @@ -0,0 +1,9 @@ +import { MongoClient } from 'mongodb' + +beforeAll(async () => { + global.MONGO_INSTANCE = await MongoClient.connect(global.__MONGO_URI__) +}) + +afterAll(async () => { + await global.MONGO_INSTANCE.close() +}) diff --git a/jestSetup.js b/jestSetup.js new file mode 100644 index 00000000..74a1abe7 --- /dev/null +++ b/jestSetup.js @@ -0,0 +1,19 @@ +import '@testing-library/jest-dom' + +// Mock the SVGElement and CanvasElement methods that we use which are not +// implemented by JSDOM +Object.defineProperty(global.SVGElement.prototype, 'getBBox', { + writable: true, + value: jest.fn().mockReturnValue({ + x: 0, + y: 0, + }), +}) + +Object.defineProperty(global.HTMLCanvasElement.prototype, 'getContext', { + value: jest.fn(), +}) + +Object.defineProperty(global.HTMLFormElement.prototype, 'requestSubmit', { + value: jest.fn(), +}) diff --git a/jestUIConfig.js b/jestUIConfig.js new file mode 100644 index 00000000..dd1b03a4 --- /dev/null +++ b/jestUIConfig.js @@ -0,0 +1,6 @@ +module.exports = { + setupFilesAfterEnv: ['/jestSetup.js'], + moduleNameMapper: { + '\\.(css|less|scss|sass)$': 'identity-obj-proxy', + }, +} diff --git a/make-cert.sh b/make-cert.sh new file mode 100644 index 00000000..8d4746ee --- /dev/null +++ b/make-cert.sh @@ -0,0 +1,2 @@ +mkdir certs +openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./certs/selfsigned.key -out ./certs/selfsigned.crt -subj "/CN=[dpdash.local]" diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 00000000..b7b4a49b --- /dev/null +++ b/nginx.conf @@ -0,0 +1,15 @@ +events {} +http { + server { + listen 80; + listen 443 ssl http2; + server_name app.example.com; + ssl_certificate /etc/ssl/certs/nginx/default.crt; + ssl_certificate_key /etc/ssl/certs/nginx/default.key; + location / { + proxy_pass http://node-app:8000; + } + access_log off; + error_log /var/log/nginx/error.log error; + } +} diff --git a/package-lock.json b/package-lock.json index fa59f2f4..7e197245 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6872 +1,27668 @@ { "name": "po", - "version": "0.0.0", - "lockfileVersion": 1, + "version": "2.1.0", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "7.0.0" - } + "packages": { + "": { + "name": "po", + "version": "2.1.0", + "dependencies": { + "@aws-sdk/client-ses": "^3.437.0", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@hookform/resolvers": "^3.3.2", + "@mui/icons-material": "^5.14.15", + "@mui/material": "^5.14.15", + "@mui/x-date-pickers": "^6.18.4", + "aws-cdk-lib": "2.100.0", + "body-parser": "^1.18.3", + "classnames": "^2.2.6", + "colorbrewer": "^1.3.0", + "connect-mongo": "^5.1.0", + "constructs": "^10.0.0", + "cookie-parser": "^1.4.3", + "csv-stringify": "^6.3.0", + "d3": "^5.7.0", + "dayjs": "^1.11.10", + "debounce": "^2.0.0", + "deep-equal": "^2.2.0", + "ejs": "^3.1.9", + "express": "^4.16.4", + "express-session": "^1.15.6", + "file-saver": "^2.0.0-rc.4", + "helmet": "^7.1.0", + "mongodb": "^6.3.0", + "morgan": "^1.9.1", + "nodemailer": "^6.10.1", + "passport": "^0.7.0", + "passport-local": "^1.0.0", + "qs": "^6.11.0", + "react": "^18.2.0", + "react-colorful": "^5.5.1", + "react-dom": "^18.2.0", + "react-hook-form": "^7.45.2", + "react-router-dom": "^6.13.0", + "recharts": "^2.10.4", + "serve-favicon": "^2.5.0", + "source-map-support": "^0.5.21", + "winston": "^3.1.0", + "yup": "^1.3.3" + }, + "devDependencies": { + "@babel/cli": "^7.13.16", + "@babel/core": "^7.14.3", + "@babel/eslint-parser": "^7.24.1", + "@babel/node": "^7.18.5", + "@babel/plugin-proposal-decorators": "^7.13.15", + "@babel/plugin-transform-react-constant-elements": "^7.13.13", + "@babel/plugin-transform-react-inline-elements": "^7.12.13", + "@babel/plugin-transform-runtime": "^7.13.15", + "@babel/preset-env": "^7.14.0", + "@babel/preset-react": "^7.13.13", + "@babel/register": "^7.13.16", + "@shelf/jest-mongodb": "^5.1.0", + "@testing-library/jest-dom": "^6.1.4", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.5.1", + "@types/jest": "^29.5.5", + "@types/node": "20.7.1", + "@types/qs": "^6.9.11", + "aws-cdk": "^2.100.0", + "babel-loader": "^9.1.3", + "babel-plugin-react-html-attrs": "^3.0.5", + "babel-polyfill": "^6.26.0", + "clean-webpack-plugin": "^4.0.0", + "concurrently": "^8.2.0", + "connect-livereload": "^0.6.1", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "dotenv": "^16.3.1", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-config-universe": "^12.0.0", + "eslint-plugin": "^1.0.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-no-only-tests": "^3.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-sort-keys-fix": "^1.1.2", + "eslint-plugin-testing-library": "^6.2.0", + "html-webpack-plugin": "^5.5.3", + "identity-obj-proxy": "^3.0.0", + "jest": "^29.2.2", + "jest-environment-jsdom": "^29.7.0", + "livereload": "^0.9.3", + "nodemon": "^3.0.2", + "prettier": "^3.2.5", + "style-loader": "^3.3.3", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "~5.2.2", + "webpack": "^5.35.1", + "webpack-cli": "^5.1.4", + "webpack-node-externals": "^3.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", + "dev": true }, - "@babel/core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.2.tgz", - "integrity": "sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/generator": "7.1.3", - "@babel/helpers": "7.1.2", - "@babel/parser": "7.1.3", - "@babel/template": "7.1.2", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.3", - "convert-source-map": "1.5.1", - "debug": "3.2.6", - "json5": "0.5.1", - "lodash": "4.17.10", - "resolve": "1.8.1", - "semver": "5.5.0", - "source-map": "0.5.7" - }, - "dependencies": { - "@babel/generator": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.3.tgz", - "integrity": "sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ==", - "dev": true, - "requires": { - "@babel/types": "7.1.3", - "jsesc": "2.5.1", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "@babel/parser": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.3.tgz", - "integrity": "sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==", - "dev": true - }, - "@babel/template": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", - "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/parser": "7.1.3", - "@babel/types": "7.1.3" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.200", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz", + "integrity": "sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==" + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", + "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.0.1.tgz", + "integrity": "sha512-DDt4SLdLOwWCjGtltH4VCST7hpOI5DzieuhGZsBpZ+AgJdSI2GCjklCXm0GCTwJG/SolkL5dtQXyUKgg9luBDg==" + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "@babel/generator": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0.tgz", - "integrity": "sha512-/BM2vupkpbZXq22l1ALO7MqXJZH2k8bKVv8Y+pABFnzWdztDB/ZLveP5At21vLz5c2YtSE6p7j2FZEsqafMz5Q==", - "dev": true, - "requires": { - "@babel/types": "7.0.0", - "jsesc": "2.5.1", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "tslib": "^1.11.1" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" - }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "7.1.0", - "@babel/types": "7.0.0" - }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "@babel/helper-builder-react-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz", - "integrity": "sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw==", - "requires": { - "@babel/types": "7.0.0", - "esutils": "2.0.2" - }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - } + "tslib": "^1.11.1" } }, - "@babel/helper-call-delegate": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", - "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "7.0.0", - "@babel/traverse": "7.1.0", - "@babel/types": "7.0.0" - }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "@babel/helper-define-map": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", - "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/types": "7.0.0", - "lodash": "4.17.10" + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.470.0.tgz", + "integrity": "sha512-oE665xfl/KwvbcNtvUxMCKwh+X3wOV5UgPrPSptK+DzUJbtL4FAP7h6QIVzUB5CkzqhQVRAmYvdf+XhfXz3T3g==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.470.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/credential-provider-node": "3.470.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/core": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", + "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", + "optional": true, + "peer": true, "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@smithy/smithy-client": "^2.1.18", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, - "requires": { - "@babel/traverse": "7.1.0", - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ses": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.437.0.tgz", + "integrity": "sha512-8aa68tNjop/R0xCstg4SVb8lZlDp0t0cOCfpCh32NiaPfngiqx89/oTyOqV/jZStgA3XbSw2bA+lLDqD5yG+9g==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.437.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.12", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0", - "@babel/template": "7.1.0", - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/client-sso": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.437.0.tgz", + "integrity": "sha512-AxlLWz9ec3b8Bt+RqRb2Q1ucGQtKrLdKDna+UTjz7AouB/jpoMiegV9NHXVX64N6YFnQnvB0UEGigXiOQE+y/g==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/client-sts": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.437.0.tgz", + "integrity": "sha512-ilLcrCVwH81UbKNpB9Vax1Fw/mNx2d/bWXkCNXPvrExO+K39VFGS/VijOuSrru2iBq844NlG3uQV8DL/nbiKdA==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-sts": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.437.0.tgz", + "integrity": "sha512-UybiJxYPvdwok5OcI9LakaHmaWZBdkX0gY8yU2n7TomYgWOwDJ88MpQgjXUJJ249PH+9/+How5H3vnFp0xJ0uQ==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.437.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", - "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.437.0.tgz", + "integrity": "sha512-FMtgEe/me68xZQsymEpMcw7OuuiHaHx/Tp5EqZP5FC0Yv1yX3qr/ncIWU2zY3a9K0iLERmzQI1g3CMd8r4sy8A==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-ini": "3.437.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.437.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.437.0.tgz", + "integrity": "sha512-kijtnyyA6/+ipOef4KACsLDUTFWDZ97DSWKU0hJFyGEfelaon6o7NNVufuVOWrBNyklNWZqvPLuwWWQCxb6fuQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.437.0", + "@aws-sdk/token-providers": "3.437.0", + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "requires": { - "@babel/types": "7.1.3" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-module-transforms": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz", - "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-simple-access": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "@babel/template": "7.1.0", - "@babel/types": "7.0.0", - "lodash": "4.17.10" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/middleware-logger": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", "dependencies": { - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" - } - }, - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/middleware-signing": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.433.0.tgz", + "integrity": "sha512-jMgA1jHfisBK4oSjMKrtKEZf0sl2vzADivkFmyZFzORpSZxBnF6hC21RjaI+70LJLcc9rSCzLgcoz5lHb9LLDg==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "@babel/helper-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", - "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", - "dev": true, - "requires": { - "lodash": "4.17.10" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/types": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-wrap-function": "7.1.0", - "@babel/template": "7.1.0", - "@babel/traverse": "7.1.0", - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/util-endpoints": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.433.0.tgz", + "integrity": "sha512-LFNUh9FH7RMtYjSjPGz9lAJQMzmJ3RcXISzc5X5k2R/9mNwMK7y1k2VAfvx+RbuDbll6xwsXlgv6QHcxVdF2zw==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" } }, - "@babel/helper-replace-supers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz", - "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "7.0.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/traverse": "7.1.0", - "@babel/types": "7.0.0" - }, + "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true } } }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "dev": true, - "requires": { - "@babel/template": "7.1.0", - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-sso": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.470.0.tgz", + "integrity": "sha512-iMXqdXuypE3OK0rggbvSz7vBGlLDG418dNidHhdaeLluMTG/GfHbh1fLOlavhYxRwrsPrtYvFiVkxXFGzXva4w==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/core": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", + "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", + "optional": true, + "peer": true, "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@smithy/smithy-client": "^2.1.18", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.470.0.tgz", + "integrity": "sha512-TP3A4t8FoFEQinm6axxduTUnlMMLpmLi4Sf00JTI2CszxLUFh/JyUhYQ5gSOoXgPFmfwVXUNKCtmR3jdP0ZGPw==", + "optional": true, + "peer": true, "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/credential-provider-node": "3.470.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-sdk-sts": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-wrap-function": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz", - "integrity": "sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/template": "7.1.0", - "@babel/traverse": "7.1.0", - "@babel/types": "7.0.0" + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/core": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", + "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/smithy-client": "^2.1.18", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "optional": true, + "peer": true, "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helpers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.2.tgz", - "integrity": "sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==", - "dev": true, - "requires": { - "@babel/template": "7.1.2", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.3" + "node_modules/@aws-sdk/core": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.436.0.tgz", + "integrity": "sha512-vX5/LjXvCejC2XUY6TSg1oozjqK6BvkE75t0ys9dgqyr5PlZyZksMoeAFHUlj0sCjhT3ziWCujP1oiSpPWY9hg==", + "dependencies": { + "@smithy/smithy-client": "^2.1.12" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.470.0.tgz", + "integrity": "sha512-c0YtiBbg4z/4iLnn3gtUtGKBZMQLRk79LjzCN6x98MpIsRTeEBL+4BHYNwFb8C+S4wVDYh2OWqjw1Su6Ues3Wg==", + "optional": true, + "peer": true, "dependencies": { - "@babel/parser": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.3.tgz", - "integrity": "sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==", - "dev": true - }, - "@babel/template": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", - "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/parser": "7.1.3", - "@babel/types": "7.1.3" - } - } + "@aws-sdk/client-cognito-identity": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "4.0.0" + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", + "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.468.0.tgz", + "integrity": "sha512-pUF+gmeCr4F1De69qEsWgnNeF7xzlLcjiGcbpO6u9k6NQdRR7Xr3wTQnQt1+3MgoIdbgoXpCfQYNZ4LfX6B/sA==", + "optional": true, + "peer": true, "dependencies": { - "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, - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "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 - }, - "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, - "requires": { - "has-flag": "3.0.0" - } - } + "@aws-sdk/types": "3.468.0", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.0.tgz", - "integrity": "sha512-SmjnXCuPAlai75AFtzv+KCBcJ3sDDWbIn+WytKw1k+wAtEy6phqI2RqKh/zAnw53i1NR8su3Ep/UoqaKcimuLg==", - "dev": true + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.470.0.tgz", + "integrity": "sha512-eF22iPO6J2jY+LbuTv5dW0hZBmi6ksRDFFd/zT6TLasrzH2Ex+gAfN3c7rFHF+XAubL0JXFUKFA3UAwoZpO9Zg==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.470.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz", - "integrity": "sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0", - "@babel/plugin-syntax-async-generators": "7.0.0" + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.470.0.tgz", + "integrity": "sha512-paySXwzGxBVU+2cVUkRIXafKhYhtO2fJJ3MotR6euvRONK/dta+bhEc5Z4QnTo/gNLoELK/QUC0EGoF+oPfk8g==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-ini": "3.470.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.470.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-proposal-class-properties": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz", - "integrity": "sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/helper-member-expression-to-functions": "7.0.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.1.0", - "@babel/plugin-syntax-class-properties": "7.0.0" + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", + "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-proposal-decorators": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.2.tgz", - "integrity": "sha512-YooynBO6PmBgHvAd0fl5e5Tq/a0pEC6RqF62ouafme8FzdIVH41Mz/u1dn8fFVm4jzEJ+g/MsOxouwybJPuP8Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "@babel/plugin-syntax-decorators": "7.1.0" + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.470.0.tgz", + "integrity": "sha512-biGDSh9S9KDR9Tl/8cCPn9g5KPNkXg/CIJIOk3X+6valktbJ2UVYBzi0ZX4vZiudt5ry/Hsu6Pgo+KN1AmBWdg==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-sso": "3.470.0", + "@aws-sdk/token-providers": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz", - "integrity": "sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-json-strings": "7.0.0" + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", - "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-object-rest-spread": "7.0.0" + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.470.0.tgz", + "integrity": "sha512-rzxnJxEUJiV69Cxsf0AHXTqJqTACITwcSH/PL4lWP4uvtzdrzSi3KA3u2aWHWpOcdE6+JFvdICscsbBSo3/TOg==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz", - "integrity": "sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "7.0.0" + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", + "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz", - "integrity": "sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.2.0" + "node_modules/@aws-sdk/credential-providers": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.470.0.tgz", + "integrity": "sha512-aCI/z6L+LwPSUHTsf27WMs3Z7Dfg1idgEOtf0dCkk+T1SZnJA0D/JS0KjQag9rIuqYQsxewx6RCIHus5WJ3czA==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.470.0", + "@aws-sdk/client-sso": "3.470.0", + "@aws-sdk/client-sts": "3.470.0", + "@aws-sdk/credential-provider-cognito-identity": "3.470.0", + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-http": "3.468.0", + "@aws-sdk/credential-provider-ini": "3.470.0", + "@aws-sdk/credential-provider-node": "3.470.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.470.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", + "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", + "optional": true, + "peer": true, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", - "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "7.0.0", - "regjsgen": "0.4.0", - "regjsparser": "0.3.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.0.2" - } - }, - "regjsgen": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", - "dev": true - }, - "regjsparser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", - "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - } + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz", - "integrity": "sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", + "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz", - "integrity": "sha512-cR12g0Qzn4sgkjrbrzWy2GE7m9vMl/sFkqZ3gIpAQdrvPDnLM8180i+ANDFIXfjHo9aqp0ccJlQ0QNZcFUbf9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", + "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-decorators": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.1.0.tgz", - "integrity": "sha512-uQvRSbgQ0nQg3jsmIixXXDCgSpkBolJ9X7NYThMKCcjvE8dN2uWJUzTUNNAeuKOjARTd+wUQV0ztXpgunZYKzQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.468.0.tgz", + "integrity": "sha512-xRy8NKfHbmafHwdbotdWgHBvRs0YZgk20GrhFJKp43bkqVbJ5bNlh3nQXf1DeFY9fARR84Bfotya4fwCUHWgZg==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz", - "integrity": "sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", + "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz", - "integrity": "sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg==", - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.470.0.tgz", + "integrity": "sha512-s0YRGgf4fT5KwwTefpoNUQfB5JghzXyvmPfY1QuFEMeVQNxv0OPuydzo3rY2oXPkZjkulKDtpm5jzIHwut75hA==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz", - "integrity": "sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz", - "integrity": "sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/token-providers": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.437.0.tgz", + "integrity": "sha512-nV9qIuG0+6XJb7hWpCC+/K7RoY3PZUWndP8BRQv7PQhhpd8tG/I5Kxb0V83h2XFBXyyjnv0aOHO8ehz3Kfcv2Q==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz", - "integrity": "sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz", - "integrity": "sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0" + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/middleware-logger": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", "dependencies": { - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" - } - }, - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz", - "integrity": "sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.433.0.tgz", + "integrity": "sha512-jMgA1jHfisBK4oSjMKrtKEZf0sl2vzADivkFmyZFzORpSZxBnF6hC21RjaI+70LJLcc9rSCzLgcoz5lHb9LLDg==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz", - "integrity": "sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "lodash": "4.17.10" + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-transform-classes": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz", - "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-define-map": "7.1.0", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "globals": "11.7.0" + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/util-endpoints": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.433.0.tgz", + "integrity": "sha512-LFNUh9FH7RMtYjSjPGz9lAJQMzmJ3RcXISzc5X5k2R/9mNwMK7y1k2VAfvx+RbuDbll6xwsXlgv6QHcxVdF2zw==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", "dependencies": { - "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", - "dev": true + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true } } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz", - "integrity": "sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/types": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", + "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz", - "integrity": "sha512-Fr2GtF8YJSXGTyFPakPFB4ODaEKGU04bPsAllAIabwoXdFrPxL0LVXQX5dQWoxOjjgozarJcC9eWGsj0fD6Zsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.470.0.tgz", + "integrity": "sha512-6N6VvPCmu+89p5Ez/+gLf+X620iQ9JpIs8p8ECZiCodirzFOe8NC1O2S7eov7YiG9IHSuodqn/0qNq+v+oLe0A==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/util-endpoints": "^1.0.7", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz", - "integrity": "sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.2.0" + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.201.0.tgz", + "integrity": "sha512-hPJgifWh/rADabLAk1C9xXA2B3O4NUmbU58KgBRgC1HksiiHGFVZObB5fkBH8US/XV2jwORkpSf4OhretXQuKg==", + "dependencies": { + "tslib": "^2.3.1" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", + "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", + "optional": true, + "peer": true, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", - "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "7.0.0", - "regjsgen": "0.4.0", - "regjsparser": "0.3.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.0.2" - } - }, - "regjsgen": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", - "dev": true - }, - "regjsparser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", - "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz", + "integrity": "sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true } } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz", - "integrity": "sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "dependencies": { + "tslib": "^2.3.1" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz", - "integrity": "sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ==", + "node_modules/@babel/cli": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-for-of": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz", - "integrity": "sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==", + "node_modules/@babel/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "engines": { + "node": ">= 6" } }, - "@babel/plugin-transform-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz", - "integrity": "sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg==", + "node_modules/@babel/cli/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/@babel/cli/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" } }, - "@babel/plugin-transform-literals": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz", - "integrity": "sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.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==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz", - "integrity": "sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz", - "integrity": "sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-simple-access": "7.1.0" + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz", - "integrity": "sha512-8EDKMAsitLkiF/D4Zhe9CHEE2XLh4bfLbb9/Zf3FgXYQOZyZYyg7EAel/aT2A7bHv62jwHf09q2KU/oEexr83g==", + "node_modules/@babel/compat-data": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", + "dev": true + }, + "node_modules/@babel/core": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", + "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", "dev": true, - "requires": { - "@babel/helper-hoist-variables": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.3", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.3", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz", - "integrity": "sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig==", + "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, - "requires": { - "@babel/helper-module-transforms": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "@babel/plugin-transform-new-target": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", - "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "node_modules/@babel/eslint-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", + "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0" } }, - "@babel/plugin-transform-object-super": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz", - "integrity": "sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw==", + "node_modules/@babel/eslint-parser/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, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.1.0" + "bin": { + "semver": "bin/semver.js" } }, - "@babel/plugin-transform-parameters": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz", - "integrity": "sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw==", + "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, - "requires": { - "@babel/helper-call-delegate": "7.1.0", - "@babel/helper-get-function-arity": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "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" } }, - "@babel/plugin-transform-react-display-name": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz", - "integrity": "sha512-BX8xKuQTO0HzINxT6j/GiCwoJB0AOMs0HmLbEnAvcte8U8rSkNa/eSCAY+l1OA4JnCVq2jw2p6U8QQryy2fTPg==", - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "node_modules/@babel/generator/node_modules/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" } }, - "@babel/plugin-transform-react-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz", - "integrity": "sha512-0TMP21hXsSUjIQJmu/r7RiVxeFrXRcMUigbKu0BLegJK9PkYodHstaszcig7zxXfaBji2LYUdtqIkHs+hgYkJQ==", - "requires": { - "@babel/helper-builder-react-jsx": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-jsx": "7.0.0" + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0.tgz", - "integrity": "sha512-pymy+AK12WO4safW1HmBpwagUQRl9cevNX+82AIAtU1pIdugqcH+nuYP03Ja6B+N4gliAaKWAegIBL/ymALPHA==", - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-jsx": "7.0.0" + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0.tgz", - "integrity": "sha512-OSeEpFJEH5dw/TtxTg4nijl4nHBbhqbKL94Xo/Y17WKIf2qJWeIk/QeXACF19lG1vMezkxqruwnTjVizaW7u7w==", - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-jsx": "7.0.0" + "node_modules/@babel/helper-builder-react-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.12.13.tgz", + "integrity": "sha512-QN7Z5FByIOFESQXxoNYVPU7xONzrDW2fv7oKKVkj+62N3Dx1IZaVu/RF9QhV9XyCZE/xiYNfuQ1JsiL1jduT1A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-regenerator": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", - "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", "dev": true, - "requires": { - "regenerator-transform": "0.13.3" - }, "dependencies": { - "regenerator-transform": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", - "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", - "dev": true, - "requires": { - "private": "0.1.8" - } - } + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/plugin-transform-runtime": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz", - "integrity": "sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg==", + "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, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "resolve": "1.8.1", - "semver": "5.5.1" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" - } - }, - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "bin": { + "semver": "bin/semver.js" } }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz", - "integrity": "sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.0.tgz", + "integrity": "sha512-6pXDPguA5zC40Y8oI5mqr+jEUpjMJonKvknvA+vD8CYDz5uuXEwWBK8sRAsE/t3gfb1k15AQb9RhwpscC4nUJQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/plugin-transform-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz", - "integrity": "sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz", - "integrity": "sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0" + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" } }, - "@babel/plugin-transform-template-literals": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz", - "integrity": "sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==", + "node_modules/@babel/helper-define-polyfill-provider/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, - "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz", - "integrity": "sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==", + "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, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz", - "integrity": "sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==", + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.2.0" - }, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", - "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "7.0.0", - "regjsgen": "0.4.0", - "regjsparser": "0.3.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.0.2" - } - }, - "regjsgen": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", - "dev": true - }, - "regjsparser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", - "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - } - } - }, - "@babel/preset-env": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.0.tgz", - "integrity": "sha512-ZLVSynfAoDHB/34A17/JCZbyrzbQj59QC1Anyueb4Bwjh373nVPq5/HMph0z+tCmcDjXDe+DlKQq9ywQuvWrQg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-proposal-async-generator-functions": "7.1.0", - "@babel/plugin-proposal-json-strings": "7.0.0", - "@babel/plugin-proposal-object-rest-spread": "7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "7.0.0", - "@babel/plugin-syntax-async-generators": "7.0.0", - "@babel/plugin-syntax-object-rest-spread": "7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "7.0.0", - "@babel/plugin-transform-arrow-functions": "7.0.0", - "@babel/plugin-transform-async-to-generator": "7.1.0", - "@babel/plugin-transform-block-scoped-functions": "7.0.0", - "@babel/plugin-transform-block-scoping": "7.0.0", - "@babel/plugin-transform-classes": "7.1.0", - "@babel/plugin-transform-computed-properties": "7.0.0", - "@babel/plugin-transform-destructuring": "7.0.0", - "@babel/plugin-transform-dotall-regex": "7.0.0", - "@babel/plugin-transform-duplicate-keys": "7.0.0", - "@babel/plugin-transform-exponentiation-operator": "7.1.0", - "@babel/plugin-transform-for-of": "7.0.0", - "@babel/plugin-transform-function-name": "7.1.0", - "@babel/plugin-transform-literals": "7.0.0", - "@babel/plugin-transform-modules-amd": "7.1.0", - "@babel/plugin-transform-modules-commonjs": "7.1.0", - "@babel/plugin-transform-modules-systemjs": "7.0.0", - "@babel/plugin-transform-modules-umd": "7.1.0", - "@babel/plugin-transform-new-target": "7.0.0", - "@babel/plugin-transform-object-super": "7.1.0", - "@babel/plugin-transform-parameters": "7.1.0", - "@babel/plugin-transform-regenerator": "7.0.0", - "@babel/plugin-transform-shorthand-properties": "7.0.0", - "@babel/plugin-transform-spread": "7.0.0", - "@babel/plugin-transform-sticky-regex": "7.0.0", - "@babel/plugin-transform-template-literals": "7.0.0", - "@babel/plugin-transform-typeof-symbol": "7.0.0", - "@babel/plugin-transform-unicode-regex": "7.0.0", - "browserslist": "4.1.1", - "invariant": "2.2.4", - "js-levenshtein": "1.1.3", - "semver": "5.5.0" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, - "requires": { - "@babel/types": "7.0.0" - } - }, - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "browserslist": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.1.tgz", - "integrity": "sha512-VBorw+tgpOtZ1BYhrVSVTzTt/3+vSE3eFUh0N2GCFK1HffceOaf32YS/bs6WiFhjDAblAFrx85jMy3BG9fBK2Q==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000885", - "electron-to-chromium": "1.3.68", - "node-releases": "1.0.0-alpha.11" - } - }, - "caniuse-lite": { - "version": "1.0.30000885", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz", - "integrity": "sha512-cXKbYwpxBLd7qHyej16JazPoUacqoVuDhvR61U7Fr5vSxMUiodzcYa1rQYRYfZ5GexV03vGZHd722vNPLjPJGQ==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.68", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.68.tgz", - "integrity": "sha512-NHs9Xm6+ZUDkRj7t1tFwizzfMO2XZg0nmHNRRTurXHDUcEoz3Kdjs2mxXsd8drpEDfg5aVL0S8aypUCTA0HJ/Q==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/preset-react": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", - "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", - "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-transform-react-display-name": "7.0.0", - "@babel/plugin-transform-react-jsx": "7.0.0", - "@babel/plugin-transform-react-jsx-self": "7.0.0", - "@babel/plugin-transform-react-jsx-source": "7.0.0" + "@babel/types": "^7.13.0" } }, - "@babel/preset-stage-0": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-stage-0/-/preset-stage-0-7.0.0.tgz", - "integrity": "sha512-FBMd0IiARPtH5aaOFUVki6evHiJQiY0pFy7fizyRF7dtwc+el3nwpzvhb9qBNzceG1OIJModG1xpE0DDFjPXwA==" - }, - "@babel/runtime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", - "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", - "requires": { - "regenerator-runtime": "0.12.1" - }, + "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": { - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" - } + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/template": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.0.tgz", - "integrity": "sha512-yZ948B/pJrwWGY6VxG6XRFsVTee3IQ7bihq9zFpM00Vydu6z5Xwg0C3J644kxI9WOTzd+62xcIsQ+AT1MGhqhA==", + "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, - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/parser": "7.1.0", - "@babel/types": "7.0.0" - }, "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.0.tgz", - "integrity": "sha512-bwgln0FsMoxm3pLOgrrnGaXk18sSM9JNf1/nHC/FksmNGFbYnPWY4GYCfLxyP1KRmfsxqkRpfoa6xr6VuuSxdw==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/generator": "7.0.0", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "@babel/parser": "7.1.0", - "@babel/types": "7.0.0", - "debug": "3.2.5", - "globals": "11.7.0", - "lodash": "4.17.10" - }, "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" - } - }, - "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@babel/types": "^7.13.12" } }, - "@babel/types": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz", - "integrity": "sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA==", - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.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==", "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - } + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" } }, - "@emotion/babel-utils": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/@emotion/babel-utils/-/babel-utils-0.6.10.tgz", - "integrity": "sha512-/fnkM/LTEp3jKe++T0KyTszVGWNKPNOUJfjNKLO17BzQ6QPxgbg3whayom1Qr2oLFH3V92tDymU+dT5q676uow==", - "requires": { - "@emotion/hash": "0.6.6", - "@emotion/memoize": "0.6.6", - "@emotion/serialize": "0.9.1", - "convert-source-map": "1.5.1", - "find-root": "1.1.0", - "source-map": "0.7.3" - }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", + "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "dev": true, "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2" } }, - "@emotion/hash": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz", - "integrity": "sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ==" - }, - "@emotion/memoize": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz", - "integrity": "sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ==" - }, - "@emotion/serialize": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.9.1.tgz", - "integrity": "sha512-zTuAFtyPvCctHBEL8KZ5lJuwBanGSutFEncqLn/m9T1a6a93smBStK+bZzcNPgj4QS8Rkw9VTwJGhRIUVO8zsQ==", - "requires": { - "@emotion/hash": "0.6.6", - "@emotion/memoize": "0.6.6", - "@emotion/unitless": "0.6.7", - "@emotion/utils": "0.8.2" + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" } }, - "@emotion/stylis": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.7.1.tgz", - "integrity": "sha512-/SLmSIkN13M//53TtNxgxo57mcJk/UJIDFRKwOiLIBEyBHEcipgR6hNMQ/59Sl4VjCJ0Z/3zeAZyvnSLPG/1HQ==" - }, - "@emotion/unitless": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.6.7.tgz", - "integrity": "sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg==" - }, - "@emotion/utils": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.8.2.tgz", - "integrity": "sha512-rLu3wcBWH4P5q1CGoSSH/i9hrXs7SlbRLkoq9IGuoPYNGQvDJ3pt/wmOM+XgYjIDRMVIdkUWt0RsfzF50JfnCw==" - }, - "@material-ui/core": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.3.0.tgz", - "integrity": "sha512-h340FXiJyAEQ1+xnOBaqLib9f6M82DEn0CicMVRekwTtPhFR9dDYdJT30WDPczS2piNiQ9kuFfFcAE9UTbwcXQ==", - "requires": { - "@babel/runtime": "7.1.2", - "@types/jss": "9.5.7", - "@types/react-transition-group": "2.0.14", - "brcast": "3.0.1", - "classnames": "2.2.6", - "csstype": "2.5.7", - "debounce": "1.2.0", - "deepmerge": "2.2.1", - "dom-helpers": "3.3.1", - "hoist-non-react-statics": "2.5.5", - "is-plain-object": "2.0.4", - "jss": "9.8.7", - "jss-camel-case": "6.1.0", - "jss-default-unit": "8.0.2", - "jss-global": "3.0.0", - "jss-nested": "6.0.1", - "jss-props-sort": "6.0.0", - "jss-vendor-prefixer": "7.0.0", - "keycode": "2.2.0", - "normalize-scroll-left": "0.1.2", - "popper.js": "1.14.4", - "prop-types": "15.6.2", - "react-event-listener": "0.6.4", - "react-transition-group": "2.5.0", - "recompose": "0.29.0", - "warning": "4.0.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz", - "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==", - "requires": { - "regenerator-runtime": "0.12.1" - } - }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" - } + "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" } }, - "@material-ui/icons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-3.0.1.tgz", - "integrity": "sha512-1kNcxYiIT1x8iDPEAlgmKrfRTIV8UyK6fLVcZ9kMHIKGWft9I451V5mvSrbCjbf7MX1TbLWzZjph0aVCRf9MqQ==", - "requires": { - "@babel/runtime": "7.0.0", - "recompose": "0.29.0" + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" } }, - "@pm2/agent": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-0.5.16.tgz", - "integrity": "sha512-8oDUY0N21LFULtr9G0/u4vyIRtG2UM9dvEmrDV6h3iqP/7ykqnJ9JnB3MOsMEL6+EsA0Mwf2A4QbHvItwO3mzQ==", - "requires": { - "async": "2.6.1", - "eventemitter2": "5.0.1", - "fclone": "1.0.11", - "moment": "2.22.2", - "nssocket": "0.6.0", - "pm2-axon": "3.3.0", - "pm2-axon-rpc": "0.5.1", - "semver": "5.5.0", - "ws": "5.2.2" - }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, "dependencies": { - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "1.0.0" - } - } + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" } }, - "@pm2/agent-node": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@pm2/agent-node/-/agent-node-1.0.7.tgz", - "integrity": "sha512-09m5zCJM9lpdA4MjHS+nahEVf+bjdvj5OepqiQiLxh+Jz1L5VSFmXyT9tUszanhJg3AajRfNKup1ASNtzVnPMg==", - "requires": { - "debug": "3.2.6", - "eventemitter2": "5.0.1", - "ws": "6.1.0" - }, + "node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "ws": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.0.tgz", - "integrity": "sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg==", - "requires": { - "async-limiter": "1.0.0" - } - } + "@babel/types": "^7.13.12" } }, - "@pm2/io": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@pm2/io/-/io-2.4.5.tgz", - "integrity": "sha512-+JPRL7T/5uoLzUnYV5SlrU1jWNOVfSRBeX386cx68EpotWRH0qS9HjGwh+DjBTeMRdvI9aVyhiBYqqRq8Lb6eg==", - "requires": { - "@pm2/agent-node": "1.0.7", - "async": "2.6.1", - "debug": "3.1.0", - "deep-metrics": "0.0.2", - "deepmerge": "2.1.1", - "event-loop-inspector": "1.2.2", - "json-stringify-safe": "5.0.1", - "semver": "5.5.0", - "signal-exit": "3.0.2", - "tslib": "1.9.3", - "vxx": "1.2.2" - }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "deepmerge": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.1.1.tgz", - "integrity": "sha512-urQxA1smbLZ2cBbXbaYObM1dJ82aJ2H57A1C/Kklfh/ZN1bgH4G/n5KWhdNfOK11W98gqZfyYj7W4frJJRwA2w==" - } + "@babel/types": "^7.12.1" } }, - "@pm2/js-api": { - "version": "0.5.28", - "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.5.28.tgz", - "integrity": "sha512-kFMNAQMVmoJ53962CJcaSnaXToNtHke+re58NsBGLWu/nVwlQKGhMumsOn6u8glnxsSFDlX1oF6Q0gu3pkRTfw==", - "requires": { - "async": "2.6.1", - "axios": "0.16.2", - "debug": "2.6.9", - "eventemitter2": "4.1.2", - "ws": "3.3.3" - }, + "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": { - "eventemitter2": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-4.1.2.tgz", - "integrity": "sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU=" - } + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@types/body-parser": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", - "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", - "requires": { - "@types/connect": "3.4.32", - "@types/node": "7.10.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==", + "engines": { + "node": ">=6.9.0" } }, - "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", - "requires": { - "@types/node": "7.10.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==", + "engines": { + "node": ">=6.9.0" } }, - "@types/events": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" + "node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true }, - "@types/express": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz", - "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==", - "requires": { - "@types/body-parser": "1.17.0", - "@types/express-serve-static-core": "4.16.0", - "@types/serve-static": "1.13.2" + "node_modules/@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, - "@types/express-serve-static-core": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", - "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", - "requires": { - "@types/events": "1.2.0", - "@types/node": "7.10.0", - "@types/range-parser": "1.2.2" + "node_modules/@babel/helpers": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" } }, - "@types/jss": { - "version": "9.5.7", - "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.7.tgz", - "integrity": "sha512-OZimStu2QdDMtZ0h72JXqvLVbWUjXd5ZLk8vxLmfuC/nM1AabRyyGoxSufnzixrbpEcVcyy/JV5qeQu2JnjVZw==", - "requires": { - "csstype": "2.5.7", - "indefinite-observable": "1.0.1" + "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==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@types/ldapjs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.3.tgz", - "integrity": "sha512-FSj24s1WsFEfOy8taIKp2DokSZfFkjWYZb88AS5eDj3WTocZ+4DnHjhzrXEs048WQ5mfOLJXMOAnc0kSnHh5Lw==", - "requires": { - "@types/events": "1.2.0", - "@types/node": "7.10.0" - } - }, - "@types/mime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" - }, - "@types/node": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.0.tgz", - "integrity": "sha512-yF75IZxur7xs90zpmoE+ktRJGJIauORo4qblVFvfKTYSSBFRRWlrl2dO/tE4vetSS4KAvFumS+1thTf3mMZhaA==" - }, - "@types/passport": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-0.4.6.tgz", - "integrity": "sha512-P7TxrdpAze3nvHghYPeLlHkYcFDiIkRBbp7xYz2ehX9zmi1yr/qWQMTpXsMxN5w3ESJpMzn917inK4giASaDcQ==", - "requires": { - "@types/express": "4.16.0" + "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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "@types/prop-types": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.6.tgz", - "integrity": "sha512-ZBFR7TROLVzCkswA3Fmqq+IIJt62/T7aY/Dmz+QkU7CaW2QFqAitCE8Ups7IzmGhcN1YWMBT4Qcoc07jU9hOJQ==" - }, - "@types/range-parser": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.2.tgz", - "integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==" + "node_modules/@babel/highlight/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==" }, - "@types/react": { - "version": "16.4.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.4.18.tgz", - "integrity": "sha512-eFzJKEg6pdeaukVLVZ8Xb79CTl/ysX+ExmOfAAqcFlCCK5TgFDD9kWR0S18sglQ3EmM8U+80enjUqbfnUyqpdA==", - "requires": { - "@types/prop-types": "15.5.6", - "csstype": "2.5.7" + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "@types/react-transition-group": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.14.tgz", - "integrity": "sha512-pa7qB0/mkhwWMBFoXhX8BcntK8G4eQl4sIfSrJCxnivTYRQWjOWf2ClR9bWdm0EUFBDHzMbKYS+QYfDtBzkY4w==", - "requires": { - "@types/react": "16.4.18" + "node_modules/@babel/node": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.18.5.tgz", + "integrity": "sha512-zv94ESipS2/YKAOJ+/WAfVEzsl9M8UmPZ7Hwx5qVPgytdrgwUPxfi700iR9KO/w5ZhIHyFyvoZtCTSEcQJF8vQ==", + "dev": true, + "dependencies": { + "@babel/register": "^7.17.7", + "commander": "^4.0.1", + "core-js": "^3.22.1", + "node-environment-flags": "^1.0.5", + "regenerator-runtime": "^0.13.4", + "v8flags": "^3.1.1" + }, + "bin": { + "babel-node": "bin/babel-node.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@types/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", - "requires": { - "@types/express-serve-static-core": "4.16.0", - "@types/mime": "2.0.0" + "node_modules/@babel/node/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" } }, - "@webassemblyjs/ast": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz", - "integrity": "sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg==", + "node_modules/@babel/node/node_modules/core-js": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.2.tgz", + "integrity": "sha512-ELJOWxNrJfOH/WK4VJ3Qd+fOqZuOuDNDJz0xG6Bt4mGg2eO/UT9CljCrbqDGovjLKUrGajEEBcoTOc0w+yBYeQ==", "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8" + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz", - "integrity": "sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz", - "integrity": "sha512-xUwxDXsd1dUKArJEP5wWM5zxgCSwZApSOJyP1XO7M8rNUChUDblcLQ4FpzTpWG2YeylMwMl1MlP5Ztryiz1x4g==", + "node_modules/@babel/node/node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz", - "integrity": "sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz", - "integrity": "sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA==", + "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, - "requires": { - "@webassemblyjs/wast-printer": "1.7.8" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz", - "integrity": "sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz", - "integrity": "sha512-uCutAKR7Nm0VsFixcvnB4HhAyHouNbj0Dx1p7eRjFjXGGZ+N7ftTaG1ZbWCasAEbtwGj54LP8+lkBZdTCPmLGg==", - "dev": true + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz", - "integrity": "sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ==", - "dev": true + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", + "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz", - "integrity": "sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg==", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webassemblyjs/ieee754": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz", - "integrity": "sha512-tOarWChdG1a3y1yqCX0JMDKzrat5tQe4pV6K/TX19BcXsBLYxFQOL1DEDa5KG9syeyvCrvZ+i1+Mv1ExngvktQ==", + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz", + "integrity": "sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg==", "dev": true, - "requires": { - "@xtuc/ieee754": "1.2.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-class-static-block": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "@webassemblyjs/leb128": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz", - "integrity": "sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ==", + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz", + "integrity": "sha512-ibAMAqUm97yzi+LPgdr5Nqb9CMkeieGHvwPg1ywSGjZrZHQEGqE01HmOio8kxRpA/+VtOHouIVy2FMpBbtltjA==", "dev": true, - "requires": { - "@xtuc/long": "4.2.1" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.11", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-decorators": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webassemblyjs/utf8": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.8.tgz", - "integrity": "sha512-9X+f0VV+xNXW2ujfIRSXBJENGE6Qh7bNVKqu3yDjTFB3ar3nsThsGBBKdTG58aXOm2iUH6v28VIf88ymPXODHA==", - "dev": true + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz", - "integrity": "sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A==", + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/helper-wasm-section": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-opt": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "@webassemblyjs/wast-printer": "1.7.8" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz", - "integrity": "sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ==", + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz", - "integrity": "sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg==", + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz", - "integrity": "sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ==", + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webassemblyjs/wast-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz", - "integrity": "sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg==", + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/floating-point-hex-parser": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-code-frame": "1.7.8", - "@webassemblyjs/helper-fsm": "1.7.8", - "@xtuc/long": "4.2.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webassemblyjs/wast-printer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz", - "integrity": "sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg==", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8", - "@xtuc/long": "4.2.1" + "dependencies": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webpack-contrib/config-loader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@webpack-contrib/config-loader/-/config-loader-1.1.3.tgz", - "integrity": "sha512-lOliuisjrh24MfhOYE5ljqyFlKfzyWGFrn3bbR0KlXQHY90j3pXWfFtEl4gNvqz69tJsM+1s7PUGJrK9CF46ng==", + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, - "requires": { - "@webpack-contrib/schema-utils": "1.0.0-beta.0", - "chalk": "2.4.1", - "cosmiconfig": "5.0.5", - "loud-rejection": "1.6.0", - "merge-options": "1.0.1", - "minimist": "1.2.0", - "resolve": "1.8.1", - "webpack-log": "1.2.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "dev": true, "dependencies": { - "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, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@webpack-contrib/schema-utils": { - "version": "1.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz", - "integrity": "sha512-LonryJP+FxQQHsjGBi6W786TQB1Oym+agTpY0c+Kj8alnIw+DLUJb6SI8Y1GHGhLCH1yPRrucjObUmxNICQ1pg==", + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "dev": true, - "requires": { - "ajv": "6.5.2", - "ajv-keywords": "3.2.0", - "chalk": "2.4.1", - "strip-ansi": "4.0.0", - "text-table": "0.2.0", - "webpack-log": "1.2.0" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-create-class-features-plugin": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", - "dev": true + "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" + } }, - "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/@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" + } }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "requires": { - "mime-types": "2.1.18", - "negotiator": "0.6.1" + "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" } }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", + "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", + "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", "dev": true, - "requires": { - "acorn": "5.7.3" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true + "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" + } }, - "amp": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", - "integrity": "sha1-at+NWKdPNh6CwfqNOJwHnhOfxH0=" + "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" + } }, - "amp-message": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", - "integrity": "sha1-p48cmJlQh602GSpBKY5NtJ49/EU=", - "requires": { - "amp": "0.3.1" + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "amqplib": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", - "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", - "requires": { - "bitsyntax": "0.0.4", - "bluebird": "3.5.1", - "buffer-more-ints": "0.0.2", - "readable-stream": "1.1.14", - "safe-buffer": "5.1.2" + "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": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "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, - "requires": { - "string-width": "2.1.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "1.0.3" + "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" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "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, - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "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, - "requires": { - "util": "0.10.3" - }, "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "requires": { - "lodash": "4.17.10" + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" - }, - "async-listener": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", - "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", - "requires": { - "semver": "5.5.0", - "shimmer": "1.2.0" + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "axios": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.16.2.tgz", - "integrity": "sha1-uk+S8XFn37q0CYN4VFS5rBScPG0=", - "requires": { - "follow-redirects": "1.5.9", - "is-buffer": "1.1.6" + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz", + "integrity": "sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "node_modules/@babel/plugin-transform-classes/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, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "engines": { + "node": ">=4" } }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", + "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz", + "integrity": "sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ==", "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "dependencies": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-loader": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.4.tgz", - "integrity": "sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, - "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1", - "util.promisify": "1.0.0" + "dependencies": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "6.26.0" + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", + "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "babel-plugin-emotion": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-9.2.11.tgz", - "integrity": "sha512-dgCImifnOPPSeXod2znAmgc64NhaaOjGEHROR/M+lmStb3841yK1sgaDYAYMnlvWNz8GnpwIPN0VmNpbWYZ+VQ==", - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@emotion/babel-utils": "0.6.10", - "@emotion/hash": "0.6.6", - "@emotion/memoize": "0.6.6", - "@emotion/stylis": "0.7.1", - "babel-plugin-macros": "2.4.2", - "babel-plugin-syntax-jsx": "6.18.0", - "convert-source-map": "1.5.1", - "find-root": "1.1.0", - "mkdirp": "0.5.1", - "source-map": "0.5.7", - "touch": "2.0.2" + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-macros": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz", - "integrity": "sha512-NBVpEWN4OQ/bHnu1fyDaAaTPAjnhXCEPqr1RwqxrU7b6tZ2hypp+zX4hlNfmVGfClD5c3Sl6Hfj5TJNF5VG5aA==", - "requires": { - "cosmiconfig": "5.0.5", - "resolve": "1.8.1" + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-react-html-attrs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-html-attrs/-/babel-plugin-react-html-attrs-2.1.0.tgz", - "integrity": "sha512-UAXnfrH9c/V0D6efhJ41emUb0tOM83xFS1xGu7lQdFT/jBZ+3moK3pk/O3MfAmljEUt47nYUea77DduOXAMWWg==", - "dev": true - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" - }, - "babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=" - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" - }, - "babel-plugin-syntax-do-expressions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", - "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=" - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=" - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-function-bind": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", - "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "requires": { - "babel-plugin-syntax-class-constructor-call": "6.18.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", + "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", + "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "node_modules/@babel/plugin-transform-react-inline-elements": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.12.13.tgz", + "integrity": "sha512-FkqNco564LsuwJFEtTzDihxNGqNAstTfP9hORNYaNtYqdlOEIF5jsD4K5R3BfmVaIsGRPBGvsgmCwm0KCkkSFw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-react-jsx": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-decorators-legacy": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", - "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", "dev": true, - "requires": { - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-do-expressions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", - "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", - "requires": { - "babel-plugin-syntax-do-expressions": "6.13.0", - "babel-runtime": "6.26.0" + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", + "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.12.17" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz", + "integrity": "sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA==", "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "node_modules/@babel/plugin-transform-runtime/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, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "bin": { + "semver": "bin/semver.js" } }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "node_modules/@babel/preset-env": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.0.tgz", + "integrity": "sha512-GWRCdBv2whxqqaSi7bo/BEXf070G/fWFMEdCnmoRg2CZJy4GK06ovFuEjJrZhDRXYgBsYtxVbG8GUHvw+UWBkQ==", "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "dependencies": { + "@babel/compat-data": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.15", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-class-static-block": "^7.13.11", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-private-property-in-object": "^7.14.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.0", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.13.16", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.17", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.14.0", + "@babel/plugin-transform-modules-commonjs": "^7.14.0", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.14.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "node_modules/@babel/preset-env/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, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "bin": { + "semver": "bin/semver.js" } }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "node_modules/@babel/preset-react": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", + "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-react-display-name": "^7.12.13", + "@babel/plugin-transform-react-jsx": "^7.13.12", + "@babel/plugin-transform-react-jsx-development": "^7.12.17", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "node_modules/@babel/register": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.17.7.tgz", + "integrity": "sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "node_modules/@babel/register/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "node_modules/@babel/register/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "node_modules/@babel/register/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "node_modules/@babel/register/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "requires": { - "babel-plugin-syntax-export-extensions": "6.13.0", - "babel-runtime": "6.26.0" + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "node_modules/@babel/register/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-function-bind": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", - "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", - "requires": { - "babel-plugin-syntax-function-bind": "6.13.0", - "babel-runtime": "6.26.0" + "node_modules/@babel/register/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "node_modules/@babel/runtime": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "babel-plugin-transform-react-constant-elements": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", - "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "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, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" } }, - "babel-plugin-transform-react-inline-elements": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-inline-elements/-/babel-plugin-transform-react-inline-elements-6.22.0.tgz", - "integrity": "sha1-ZochGjK0mlLyLFc6K1UEol7xfFM=", + "node_modules/@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "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" } }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "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==", + "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" } }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "node_modules/@babel/types/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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.19.tgz", - "integrity": "sha512-f49NsaohQ1ByY20nUrpc30QFdbeT4ntV4PAL2vSZe6uCB5nqAcqXS/qzU+aI6ZfYhWASx5eIsTFvFrs1B2ffGg==", + "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 }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "requires": { - "regenerator-transform": "0.10.1" + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "engines": { + "node": ">=10.0.0" } }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "3.2.8", - "invariant": "2.2.4", - "semver": "5.5.0" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" - } - }, - "babel-preset-stage-0": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", - "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", - "requires": { - "babel-plugin-transform-do-expressions": "6.22.0", - "babel-plugin-transform-function-bind": "6.22.0", - "babel-preset-stage-1": "6.24.1" - } - }, - "babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "requires": { - "babel-plugin-transform-class-constructor-call": "6.24.1", - "babel-plugin-transform-export-extensions": "6.22.0", - "babel-preset-stage-2": "6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.7", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.7", - "regenerator-runtime": "0.11.1" - } + "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" + "node_modules/@emotion/babel-plugin/node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" - } + "node_modules/@emotion/babel-plugin/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" + "node_modules/@emotion/babel-plugin/node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2.3" + "node_modules/@emotion/babel-plugin/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==", + "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" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + "node_modules/@emotion/cache/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true + "node_modules/@emotion/cache/node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, - "basic-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", - "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", - "requires": { - "safe-buffer": "5.1.1" - }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - } + "@emotion/memoize": "^0.8.1" } }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true + "node_modules/@emotion/react/node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, - "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" + "node_modules/@emotion/react/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, - "bitsyntax": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", - "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", - "requires": { - "buffer-more-ints": "0.0.2" + "node_modules/@emotion/react/node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" } }, - "blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=" + "node_modules/@emotion/react/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + "node_modules/@emotion/react/node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "bodec": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", - "integrity": "sha1-vIUVVUMPI8n3ZQp172TGqUw0GMw=" + "node_modules/@emotion/styled/node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "1.6.16" - } + "node_modules/@emotion/styled/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.4.1", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" - }, + "node_modules/@emotion/styled/node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", "dependencies": { - "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, - "requires": { - "color-convert": "1.9.2" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } + "node_modules/@emotion/styled/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } + "node_modules/@emotion/styled/node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, - "brcast": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz", - "integrity": "sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg==" + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.1", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" - } + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { - "pako": "1.0.6" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, - "requires": { - "caniuse-lite": "1.0.30000861", - "electron-to-chromium": "1.3.50" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "bson": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", - "integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg==" + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.12", - "isarray": "1.0.0" + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "node_modules/@floating-ui/react-dom": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } }, - "buffer-more-ints": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", - "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=" + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + "node_modules/@hookform/resolvers": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.2.tgz", + "integrity": "sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, - "bunyan": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", - "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", - "requires": { - "dtrace-provider": "0.8.7", - "moment": "2.22.2", - "mv": "2.1.1", - "safe-json-stringify": "1.2.0" + "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" } }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } + "node_modules/@istanbuljs/load-nyc-config/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" } }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.1.1", - "glob": "7.1.3", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.3", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.3.0", - "unique-filename": "1.1.1", - "y18n": "4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.3" - } - } + "node_modules/@istanbuljs/load-nyc-config/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" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "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" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + "node_modules/@jest/console": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.2.1.tgz", + "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true + "node_modules/@jest/console/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" + } }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "node_modules/@jest/core": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.2.2.tgz", + "integrity": "sha512-susVl8o2KYLcZhhkvSB+b7xX575CX3TmSvxfeDjpRko7KmT89rHkXj6XkDkNpSeFMBzIENw5qIchO9HC9Sem+A==", "dev": true, - "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "@jest/console": "^29.2.1", + "@jest/reporters": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@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.2.0", + "jest-config": "^29.2.2", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-resolve-dependencies": "^29.2.2", + "jest-runner": "^29.2.2", + "jest-runtime": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "jest-watcher": "^29.2.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.2.1", + "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 } } }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" - }, - "caniuse-lite": { - "version": "1.0.30000861", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000861.tgz", - "integrity": "sha512-aeEQ4kyd41qCl8XFbCjWgVBI3EOd66M9sC43MFn0kuD/vcrNqvoIAlKon4xdp8yMCYvVjdCltI3lgArj8I6cNA==", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "node_modules/@jest/core/node_modules/ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "node_modules/@jest/core/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" } }, - "change-emitter": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", - "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" - }, - "charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=" + "node_modules/@jest/core/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" + } }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.1.0" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": 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" + } }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "node_modules/@jest/expect": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.2.2.tgz", + "integrity": "sha512-zwblIZnrIVt8z/SiEeJ7Q9wKKuB+/GS4yZe9zw7gMqfGf4C5hBLGrVyxu1SzDbVSqyMSlprKl3WL1r80cBNkgg==", "dev": true, - "requires": { - "tslib": "1.9.3" + "dependencies": { + "expect": "^29.2.2", + "jest-snapshot": "^29.2.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", - "dev": true + "node_modules/@jest/expect-utils": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.2.2.tgz", + "integrity": "sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "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, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "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" } }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "node_modules/@jest/globals": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.2.2.tgz", + "integrity": "sha512-/nt+5YMh65kYcfBhj38B3Hm0Trk4IsuMXNDGKE/swp36yydBWfz3OXkLqkSvoAtPW8IJMSJDFCbTM2oj5SNprw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.2.2", + "@jest/expect": "^29.2.2", + "@jest/types": "^29.2.1", + "jest-mock": "^29.2.2" }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.2.2.tgz", + "integrity": "sha512-AzjL2rl2zJC0njIzcooBvjA4sJjvdoq98sDuuNs4aNugtLPSQ+91nysGKRF0uY1to5k0MdGMdOBggUsPqvBcpA==", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@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": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", + "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 } } }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + "node_modules/@jest/reporters/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" + } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "node_modules/@jest/reporters/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "requires": { - "restore-cursor": "2.0.0" + "engines": { + "node": ">=8" } }, - "cli-spinners": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", - "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", - "dev": true + "node_modules/@jest/reporters/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" + } }, - "cli-table-redemption": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli-table-redemption/-/cli-table-redemption-1.0.1.tgz", - "integrity": "sha512-SjVCciRyx01I4azo2K2rcc0NP/wOceXGzG1ZpYkEulbbIxDA/5YWv0oxG2HtQ4v8zPC6bgbRI7SbNaTZCxMNkg==", - "requires": { - "chalk": "1.1.3" + "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" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true + "node_modules/@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "node_modules/@jest/test-result": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.2.1.tgz", + "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "node_modules/@jest/test-sequencer": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.2.2.tgz", + "integrity": "sha512-Cuc1znc1pl4v9REgmmLf0jBd3Y65UXJpioGYtMr/JNpQEIGEzkmHhy6W6DLbSsXeUA13TDzymPv0ZGZ9jH3eIw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.2.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "color": { + "node_modules/@jest/test-sequencer/node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "1.9.3", - "color-string": "1.5.3" + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" } }, - "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==", - "requires": { - "color-name": "1.1.3" + "node_modules/@jest/transform": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.2.2.tgz", + "integrity": "sha512-aPe6rrletyuEIt2axxgdtxljmzH8O/nrov4byy6pDw9S8inIrTV+2PnjyP/oFHMSynzGxJ2s6OHowBNMXp/Jzg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.2.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "node_modules/@jest/transform/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" } }, - "colorbrewer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.3.0.tgz", - "integrity": "sha512-AzVPpWa+fuO/qY8LxPQjej6F49Lb2Cl+7U9YhPn6y4/SOY6u/EZiXUc7qHzRb6i6fWPStCUdEaU2731QyQKWjg==" + "node_modules/@jest/transform/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" + } }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + "node_modules/@jest/transform/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" + } }, - "colors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", - "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==" - }, - "colorspace": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", - "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", - "requires": { - "color": "3.0.0", - "text-hex": "1.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" } }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + "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" + } }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "complex.js": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.11.tgz", - "integrity": "sha512-6IArJLApNtdg1P1dFtn3dnyzoZBEF0MwMnrfF1exSBRpZYoy4yieMkpZhQDC0uwctw48vii0CFVyHfpgZ/DfGw==" + "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" + } }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "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" + } }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.2.7", - "typedarray": "0.0.6" + "node_modules/@mui/base": { + "version": "5.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.21.tgz", + "integrity": "sha512-eTKWx3WV/nwmRUK4z4K1MzlMyWCsi3WJ3RtV4DiXZeRh4qd4JCyp1Zzzi8Wv9xM4dEBmqQntFoei716PzwmFfA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "node_modules/@mui/core-downloads-tracker": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.15.tgz", + "integrity": "sha512-ZCDzBWtCKjAYAlKKM3PA/jG/3uVIDT9ZitOtVixIVmTCQyc5jSV1qhJX8+qIGz4RQZ9KLzPWO2tXd0O5hvzouQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" } }, - "connect-mongo": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-2.0.1.tgz", - "integrity": "sha512-ghBvVq0SA0SkTFsbAB8HdF1+uoHdFJICSlrTklNloMKXuRpX9IuVBnG0DlKnXBZSQI0Joyaq22cazsrV9+5g2A==", - "requires": { - "mongodb": "2.2.35" + "node_modules/@mui/icons-material": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.15.tgz", + "integrity": "sha512-Dqu21vN/mVNzebJ+ofnKG+CeJYIhHuDs5+0fMEpdpzRt6UojelzdrEkNv+XkO0e1JMclzeXIRx404FirK/CFRw==", + "dependencies": { + "@babel/runtime": "^7.23.2" }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.15.tgz", + "integrity": "sha512-Gq65rHjvLzkxmhG8bvag851Oqsmru7qkUb/cCI2xu7dQzmY345f9xJRJi72sRGjhaqHXWeRKw/yIwp/7oQoeXg==", "dependencies": { - "mongodb": { - "version": "2.2.35", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.35.tgz", - "integrity": "sha512-3HGLucDg/8EeYMin3k+nFWChTA85hcYDCw1lPsWR6yV9A6RgKb24BkLiZ9ySZR+S0nfBjWoIUS7cyV6ceGx5Gg==", - "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.19", - "readable-stream": "2.2.7" - } + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.21", + "@mui/core-downloads-tracker": "^5.14.15", + "@mui/system": "^5.14.15", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "@types/react-transition-group": "^4.4.7", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true }, - "mongodb-core": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.19.tgz", - "integrity": "sha512-Jt4AtWUkpuW03kRdYGxga4O65O1UHlFfvvInslEfLlGi+zDMxbBe3J2NVmN9qPJ957Mn6Iz0UpMtV80cmxCVxw==", - "requires": { - "bson": "1.0.9", - "require_optional": "1.0.1" - } + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true } } }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" + "node_modules/@mui/material/node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" } }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "node_modules/@mui/material/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==" }, - "content-security-policy-builder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz", - "integrity": "sha512-j+Nhmj1yfZAikJLImCvPJFE29x/UuBi+/MWqggGGc515JKaZrjuei2RhULJmy0MsstW3E3htl002bwmBNMKr7w==" + "node_modules/@mui/material/node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "node_modules/@mui/private-theming": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.15.tgz", + "integrity": "sha512-V2Xh+Tu6A07NoSpup0P9m29GwvNMYl5DegsGWqlOTJyAV7cuuVjmVPqxgvL8xBng4R85xqIQJRMjtYYktoPNuQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.15", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "requires": { - "async-listener": "0.6.9", - "emitter-listener": "1.1.2" + "node_modules/@mui/styled-engine": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.15.tgz", + "integrity": "sha512-mbOjRf867BysNpexe5Z/P8s3bWzDPNowmKhi7gtNDP/LPEeqAfiDSuC4WPTXmtvse1dCl30Nl755OLUYuoi7Mw==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } } }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + "node_modules/@mui/system": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.15.tgz", + "integrity": "sha512-zr0Gdk1RgKiEk+tCMB900LaOpEC8NaGvxtkmMdL/CXgkqQZSVZOt2PQsxJWaw7kE4YVkIe4VukFVc43qcq9u3w==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.15", + "@mui/styled-engine": "^5.14.15", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "node_modules/@mui/types": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.10.tgz", + "integrity": "sha512-wX1vbDC+lzF7FlhT6A3ffRZgEoKWPF8VqRoTu4lZwouFX2t90KyCMsgepMw5DxLak1BSp/KP86CmtZttikb/gQ==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6" + "node_modules/@mui/utils": { + "version": "5.14.20", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.20.tgz", + "integrity": "sha512-Y6yL5MoFmtQml20DZnaaK1znrCEwG6/vRSzW8PKOTrzhyqKIql0FazZRUR7sA5EPASgiyKZfq0FPwISRXm5NdA==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "node_modules/@mui/utils/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==" }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - }, + "node_modules/@mui/x-date-pickers": { + "version": "6.18.4", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.4.tgz", + "integrity": "sha512-YqJ6lxZHBIt344B3bvRAVbdYSQz4dcmJQXGcfvJTn26VdKjpgzjAqwhlbQhbAt55audJOWzGB99ImuQuljDROA==", "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0", + "date-fns-jalali": "^2.13.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.3" - } + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true } } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "node_modules/@mui/x-date-pickers/node_modules/@mui/base": { + "version": "5.0.0-beta.26", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.26.tgz", + "integrity": "sha512-gPMRKC84VRw+tjqYoyBzyrBUqHQucMXdlBpYazHa5rCXrb91fYEQk5SqQ2U5kjxx9QxZxTBvWAmZ6DblIgaGhQ==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.10", + "@mui/utils": "^5.14.20", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "node_modules/@mui/x-date-pickers/node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } }, - "cosmiconfig": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.5.tgz", - "integrity": "sha512-94j37OtvxS5w7qr7Ta6dt67tWdnOxigBVN4VnSxNXFez9o18PGQ0D33SchKP17r9LAcWVTYV72G6vDayAUBFIg==", - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0" + "node_modules/@mui/x-date-pickers/node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "crc": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", - "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.1" + "dependencies": { + "eslint-scope": "5.1.1" } }, - "create-emotion": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-9.2.12.tgz", - "integrity": "sha512-P57uOF9NL2y98Xrbl2OuiDQUZ30GVmASsv5fbsjF4Hlraip2kyAvMm+2PoYUvFFw03Fhgtxk3RqZSm2/qHL9hA==", - "requires": { - "@emotion/hash": "0.6.6", - "@emotion/memoize": "0.6.6", - "@emotion/stylis": "0.7.1", - "@emotion/unitless": "0.6.7", - "csstype": "2.5.7", - "stylis": "3.5.3", - "stylis-rule-sheet": "0.0.10" + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "requires": { - "capture-stack-trace": "1.0.0" + "engines": { + "node": ">= 8" } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "cron": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cron/-/cron-1.4.1.tgz", - "integrity": "sha512-HlglwQUNh6bhgfoDR6aEzyHN2T4bc0XhxJxkNPp+Ry7lK7Noby94pHcngYf634+MtxplwZm8okFgNe+R9PGDjg==", - "requires": { - "moment-timezone": "0.5.21" + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.1" + "node_modules/@remix-run/router": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.3.tgz", + "integrity": "sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q==", + "engines": { + "node": ">=14" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "node_modules/@shelf/jest-mongodb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@shelf/jest-mongodb/-/jest-mongodb-5.1.0.tgz", + "integrity": "sha512-oA4hsDQCaigJtWk72kMlMIqPga6xrBQAsgRsnlftmXGTeLcxa76bxLQCw9R4LjDKChXcOvcfrtKwQzZGZyTy+w==", "dev": true, - "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.17", - "public-encrypt": "4.0.3", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "license": "MIT", + "dependencies": { + "debug": "4.3.4", + "mongodb-memory-server": "9.2.0" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "jest-environment-node": "28.x || 29.x", + "mongodb": "3.x.x || 4.x || 5.x || 6.x" } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "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 }, - "css-vendor": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", - "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", - "requires": { - "is-in-browser": "1.1.3" + "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" } }, - "csstype": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.7.tgz", - "integrity": "sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw==" - }, - "csvtojson": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/csvtojson/-/csvtojson-2.0.8.tgz", - "integrity": "sha512-DC6YFtsJiA7t/Yz+KjzT6GXuKtU/5gRbbl7HJqvDVVir+dxdw2/1EgwfgJdnsvUT7lOnON5DvGftKuYWX1nMOQ==", - "requires": { - "bluebird": "3.5.1", - "lodash": "4.17.10", - "strip-bom": "2.0.0" - }, + "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": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - } - } + "@sinonjs/commons": "^3.0.0" } }, - "culvert": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", - "integrity": "sha1-lQL18BVKLVoioCPnn3HMk2+m728=" + "node_modules/@smithy/abort-controller": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", + "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" + "node_modules/@smithy/config-resolver": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.21.tgz", + "integrity": "sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", + "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.45" + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" } }, - "d3": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.7.0.tgz", - "integrity": "sha512-8KEIfx+dFm8PlbJN9PI0suazrZ41QcaAufsKE9PRcqYPWLngHIyWJZX96n6IQKePGgeSu0l7rtlueSSNq8Zc3g==", - "requires": { - "d3-array": "1.2.4", - "d3-axis": "1.0.12", - "d3-brush": "1.0.6", - "d3-chord": "1.0.6", - "d3-collection": "1.0.7", - "d3-color": "1.2.3", - "d3-contour": "1.3.2", - "d3-dispatch": "1.0.5", - "d3-drag": "1.2.3", - "d3-dsv": "1.0.10", - "d3-ease": "1.0.5", - "d3-fetch": "1.1.2", - "d3-force": "1.1.2", - "d3-format": "1.3.2", - "d3-geo": "1.11.1", - "d3-hierarchy": "1.1.8", - "d3-interpolate": "1.3.2", - "d3-path": "1.0.7", - "d3-polygon": "1.0.5", - "d3-quadtree": "1.0.5", - "d3-random": "1.1.2", - "d3-scale": "2.1.2", - "d3-scale-chromatic": "1.3.3", - "d3-selection": "1.3.2", - "d3-shape": "1.2.2", - "d3-time": "1.0.10", - "d3-time-format": "2.1.3", - "d3-timer": "1.0.9", - "d3-transition": "1.1.3", - "d3-voronoi": "1.1.4", - "d3-zoom": "1.7.3" + "node_modules/@smithy/fetch-http-handler": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", + "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" } }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "node_modules/@smithy/hash-node": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", + "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", + "dependencies": { + "@smithy/types": "^2.7.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", + "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } }, - "d3-brush": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz", - "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==", - "requires": { - "d3-dispatch": "1.0.5", - "d3-drag": "1.2.3", - "d3-interpolate": "1.3.2", - "d3-selection": "1.3.2", - "d3-transition": "1.1.3" + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "requires": { - "d3-array": "1.2.4", - "d3-path": "1.0.7" + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", + "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", + "dependencies": { + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + "node_modules/@smithy/middleware-endpoint": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", + "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.15", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-color": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.3.tgz", - "integrity": "sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw==" + "node_modules/@smithy/middleware-retry": { + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.24.tgz", + "integrity": "sha512-q2SvHTYu96N7lYrn3VSuX3vRpxXHR/Cig6MJpGWxd0BWodUQUWlKvXpWQZA+lTaFJU7tUvpKhRd4p4MU3PbeJg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/protocol-http": "^3.0.11", + "@smithy/service-error-classification": "^2.0.8", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-retry": "^2.0.8", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "requires": { - "d3-array": "1.2.4" + "node_modules/@smithy/middleware-retry/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" } }, - "d3-dispatch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", - "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" + "node_modules/@smithy/middleware-serde": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", + "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-drag": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", - "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", - "requires": { - "d3-dispatch": "1.0.5", - "d3-selection": "1.3.2" + "node_modules/@smithy/middleware-stack": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", + "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-dsv": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.10.tgz", - "integrity": "sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g==", - "requires": { - "commander": "2.13.0", - "iconv-lite": "0.4.23", - "rw": "1.3.3" + "node_modules/@smithy/node-config-provider": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", + "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", + "dependencies": { + "@smithy/property-provider": "^2.0.16", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-ease": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", - "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==" + "node_modules/@smithy/node-http-handler": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", + "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", + "dependencies": { + "@smithy/abort-controller": "^2.0.15", + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-fetch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", - "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", - "requires": { - "d3-dsv": "1.0.10" + "node_modules/@smithy/property-provider": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", + "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-force": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.2.tgz", - "integrity": "sha512-p1vcHAUF1qH7yR+e8ip7Bs61AHjLeKkIn8Z2gzwU2lwEf2wkSpWdjXG0axudTHsVFnYGlMkFaEsVy2l8tAg1Gw==", - "requires": { - "d3-collection": "1.0.7", - "d3-dispatch": "1.0.5", - "d3-quadtree": "1.0.5", - "d3-timer": "1.0.9" + "node_modules/@smithy/protocol-http": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", + "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-format": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", - "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + "node_modules/@smithy/querystring-builder": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", + "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", + "dependencies": { + "@smithy/types": "^2.7.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-geo": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.1.tgz", - "integrity": "sha512-GsG7x9G9sykseLviOVSJ3h5yjw0ItLopOtuDQKUt1TRklEegCw5WAmnIpYYiCkSH/QgUMleAeE2xZK38Qb+1+Q==", - "requires": { - "d3-array": "1.2.4" + "node_modules/@smithy/querystring-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", + "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-hierarchy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" + "node_modules/@smithy/service-error-classification": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", + "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", + "dependencies": { + "@smithy/types": "^2.7.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-interpolate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", - "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", - "requires": { - "d3-color": "1.2.3" + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", + "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-path": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", - "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + "node_modules/@smithy/signature-v4": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", + "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-polygon": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", - "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==" + "node_modules/@smithy/smithy-client": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.18.tgz", + "integrity": "sha512-7FqdbaJiVaHJDD9IfDhmzhSDbpjyx+ZsfdYuOpDJF09rl8qlIAIlZNoSaflKrQ3cEXZN2YxGPaNWGhbYimyIRQ==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.9", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-quadtree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.5.tgz", - "integrity": "sha512-U2tjwDFbZ75JRAg8A+cqMvqPg1G3BE7UTJn3h8DHjY/pnsAfWdbJKgyfcy7zKjqGtLAmI0q8aDSeG1TVIKRaHQ==" + "node_modules/@smithy/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", + "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + "node_modules/@smithy/url-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", + "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } }, - "d3-scale": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.1.2.tgz", - "integrity": "sha512-bESpd64ylaKzCDzvULcmHKZTlzA/6DGSVwx7QSDj/EnX9cpSevsdiwdHFYI9ouo9tNBbV3v5xztHS2uFeOzh8Q==", - "requires": { - "d3-array": "1.2.4", - "d3-collection": "1.0.7", - "d3-format": "1.3.2", - "d3-interpolate": "1.3.2", - "d3-time": "1.0.10", - "d3-time-format": "2.1.3" + "node_modules/@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-scale-chromatic": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz", - "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==", - "requires": { - "d3-color": "1.2.3", - "d3-interpolate": "1.3.2" + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", + "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", + "dependencies": { + "tslib": "^2.5.0" } }, - "d3-selection": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.2.tgz", - "integrity": "sha512-OoXdv1nZ7h2aKMVg3kaUFbLLK5jXUFAMLD/Tu5JA96mjf8f2a9ZUESGY+C36t8R1WFeWk/e55hy54Ml2I62CRQ==" + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-shape": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.2.tgz", - "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", - "requires": { - "d3-path": "1.0.7" + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "d3-time": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.10.tgz", - "integrity": "sha512-hF+NTLCaJHF/JqHN5hE8HVGAXPStEq6/omumPE/SxyHVrR7/qQxusFDo0t0c/44+sCGHthC7yNGFZIEgju0P8g==" + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-time-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", - "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", - "requires": { - "d3-time": "1.0.10" + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.22.tgz", + "integrity": "sha512-qcF20IHHH96FlktvBRICDXDhLPtpVmtksHmqNGtotb9B0DYWXsC6jWXrkhrrwF7tH26nj+npVTqh9isiFV1gdA==", + "dependencies": { + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "d3-timer": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", - "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.29.tgz", + "integrity": "sha512-+uG/15VoUh6JV2fdY9CM++vnSuMQ1VKZ6BdnkUM7R++C/vLjnlg+ToiSR1FqKZbMmKBXmsr8c/TsDWMAYvxbxQ==", + "dependencies": { + "@smithy/config-resolver": "^2.0.21", + "@smithy/credential-provider-imds": "^2.1.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } }, - "d3-transition": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.3.tgz", - "integrity": "sha512-tEvo3qOXL6pZ1EzcXxFcPNxC/Ygivu5NoBY6mbzidATAeML86da+JfVIUzon3dNM6UX6zjDx+xbYDmMVtTSjuA==", - "requires": { - "d3-color": "1.2.3", - "d3-dispatch": "1.0.5", - "d3-ease": "1.0.5", - "d3-interpolate": "1.3.2", - "d3-selection": "1.3.2", - "d3-timer": "1.0.9" + "node_modules/@smithy/util-endpoints": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", + "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "d3-zoom": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.3.tgz", - "integrity": "sha512-xEBSwFx5Z9T3/VrwDkMt+mr0HCzv7XjpGURJ8lWmIC8wxe32L39eWHIasEe/e7Ox8MPU4p1hvH8PKN2olLzIBg==", - "requires": { - "d3-dispatch": "1.0.5", - "d3-drag": "1.2.3", - "d3-interpolate": "1.3.2", - "d3-selection": "1.3.2", - "d3-transition": "1.1.3" + "node_modules/@smithy/util-middleware": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", + "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" + "node_modules/@smithy/util-retry": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", + "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", + "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "dasherize": { + "node_modules/@smithy/util-uri-escape": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", - "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==" - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debounce": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", - "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" + "node_modules/@smithy/util-utf8": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" + "node_modules/@smithy/util-waiter": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", + "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "node_modules/@testing-library/dom": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", + "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", "dev": true, - "requires": { - "decamelize": "1.2.0", - "map-obj": "1.0.1" - }, "dependencies": { - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decimal.js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.0.1.tgz", - "integrity": "sha512-vklWB5C4Cj423xnaOtsUmAv0/7GqlXIgDv2ZKDyR64OV3OSzGHNx2mk4p/1EKnB5s70k73cIOOEcG9YzF0q4Lw==" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-metrics": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/deep-metrics/-/deep-metrics-0.0.2.tgz", - "integrity": "sha512-2b4DO8YcPWSHrZ7XW9YjjJajmflw2EhKUMmeriZmGYsC8XvCWIyztsEjCQ3f5kIQO+ItzBK7BqVjSWlFZQtONQ==", - "requires": { - "semver": "5.5.0" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" } }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "node_modules/@testing-library/dom/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, - "requires": { - "clone": "1.0.4" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.12" + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz", + "integrity": "sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw==", + "dev": true, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } + "@adobe/css-tools": "^4.3.1", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } + "@types/jest": { + "optional": true }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } + "jest": { + "optional": true + }, + "vitest": { + "optional": true } } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "node_modules/@testing-library/jest-dom/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, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "node_modules/@testing-library/jest-dom/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, - "requires": { - "repeating": "2.0.1" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { - "colorspace": "1.1.1", - "enabled": "1.0.2", - "kuler": "1.0.0" + "node_modules/@testing-library/jest-dom/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/@testing-library/react": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz", + "integrity": "sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.14", - "streamsearch": "0.1.2" + "node_modules/@testing-library/user-event": { + "version": "14.5.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz", + "integrity": "sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "engines": { + "node": ">= 10" } }, - "dns-prefetch-control": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", - "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true }, - "dom-helpers": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", - "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, - "dont-sniff-mimetype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", - "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "node_modules/@types/aria-query": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz", + "integrity": "sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dev": true, - "requires": { - "is-obj": "1.0.1" + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "dtrace-provider": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", - "integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=", - "optional": true, - "requires": { - "nan": "2.11.1" + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "node_modules/@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.2.7", - "stream-shift": "1.0.0" + "dependencies": { + "@babel/types": "^7.3.0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" }, - "electron-to-chromium": { - "version": "1.3.50", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.50.tgz", - "integrity": "sha1-dDi3b5K0G5GfP73TUPvQdX2s3fc=", - "dev": true + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.5", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" }, - "emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "requires": { - "shimmer": "1.2.0" + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" } }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true + "node_modules/@types/d3-path": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", + "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==" }, - "emotion": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/emotion/-/emotion-9.2.12.tgz", - "integrity": "sha512-hcx7jppaI8VoXxIWEhxpDW7I+B4kq9RNzQLmsrF6LY8BGKqe2N+gFAQr0EfuFucFlPs2A9HM4+xNj4NeqEWIOQ==", - "requires": { - "babel-plugin-emotion": "9.2.11", - "create-emotion": "9.2.12" + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" } }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.4" + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dependencies": { + "@types/d3-path": "*" } }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.23" - } + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "node_modules/@types/eslint": { + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "engine.io": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", - "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", - "requires": { - "accepts": "1.3.5", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "3.1.0", - "engine.io-parser": "2.1.2", - "ws": "3.3.3" - }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "@types/estree": "*", + "@types/json-schema": "*" } }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "3.1.0", - "engine.io-parser": "2.1.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "3.3.3", - "xmlhttprequest-ssl": "1.5.5", - "yeast": "0.1.2" - }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "@types/eslint": "*", + "@types/estree": "*" } }, - "engine.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", - "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary2": "1.0.3" - } + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.0.0" + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" } }, - "env-variable": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.4.tgz", - "integrity": "sha512-+jpGxSWG4vr6gVxUHOc4p+ilPnql7NzZxOZBxNldsKGjCF+97df3CbuX7XMaDa5oAVkKQj4rKp38rYdC4VcpDg==" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, - "requires": { - "prr": "1.0.1" + "dependencies": { + "@types/node": "*" } }, - "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==", - "requires": { - "is-arrayish": "0.2.1" - } + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.3", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "dependencies": { + "@types/istanbul-lib-coverage": "*" } }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "dependencies": { + "@types/istanbul-lib-report": "*" } }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "node_modules/@types/jest": { + "version": "29.5.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", + "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-symbol": "3.1.1" + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" } }, - "es6-promise": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - } + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true }, - "escape-latex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.1.1.tgz", - "integrity": "sha512-N2D6Z2kXh8x/pQNQH+natXDCwrzghhXMRII5dZ518mlTLeuba80NL0LCQyaahqOrAidoLivmmG6GKPnGhHse+A==" + "node_modules/@types/node": { + "version": "20.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.1.tgz", + "integrity": "sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg==", + "dev": true }, - "escape-regexp": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/escape-regexp/-/escape-regexp-0.0.1.tgz", - "integrity": "sha1-9EvaEtRbvfnLf4Yu5+SCez3TIlQ=" + "node_modules/@types/parse-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "4.2.0" + "node_modules/@types/react": { + "version": "18.2.33", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.33.tgz", + "integrity": "sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "node_modules/@types/react-dom": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "node_modules/@types/react-transition-group": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "dependencies": { + "@types/react": "*" + } }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "node_modules/@types/scheduler": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" }, - "event-loop-inspector": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/event-loop-inspector/-/event-loop-inspector-1.2.2.tgz", - "integrity": "sha512-v7OqIPmO0jqpmSH4Uc6IrY/H6lOidYzrXHE8vPHLDDOfV1Pw+yu+KEIE/AWnoFheWYlunZbxzKpZBAezVlrU9g==" + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true }, - "eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "node_modules/@types/tough-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz", + "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.1.2" - } + "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==" }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "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, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, + "node_modules/@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } + "@types/yargs-parser": "*" } }, - "expect-ct": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.1.tgz", - "integrity": "sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg==" + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true }, - "exports-loader": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.7.0.tgz", - "integrity": "sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, - "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.0" - }, "dependencies": { - "source-map": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.0.tgz", - "integrity": "sha1-D+llA6yGpa213mP05BKuSHLNvoY=", - "dev": true + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "requires": { - "accepts": "1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.4", - "qs": "6.5.2", - "range-parser": "1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, + "node_modules/@typescript-eslint/eslint-plugin/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==", + "dev": true, "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "express-session": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", - "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "crc": "3.4.4", - "debug": "2.6.9", - "depd": "1.1.2", - "on-headers": "1.0.1", - "parseurl": "1.3.2", - "uid-safe": "2.1.5", - "utils-merge": "1.0.1" - }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "2.0.4" - } + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "extsprintf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", - "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=" + "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "fast-deep-equal": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", - "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.18" - }, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - } + "balanced-match": "^1.0.0" } }, - "fclone": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", - "integrity": "sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=" - }, - "feature-policy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.1.0.tgz", - "integrity": "sha512-Sq+O5vUN0wQGOLGKzDXY1xCY6dOPic2ufMEF0xpVHIW+Dr8LocJ7Jhnvo5ZBCXKqWUgmGIqcF5AIJR+Wnq2SQw==" - }, - "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" - }, - "file-saver": { - "version": "2.0.0-rc.4", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.0-rc.4.tgz", - "integrity": "sha512-6Runcc5CffLF9Rpf/MLc3db9eOi2f7b+DvBXpSpJ/hEy+olM+Bw0kx/bOnnp1X4QgOkFZe8ojrM4iZ0JCWmVMQ==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" - }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "node_modules/@typescript-eslint/typescript-estree/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==", "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "requires": { - "locate-path": "2.0.0" + "engines": { + "node": ">=8" } }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.2.7" + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "follow-redirects": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", - "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", - "requires": { - "debug": "3.1.0" - }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } }, - "foreach": { + "node_modules/@webpack-cli/serve": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true }, - "fraction.js": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.10.tgz", - "integrity": "sha512-MHkhk6ggCtwVhKR4pbF+aWrV+8cIVxyWhucESF/1NEcYDgRm4oze/2M09yGTGUQ3WQyZSdcoswJSThc2VGb+KQ==" + "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==", + "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "0.2.2" + "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" } }, - "frameguard": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", - "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk=" + "node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.2.7" + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "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==", "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.2.7" + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "fs.realpath": { + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "optional": true, - "requires": { - "nan": "2.11.1", - "node-pre-gyp": "0.10.0" + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "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-escapes/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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "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/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "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, + "license": "MIT", + "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/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-cdk": { + "version": "2.102.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.102.0.tgz", + "integrity": "sha512-q+FQSeX/25QvZ1/Fxjr7GydMY/WR/+iTif2EiaN7rUlEEZx27o0I5k1p9YmTNUGiBl13ZvggIJjwTRmnL7E/lg==", + "dev": true, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.100.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.100.0.tgz", + "integrity": "sha512-oWDPcbdqD69wDIUvcGdbDxmKcDfkCg515wf8JkiQLnhAI/AFyKAVTEWhbSUi00lvJQNUjX8Mal2lbKlCRA4hjQ==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml" + ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.200", + "@aws-cdk/asset-kubectl-v20": "^2.1.2", + "@aws-cdk/asset-node-proxy-agent-v6": "^2.0.1", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.1.1", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.5.4", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.2.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.5.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/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==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/babel-jest": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.2.2.tgz", + "integrity": "sha512-kkq2QSDIuvpgfoac3WZ1OOcHsQQDU5xYk2Ql7tLdJ8BVAYbefEXal+NfS45Y5LVZA7cxC8KYcQMObpCt1J025w==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.2.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "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-jest/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/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-loader/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.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-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "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-plugin-polyfill-corejs2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.0", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/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-polyfill-corejs3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-react-html-attrs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-react-html-attrs/-/babel-plugin-react-html-attrs-3.0.5.tgz", + "integrity": "sha512-o6RClilXl0T7HfVsHUE+xHV0HMBX0SzB94MMIrT52089CA6Sd4eXkY7jLHknQktFQ5UHpSXYPP0x7fUnIY97Qg==", + "dev": true + }, + "node_modules/babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + } + }, + "node_modules/babel-polyfill/node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.2.0", + "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/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "dependencies": { + "safe-buffer": "5.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "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/body-parser/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/body-parser/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/body-parser/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/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.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/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "license": "Apache-2.0", + "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, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "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/caniuse-lite": { + "version": "1.0.30001566", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", + "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "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==", + "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/chalk/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/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==" + }, + "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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/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/clean-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", + "dev": true, + "dependencies": { + "del": "^4.1.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.0 <6.0.0" + } + }, + "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/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorbrewer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.3.0.tgz", + "integrity": "sha512-AzVPpWa+fuO/qY8LxPQjej6F49Lb2Cl+7U9YhPn6y4/SOY6u/EZiXUc7qHzRb6i6fWPStCUdEaU2731QyQKWjg==" + }, + "node_modules/colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + }, + "node_modules/colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/colorspace": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", + "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", + "dependencies": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "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/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concurrently": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", + "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/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/concurrently/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/connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/connect-mongo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-5.1.0.tgz", + "integrity": "sha512-xT0vxQLqyqoUTxPLzlP9a/u+vir0zNkhiy9uAdHjSCcUUf7TS5b55Icw8lVyYFxfemP3Mf9gdwUOgeF3cxCAhw==", + "dependencies": { + "debug": "^4.3.1", + "kruptein": "^3.0.0" + }, + "engines": { + "node": ">=12.9.0" + }, + "peerDependencies": { + "express-session": "^1.17.1", + "mongodb": ">= 5.1.0 < 7" + } + }, + "node_modules/constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", + "engines": { + "node": ">= 16.14.0" + } + }, + "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-disposition/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/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": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "dependencies": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", + "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/csv-stringify": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.3.0.tgz", + "integrity": "sha512-kTnnBkkLmAR1G409aUdShppWUClNbBQZXhrKrXzKYBGw4yfROspiFvVmjbKonCrdGfwnqwMXKLQG7ej7K/jwjg==" + }, + "node_modules/d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "dependencies": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "node_modules/d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "dependencies": { + "d3-array": "1", + "d3-path": "1" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "dependencies": { + "d3-array": "^1.1.1" + } + }, + "node_modules/d3-dispatch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", + "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" + }, + "node_modules/d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/d3-dsv": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.10.tgz", + "integrity": "sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g==", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/d3-ease": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", + "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==" + }, + "node_modules/d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "dependencies": { + "d3-dsv": "1" + } + }, + "node_modules/d3-force": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.2.tgz", + "integrity": "sha512-p1vcHAUF1qH7yR+e8ip7Bs61AHjLeKkIn8Z2gzwU2lwEf2wkSpWdjXG0axudTHsVFnYGlMkFaEsVy2l8tAg1Gw==", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + }, + "node_modules/d3-geo": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.1.tgz", + "integrity": "sha512-GsG7x9G9sykseLviOVSJ3h5yjw0ItLopOtuDQKUt1TRklEegCw5WAmnIpYYiCkSH/QgUMleAeE2xZK38Qb+1+Q==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" + }, + "node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + }, + "node_modules/d3-polygon": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", + "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==" + }, + "node_modules/d3-quadtree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.5.tgz", + "integrity": "sha512-U2tjwDFbZ75JRAg8A+cqMvqPg1G3BE7UTJn3h8DHjY/pnsAfWdbJKgyfcy7zKjqGtLAmI0q8aDSeG1TVIKRaHQ==" + }, + "node_modules/d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "dependencies": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "dependencies": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "node_modules/d3-selection": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.2.tgz", + "integrity": "sha512-OoXdv1nZ7h2aKMVg3kaUFbLLK5jXUFAMLD/Tu5JA96mjf8f2a9ZUESGY+C36t8R1WFeWk/e55hy54Ml2I62CRQ==" + }, + "node_modules/d3-shape": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.2.tgz", + "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-time": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.10.tgz", + "integrity": "sha512-hF+NTLCaJHF/JqHN5hE8HVGAXPStEq6/omumPE/SxyHVrR7/qQxusFDo0t0c/44+sCGHthC7yNGFZIEgju0P8g==" + }, + "node_modules/d3-time-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", + "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/d3-timer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", + "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" + }, + "node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "dependencies": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "node_modules/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "devOptional": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.0.0.tgz", + "integrity": "sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/debug/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/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.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/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "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/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "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-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/diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.2.0.tgz", + "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.610", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", + "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==", + "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==", + "dev": true + }, + "node_modules/enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "dependencies": { + "env-variable": "0.0.x" + } + }, + "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/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-variable": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.4.tgz", + "integrity": "sha512-+jpGxSWG4vr6gVxUHOc4p+ilPnql7NzZxOZBxNldsKGjCF+97df3CbuX7XMaDa5oAVkKQj4rKp38rYdC4VcpDg==" + }, + "node_modules/envinfo": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.9.0.tgz", + "integrity": "sha512-RODB4txU+xImYDemN5DqaKC0CHk05XSVkOX4pq0hK26Qx+1LChkuOyUDlGEjYb3ACr0n9qBhFjg37hQuJvpkRQ==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "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/es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-universe": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-universe/-/eslint-config-universe-12.0.0.tgz", + "integrity": "sha512-78UxGByheyDNL1RhszWYeDzWiBaUtLnFSeI20pJI89IXa9OAEZQHzG/iBFpMeaCs7Hqyg0wYJcuCbCx535wB7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "peerDependencies": { + "eslint": ">=8.10", + "prettier": ">=3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/eslint-config-universe/node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/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==", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/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==", + "dev": true + }, + "node_modules/eslint-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin/-/eslint-plugin-1.0.1.tgz", + "integrity": "sha512-ervp8C09On0fLA258TvE08AqAr/bhRYgHVZd3BrJjD4JfOA2JGANDLGs06j51oWqfPd7Feoo3OoqHD+fuI2sFQ==", + "dev": true, + "dependencies": { + "requireindex": "~1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/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==", + "dev": true + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-jest/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-jest/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jest/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/eslint-plugin-no-only-tests": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", + "dev": true, + "engines": { + "node": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/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/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/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/eslint-plugin-sort-keys-fix": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-sort-keys-fix/-/eslint-plugin-sort-keys-fix-1.1.2.tgz", + "integrity": "sha512-DNPHFGCA0/hZIsfODbeLZqaGY/+q3vgtshF85r+YWDNCQ2apd9PNs/zL6ttKm0nD1IFwvxyg3YOTI7FHl4unrw==", + "dev": true, + "dependencies": { + "espree": "^6.1.2", + "esutils": "^2.0.2", + "natural-compare": "^1.4.0", + "requireindex": "~1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-sort-keys-fix/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint-plugin-sort-keys-fix/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-sort-keys-fix/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-sort-keys-fix/node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true, + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.2.0.tgz", + "integrity": "sha512-+LCYJU81WF2yQ+Xu4A135CgK8IszcFcyMF4sWkbiu6Oj+Nel0TrkZq/HvDw0/1WuO3dhDQsZA/OpEMGd0NfcUw==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-testing-library/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-testing-library/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/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/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/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "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/execa/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/execa/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/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.2.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.2.2.tgz", + "integrity": "sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.2.2", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "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/express-session": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.0.tgz", + "integrity": "sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ==", + "dependencies": { + "cookie": "0.6.0", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/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/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" + }, + "node_modules/express-session/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/express-session/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/express-session/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/express/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/express/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/express/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/express/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/express/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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "engines": { + "node": ">=6.0.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, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/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/fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.0-rc.4", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.0-rc.4.tgz", + "integrity": "sha512-6Runcc5CffLF9Rpf/MLc3db9eOi2f7b+DvBXpSpJ/hEy+olM+Bw0kx/bOnnp1X4QgOkFZe8ojrM4iZ0JCWmVMQ==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "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/finalhandler/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/finalhandler/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/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, + "license": "MIT", + "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-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "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/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-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-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "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-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/helmet": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", + "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "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/http-errors/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/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "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": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "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-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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==", + "dev": true, + "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-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/istanbul-lib-instrument/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/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/jest": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.2.2.tgz", + "integrity": "sha512-r+0zCN9kUqoON6IjDdjbrsWobXM/09Nd45kIPRD8kloaRh1z5ZCMdVsgLXGxmlL7UpAJsvCYOQNO+NjvG/gqiQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.2.2", + "@jest/types": "^29.2.1", + "import-local": "^3.0.2", + "jest-cli": "^29.2.2" + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/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/jest-circus": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.2.2.tgz", + "integrity": "sha512-upSdWxx+Mh4DV7oueuZndJ1NVdgtTsqM4YgywHEx05UMH5nxxA2Qu9T9T9XVuR021XxqSoaKvSmmpAbjwwwxMw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.2.2", + "@jest/expect": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.2.1", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-runtime": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/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/jest-circus/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/jest-cli": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.2.2.tgz", + "integrity": "sha512-R45ygnnb2CQOfd8rTPFR+/fls0d+1zXS6JPYTBBrnLPrhr58SSuPTiA5Tplv8/PXpz4zXR/AYNxmwIj6J6nrvg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "prompts": "^2.0.1", + "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.2.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.2.2.tgz", + "integrity": "sha512-Q0JX54a5g1lP63keRfKR8EuC7n7wwny2HoTRDb8cx78IwQOiaYUVZAdjViY3WcTxpR02rPUpvNVmZ1fkIlZPcw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.2.2", + "@jest/types": "^29.2.1", + "babel-jest": "^29.2.2", + "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.2.2", + "jest-environment-node": "^29.2.2", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-runner": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.2.1", + "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-config/node_modules/ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "node_modules/jest-config/node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-config/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/jest-config/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/jest-config/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/jest-diff": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.2.1.tgz", + "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.2.0", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "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.2.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.2.1.tgz", + "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.2.1", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.2.2.tgz", + "integrity": "sha512-B7qDxQjkIakQf+YyrqV5dICNs7tlCO55WJ4OMSXsqz1lpI/0PmeuXdx2F7eU8rnPbRkUR/fItSSUh0jvE2y/tw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.2.2", + "@jest/fake-timers": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "jest-mock": "^29.2.2", + "jest-util": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.2.1.tgz", + "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "@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.2.0", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", + "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-haste-map/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/jest-haste-map/node_modules/jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/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/jest-haste-map/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/jest-leak-detector": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz", + "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz", + "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + }, + "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-message-util/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/jest-message-util/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/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.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.2.2.tgz", + "integrity": "sha512-3gaLpiC3kr14rJR3w7vWh0CBX2QAhfpfiQTwrFPvVrcHe5VUBtIXaR004aWE/X9B2CFrITOQAp5gxLONGrk6GA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.2.tgz", + "integrity": "sha512-wWOmgbkbIC2NmFsq8Lb+3EkHuW5oZfctffTGvwsA4JcJ1IRk8b2tg+hz44f0lngvRTeHvp3Kyix9ACgudHH9aQ==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.2.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/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/jest-runner": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.2.2.tgz", + "integrity": "sha512-1CpUxXDrbsfy9Hr9/1zCUUhT813kGGK//58HeIw/t8fa/DmkecEwZSWlb1N/xDKXg3uCFHQp1GCvlSClfImMxg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.2.1", + "@jest/environment": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.2.2", + "jest-haste-map": "^29.2.1", + "jest-leak-detector": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-resolve": "^29.2.2", + "jest-runtime": "^29.2.2", + "jest-util": "^29.2.1", + "jest-watcher": "^29.2.2", + "jest-worker": "^29.2.1", + "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-runner/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/jest-runner/node_modules/jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/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/jest-runner/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/jest-runner/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/jest-runner/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/jest-runtime": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.2.2.tgz", + "integrity": "sha512-TpR1V6zRdLynckKDIQaY41od4o0xWL+KOPUCZvJK2bu5P1UXhjobt5nJ2ICNeIxgyj9NGkO0aWgDqYPVhDNKjA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.2.2", + "@jest/fake-timers": "^29.2.2", + "@jest/globals": "^29.2.2", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@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.2.1", + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.2", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/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/jest-runtime/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/jest-snapshot": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.2.2.tgz", + "integrity": "sha512-GfKJrpZ5SMqhli3NJ+mOspDqtZfJBryGA8RIBxF+G+WbDoC7HCqKaeAss4Z/Sab6bAW11ffasx8/vGsj83jyjA==", + "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/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.2.2", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.2.2", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.2.1", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.2.1", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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-util/node_modules/ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "node_modules/jest-validate": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.2.2.tgz", + "integrity": "sha512-eJXATaKaSnOuxNfs8CLHgdABFgUrd0TtWS8QckiJ4L/QVDF4KVbZFBBOwCBZHOS0Rc5fOxqngXeGXE3nGQkpQA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.2.2.tgz", + "integrity": "sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.2.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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/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": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "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/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "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==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.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/kruptein": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/kruptein/-/kruptein-3.0.6.tgz", + "integrity": "sha512-EQJjTwAJfQkC4NfdQdo3HXM2a9pmBm8oidzH270cYu1MbgXPNPMJuldN7OPX+qdhPO5rw4X3/iKz0BFBfkXGKA==", + "dependencies": { + "asn1.js": "^5.4.1" + }, + "engines": { + "node": ">8" + } + }, + "node_modules/kuler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.0.tgz", + "integrity": "sha512-oyy6pu/yWRjiVfCoJebNUKFL061sNtrs9ejKTbirIwY3oiHmENVCSkHhxDV85Dkm7JYR/czMCBeoM87WilTdSg==", + "dependencies": { + "colornames": "^1.1.1" + } + }, + "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/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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==" + }, + "node_modules/livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/livereload-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", + "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "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": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/logform": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", + "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", + "dependencies": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.2.0" + } + }, + "node_modules/logform/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "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": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "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": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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, + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb-memory-server": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-9.2.0.tgz", + "integrity": "sha512-w/usKdYtby5EALERxmA0+et+D0brP0InH3a26shNDgGefXA61hgl6U0P3IfwqZlEGRZdkbZig3n57AHZgDiwvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "mongodb-memory-server-core": "9.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/mongodb-memory-server-core": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-9.2.0.tgz", + "integrity": "sha512-9SWZEy+dGj5Fvm5RY/mtqHZKS64o4heDwReD4SsfR7+uNgtYo+JN41kPCcJeIH3aJf04j25i5Dia2s52KmsMPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-mutex": "^0.4.0", + "camelcase": "^6.3.0", + "debug": "^4.3.4", + "find-cache-dir": "^3.3.2", + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^7.0.4", + "mongodb": "^5.9.1", + "new-find-package-json": "^2.0.0", + "semver": "^7.6.0", + "tar-stream": "^3.1.7", + "tslib": "^2.6.2", + "yauzl": "^3.1.3" + }, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.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, + "license": "Apache-2.0", + "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/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb/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/mongodb/node_modules/bson": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.3.0.tgz", + "integrity": "sha512-balJfqwwTBddxfnidJZagCBPP/f48zj9Sdp3OJswREOgsJzHiQSaOIAtApSgDQFYgHqAvFkp53AFSqjMDZoTFw==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/mongodb/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/mongodb/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/mongodb/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/morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "dependencies": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "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/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "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, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.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/nodemailer": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", + "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nodemon/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/nodemon/node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "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/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "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/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "dev": true, + "dependencies": { + "array.prototype.reduce": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, + "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/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, + "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-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-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", + "engines": { + "node": ">= 0.4.0" + } + }, + "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "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==" + }, + "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": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "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, + "license": "MIT" + }, + "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/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "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/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "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/pretty-format/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/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/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" + }, + "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/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "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": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-colorful": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", + "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.45.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz", + "integrity": "sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-router": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.13.0.tgz", + "integrity": "sha512-Si6KnfEnJw7gUQkNa70dlpI1bul46FuSxX5t5WwlUBxE25DAz2BjVkwaK8Y2s242bQrZPXCpmwLPtIO5pv4tXg==", + "dependencies": { + "@remix-run/router": "1.6.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.13.0.tgz", + "integrity": "sha512-6Nqoqd7fgwxxVGdbiMHTpDHCYPq62d7Wk1Of7B82vH7ZPwwsRaIa22zRZKPPg413R5REVNiyuQPKDG1bubcOFA==", + "dependencies": { + "@remix-run/router": "1.6.3", + "react-router": "6.13.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-smooth": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz", + "integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==", + "dependencies": { + "fast-equals": "^5.0.0", + "react-transition-group": "2.9.0" + }, + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dependencies": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.4.tgz", + "integrity": "sha512-/Q7/wdf8bW91lN3NEeCjL9RWfaiXQViJFgdnas4Eix/I8B9HAI3tHHK/CW/zDfgRMh4fzW1zlfjoz1IAapLO1Q==", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.19", + "react-is": "^16.10.2", + "react-smooth": "^2.0.5", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "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/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==", + "dev": true, + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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-cwd/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": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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/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/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/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/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/send/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/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "dependencies": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-favicon/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "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-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/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "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/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "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.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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==", + "engines": { + "node": ">=0.10.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/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/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/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.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/style-loader": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color/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==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/terser": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", + "integrity": "sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "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/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "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-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/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=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/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-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.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/victory-vendor": { + "version": "36.8.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.8.2.tgz", + "integrity": "sha512-NfSQi7ISCdBbDpn3b6rg+8RpFZmWIM9mcks48BbogHE2F6h1XKdA34oiCKP5hP1OGvTotDRzsexiJKzrK4Exuw==", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/victory-vendor/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "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/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/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==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/winston": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz", + "integrity": "sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==", + "dependencies": { + "async": "^2.6.0", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^1.9.1", + "one-time": "0.0.4", + "readable-stream": "^2.3.6", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.2.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/winston-transport": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz", + "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==", + "dependencies": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/winston-transport/node_modules/process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/winston-transport/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/winston/node_modules/process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/winston/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "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": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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" + } + }, + "node_modules/yup": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.3.3.tgz", + "integrity": "sha512-v8QwZSsHH2K3/G9WSkp6mZKO+hugKT1EmnMqLNUcfu51HU9MDyhlETT/JgtzprnrnQHPWsjc6MUDMBp/l9fNnw==", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@adobe/css-tools": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", + "dev": true + }, + "@aws-cdk/asset-awscli-v1": { + "version": "2.2.200", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz", + "integrity": "sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==" + }, + "@aws-cdk/asset-kubectl-v20": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", + "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" + }, + "@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.0.1.tgz", + "integrity": "sha512-DDt4SLdLOwWCjGtltH4VCST7hpOI5DzieuhGZsBpZ+AgJdSI2GCjklCXm0GCTwJG/SolkL5dtQXyUKgg9luBDg==" + }, + "@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "requires": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.470.0.tgz", + "integrity": "sha512-oE665xfl/KwvbcNtvUxMCKwh+X3wOV5UgPrPSptK+DzUJbtL4FAP7h6QIVzUB5CkzqhQVRAmYvdf+XhfXz3T3g==", + "optional": true, + "peer": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.470.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/credential-provider-node": "3.470.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-sdk/core": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", + "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", + "optional": true, + "peer": true, + "requires": { + "@smithy/smithy-client": "^2.1.18", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "optional": true, + "peer": true, + "requires": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + } + } + } + }, + "@aws-sdk/client-ses": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.437.0.tgz", + "integrity": "sha512-8aa68tNjop/R0xCstg4SVb8lZlDp0t0cOCfpCh32NiaPfngiqx89/oTyOqV/jZStgA3XbSw2bA+lLDqD5yG+9g==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.437.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.12", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-sdk/client-sso": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.437.0.tgz", + "integrity": "sha512-AxlLWz9ec3b8Bt+RqRb2Q1ucGQtKrLdKDna+UTjz7AouB/jpoMiegV9NHXVX64N6YFnQnvB0UEGigXiOQE+y/g==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/client-sts": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.437.0.tgz", + "integrity": "sha512-ilLcrCVwH81UbKNpB9Vax1Fw/mNx2d/bWXkCNXPvrExO+K39VFGS/VijOuSrru2iBq844NlG3uQV8DL/nbiKdA==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-sts": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.437.0.tgz", + "integrity": "sha512-UybiJxYPvdwok5OcI9LakaHmaWZBdkX0gY8yU2n7TomYgWOwDJ88MpQgjXUJJ249PH+9/+How5H3vnFp0xJ0uQ==", + "requires": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.437.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.437.0.tgz", + "integrity": "sha512-FMtgEe/me68xZQsymEpMcw7OuuiHaHx/Tp5EqZP5FC0Yv1yX3qr/ncIWU2zY3a9K0iLERmzQI1g3CMd8r4sy8A==", + "requires": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-ini": "3.437.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.437.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.437.0.tgz", + "integrity": "sha512-kijtnyyA6/+ipOef4KACsLDUTFWDZ97DSWKU0hJFyGEfelaon6o7NNVufuVOWrBNyklNWZqvPLuwWWQCxb6fuQ==", + "requires": { + "@aws-sdk/client-sso": "3.437.0", + "@aws-sdk/token-providers": "3.437.0", + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", + "requires": { + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.433.0.tgz", + "integrity": "sha512-jMgA1jHfisBK4oSjMKrtKEZf0sl2vzADivkFmyZFzORpSZxBnF6hC21RjaI+70LJLcc9rSCzLgcoz5lHb9LLDg==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/types": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.433.0.tgz", + "integrity": "sha512-LFNUh9FH7RMtYjSjPGz9lAJQMzmJ3RcXISzc5X5k2R/9mNwMK7y1k2VAfvx+RbuDbll6xwsXlgv6QHcxVdF2zw==", + "requires": { + "@aws-sdk/types": "3.433.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + } + } + }, + "@aws-sdk/client-sso": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.470.0.tgz", + "integrity": "sha512-iMXqdXuypE3OK0rggbvSz7vBGlLDG418dNidHhdaeLluMTG/GfHbh1fLOlavhYxRwrsPrtYvFiVkxXFGzXva4w==", + "optional": true, + "peer": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-sdk/core": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", + "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", + "optional": true, + "peer": true, + "requires": { + "@smithy/smithy-client": "^2.1.18", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "optional": true, + "peer": true, + "requires": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + } + } + } + }, + "@aws-sdk/client-sts": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.470.0.tgz", + "integrity": "sha512-TP3A4t8FoFEQinm6axxduTUnlMMLpmLi4Sf00JTI2CszxLUFh/JyUhYQ5gSOoXgPFmfwVXUNKCtmR3jdP0ZGPw==", + "optional": true, + "peer": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/credential-provider-node": "3.470.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-sdk-sts": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-sdk/core": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", + "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", + "optional": true, + "peer": true, + "requires": { + "@smithy/smithy-client": "^2.1.18", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "optional": true, + "peer": true, + "requires": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + } + } + } + }, + "@aws-sdk/core": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.436.0.tgz", + "integrity": "sha512-vX5/LjXvCejC2XUY6TSg1oozjqK6BvkE75t0ys9dgqyr5PlZyZksMoeAFHUlj0sCjhT3ziWCujP1oiSpPWY9hg==", + "requires": { + "@smithy/smithy-client": "^2.1.12" + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.470.0.tgz", + "integrity": "sha512-c0YtiBbg4z/4iLnn3gtUtGKBZMQLRk79LjzCN6x98MpIsRTeEBL+4BHYNwFb8C+S4wVDYh2OWqjw1Su6Ues3Wg==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", + "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-http": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.468.0.tgz", + "integrity": "sha512-pUF+gmeCr4F1De69qEsWgnNeF7xzlLcjiGcbpO6u9k6NQdRR7Xr3wTQnQt1+3MgoIdbgoXpCfQYNZ4LfX6B/sA==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.470.0.tgz", + "integrity": "sha512-eF22iPO6J2jY+LbuTv5dW0hZBmi6ksRDFFd/zT6TLasrzH2Ex+gAfN3c7rFHF+XAubL0JXFUKFA3UAwoZpO9Zg==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.470.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.470.0.tgz", + "integrity": "sha512-paySXwzGxBVU+2cVUkRIXafKhYhtO2fJJ3MotR6euvRONK/dta+bhEc5Z4QnTo/gNLoELK/QUC0EGoF+oPfk8g==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-ini": "3.470.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.470.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", + "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.470.0.tgz", + "integrity": "sha512-biGDSh9S9KDR9Tl/8cCPn9g5KPNkXg/CIJIOk3X+6valktbJ2UVYBzi0ZX4vZiudt5ry/Hsu6Pgo+KN1AmBWdg==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/client-sso": "3.470.0", + "@aws-sdk/token-providers": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "optional": true, + "peer": true, + "requires": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/token-providers": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.470.0.tgz", + "integrity": "sha512-rzxnJxEUJiV69Cxsf0AHXTqJqTACITwcSH/PL4lWP4uvtzdrzSi3KA3u2aWHWpOcdE6+JFvdICscsbBSo3/TOg==", + "optional": true, + "peer": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + } + } + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", + "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-providers": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.470.0.tgz", + "integrity": "sha512-aCI/z6L+LwPSUHTsf27WMs3Z7Dfg1idgEOtf0dCkk+T1SZnJA0D/JS0KjQag9rIuqYQsxewx6RCIHus5WJ3czA==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.470.0", + "@aws-sdk/client-sso": "3.470.0", + "@aws-sdk/client-sts": "3.470.0", + "@aws-sdk/credential-provider-cognito-identity": "3.470.0", + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-http": "3.468.0", + "@aws-sdk/credential-provider-ini": "3.470.0", + "@aws-sdk/credential-provider-node": "3.470.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.470.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", + "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", + "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", + "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.468.0.tgz", + "integrity": "sha512-xRy8NKfHbmafHwdbotdWgHBvRs0YZgk20GrhFJKp43bkqVbJ5bNlh3nQXf1DeFY9fARR84Bfotya4fwCUHWgZg==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", + "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.470.0.tgz", + "integrity": "sha512-s0YRGgf4fT5KwwTefpoNUQfB5JghzXyvmPfY1QuFEMeVQNxv0OPuydzo3rY2oXPkZjkulKDtpm5jzIHwut75hA==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", + "requires": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/token-providers": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.437.0.tgz", + "integrity": "sha512-nV9qIuG0+6XJb7hWpCC+/K7RoY3PZUWndP8BRQv7PQhhpd8tG/I5Kxb0V83h2XFBXyyjnv0aOHO8ehz3Kfcv2Q==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-sdk/middleware-host-header": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.433.0.tgz", + "integrity": "sha512-jMgA1jHfisBK4oSjMKrtKEZf0sl2vzADivkFmyZFzORpSZxBnF6hC21RjaI+70LJLcc9rSCzLgcoz5lHb9LLDg==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/types": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.433.0.tgz", + "integrity": "sha512-LFNUh9FH7RMtYjSjPGz9lAJQMzmJ3RcXISzc5X5k2R/9mNwMK7y1k2VAfvx+RbuDbll6xwsXlgv6QHcxVdF2zw==", + "requires": { + "@aws-sdk/types": "3.433.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + } + } + }, + "@aws-sdk/types": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", + "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.470.0.tgz", + "integrity": "sha512-6N6VvPCmu+89p5Ez/+gLf+X620iQ9JpIs8p8ECZiCodirzFOe8NC1O2S7eov7YiG9IHSuodqn/0qNq+v+oLe0A==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/util-endpoints": "^1.0.7", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.201.0.tgz", + "integrity": "sha512-hPJgifWh/rADabLAk1C9xXA2B3O4NUmbU58KgBRgC1HksiiHGFVZObB5fkBH8US/XV2jwORkpSf4OhretXQuKg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", + "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz", + "integrity": "sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.468.0", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@babel/cli": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0", + "commander": "^4.0.1", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "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 + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + } + } + }, + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/compat-data": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", + "dev": true + }, + "@babel/core": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", + "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.3", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.3", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/eslint-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", + "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "dev": true, + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.12.13.tgz", + "integrity": "sha512-QN7Z5FByIOFESQXxoNYVPU7xONzrDW2fv7oKKVkj+62N3Dx1IZaVu/RF9QhV9XyCZE/xiYNfuQ1JsiL1jduT1A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.0.tgz", + "integrity": "sha512-6pXDPguA5zC40Y8oI5mqr+jEUpjMJonKvknvA+vD8CYDz5uuXEwWBK8sRAsE/t3gfb1k15AQb9RhwpscC4nUJQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@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 + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0" + } + }, + "@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, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@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, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@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==", + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", + "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@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 + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@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, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@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==" + }, + "@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==" + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helpers": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "@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==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/node": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.18.5.tgz", + "integrity": "sha512-zv94ESipS2/YKAOJ+/WAfVEzsl9M8UmPZ7Hwx5qVPgytdrgwUPxfi700iR9KO/w5ZhIHyFyvoZtCTSEcQJF8vQ==", + "dev": true, + "requires": { + "@babel/register": "^7.17.7", + "commander": "^4.0.1", + "core-js": "^3.22.1", + "node-environment-flags": "^1.0.5", + "regenerator-runtime": "^0.13.4", + "v8flags": "^3.1.1" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "core-js": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.2.tgz", + "integrity": "sha512-ELJOWxNrJfOH/WK4VJ3Qd+fOqZuOuDNDJz0xG6Bt4mGg2eO/UT9CljCrbqDGovjLKUrGajEEBcoTOc0w+yBYeQ==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", + "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz", + "integrity": "sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-class-static-block": "^7.12.13" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz", + "integrity": "sha512-ibAMAqUm97yzi+LPgdr5Nqb9CMkeieGHvwPg1ywSGjZrZHQEGqE01HmOio8kxRpA/+VtOHouIVy2FMpBbtltjA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.11", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-decorators": "^7.12.13" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-create-class-features-plugin": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", + "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", + "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz", + "integrity": "sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + }, + "dependencies": { + "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 + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", + "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz", + "integrity": "sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", + "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", + "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", + "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-react-inline-elements": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.12.13.tgz", + "integrity": "sha512-FkqNco564LsuwJFEtTzDihxNGqNAstTfP9hORNYaNtYqdlOEIF5jsD4K5R3BfmVaIsGRPBGvsgmCwm0KCkkSFw==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", + "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.12.17" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz", + "integrity": "sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/preset-env": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.0.tgz", + "integrity": "sha512-GWRCdBv2whxqqaSi7bo/BEXf070G/fWFMEdCnmoRg2CZJy4GK06ovFuEjJrZhDRXYgBsYtxVbG8GUHvw+UWBkQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.15", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-class-static-block": "^7.13.11", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-private-property-in-object": "^7.14.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.0", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.13.16", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.17", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.14.0", + "@babel/plugin-transform-modules-commonjs": "^7.14.0", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.14.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", + "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-react-display-name": "^7.12.13", + "@babel/plugin-transform-react-jsx": "^7.13.12", + "@babel/plugin-transform-react-jsx-development": "^7.12.17", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + } + }, + "@babel/register": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.17.7.tgz", + "integrity": "sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "@babel/runtime": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "requires": { + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + } + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + } + } + }, + "@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 + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true + }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "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==", + "requires": { + "@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" + } + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } + } + }, + "@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "requires": { + "@emotion/memoize": "^0.8.1" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + } + } + }, + "@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + } + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + } + } + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + } + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, + "@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "requires": { + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "requires": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "requires": { + "@floating-ui/dom": "^1.5.1" + } + }, + "@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "@hookform/resolvers": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.2.tgz", + "integrity": "sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==", + "requires": {} + }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "@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, + "requires": { + "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" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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 + } + } + }, + "@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 + }, + "@jest/console": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.2.1.tgz", + "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "@jest/core": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.2.2.tgz", + "integrity": "sha512-susVl8o2KYLcZhhkvSB+b7xX575CX3TmSvxfeDjpRko7KmT89rHkXj6XkDkNpSeFMBzIENw5qIchO9HC9Sem+A==", + "dev": true, + "requires": { + "@jest/console": "^29.2.1", + "@jest/reporters": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@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.2.0", + "jest-config": "^29.2.2", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-resolve-dependencies": "^29.2.2", + "jest-runner": "^29.2.2", + "jest-runtime": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "jest-watcher": "^29.2.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "@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, + "requires": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + } + }, + "@jest/expect": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.2.2.tgz", + "integrity": "sha512-zwblIZnrIVt8z/SiEeJ7Q9wKKuB+/GS4yZe9zw7gMqfGf4C5hBLGrVyxu1SzDbVSqyMSlprKl3WL1r80cBNkgg==", + "dev": true, + "requires": { + "expect": "^29.2.2", + "jest-snapshot": "^29.2.2" + } + }, + "@jest/expect-utils": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.2.2.tgz", + "integrity": "sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@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, + "requires": { + "@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" + } + }, + "@jest/globals": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.2.2.tgz", + "integrity": "sha512-/nt+5YMh65kYcfBhj38B3Hm0Trk4IsuMXNDGKE/swp36yydBWfz3OXkLqkSvoAtPW8IJMSJDFCbTM2oj5SNprw==", + "dev": true, + "requires": { + "@jest/environment": "^29.2.2", + "@jest/expect": "^29.2.2", + "@jest/types": "^29.2.1", + "jest-mock": "^29.2.2" + } + }, + "@jest/reporters": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.2.2.tgz", + "integrity": "sha512-AzjL2rl2zJC0njIzcooBvjA4sJjvdoq98sDuuNs4aNugtLPSQ+91nysGKRF0uY1to5k0MdGMdOBggUsPqvBcpA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@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": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "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 + }, + "jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@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, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.2.1.tgz", + "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==", + "dev": true, + "requires": { + "@jest/console": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.2.2.tgz", + "integrity": "sha512-Cuc1znc1pl4v9REgmmLf0jBd3Y65UXJpioGYtMr/JNpQEIGEzkmHhy6W6DLbSsXeUA13TDzymPv0ZGZ9jH3eIw==", + "dev": true, + "requires": { + "@jest/test-result": "^29.2.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "@jest/transform": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.2.2.tgz", + "integrity": "sha512-aPe6rrletyuEIt2axxgdtxljmzH8O/nrov4byy6pDw9S8inIrTV+2PnjyP/oFHMSynzGxJ2s6OHowBNMXp/Jzg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.2.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "dependencies": { + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + } + } + }, + "@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, + "requires": { + "@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" + } + }, + "@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, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@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 + }, + "@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@mongodb-js/saslprep": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "@mui/base": { + "version": "5.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.21.tgz", + "integrity": "sha512-eTKWx3WV/nwmRUK4z4K1MzlMyWCsi3WJ3RtV4DiXZeRh4qd4JCyp1Zzzi8Wv9xM4dEBmqQntFoei716PzwmFfA==", + "requires": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.15.tgz", + "integrity": "sha512-ZCDzBWtCKjAYAlKKM3PA/jG/3uVIDT9ZitOtVixIVmTCQyc5jSV1qhJX8+qIGz4RQZ9KLzPWO2tXd0O5hvzouQ==" + }, + "@mui/icons-material": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.15.tgz", + "integrity": "sha512-Dqu21vN/mVNzebJ+ofnKG+CeJYIhHuDs5+0fMEpdpzRt6UojelzdrEkNv+XkO0e1JMclzeXIRx404FirK/CFRw==", + "requires": { + "@babel/runtime": "^7.23.2" + } + }, + "@mui/material": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.15.tgz", + "integrity": "sha512-Gq65rHjvLzkxmhG8bvag851Oqsmru7qkUb/cCI2xu7dQzmY345f9xJRJi72sRGjhaqHXWeRKw/yIwp/7oQoeXg==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.21", + "@mui/core-downloads-tracker": "^5.14.15", + "@mui/system": "^5.14.15", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "@types/react-transition-group": "^4.4.7", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + } + } + }, + "@mui/private-theming": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.15.tgz", + "integrity": "sha512-V2Xh+Tu6A07NoSpup0P9m29GwvNMYl5DegsGWqlOTJyAV7cuuVjmVPqxgvL8xBng4R85xqIQJRMjtYYktoPNuQ==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.15", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.15.tgz", + "integrity": "sha512-mbOjRf867BysNpexe5Z/P8s3bWzDPNowmKhi7gtNDP/LPEeqAfiDSuC4WPTXmtvse1dCl30Nl755OLUYuoi7Mw==", + "requires": { + "@babel/runtime": "^7.23.2", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.15.tgz", + "integrity": "sha512-zr0Gdk1RgKiEk+tCMB900LaOpEC8NaGvxtkmMdL/CXgkqQZSVZOt2PQsxJWaw7kE4YVkIe4VukFVc43qcq9u3w==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.15", + "@mui/styled-engine": "^5.14.15", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.10.tgz", + "integrity": "sha512-wX1vbDC+lzF7FlhT6A3ffRZgEoKWPF8VqRoTu4lZwouFX2t90KyCMsgepMw5DxLak1BSp/KP86CmtZttikb/gQ==", + "requires": {} + }, + "@mui/utils": { + "version": "5.14.20", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.20.tgz", + "integrity": "sha512-Y6yL5MoFmtQml20DZnaaK1znrCEwG6/vRSzW8PKOTrzhyqKIql0FazZRUR7sA5EPASgiyKZfq0FPwISRXm5NdA==", + "requires": { + "@babel/runtime": "^7.23.4", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@mui/x-date-pickers": { + "version": "6.18.4", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.4.tgz", + "integrity": "sha512-YqJ6lxZHBIt344B3bvRAVbdYSQz4dcmJQXGcfvJTn26VdKjpgzjAqwhlbQhbAt55audJOWzGB99ImuQuljDROA==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "@mui/base": { + "version": "5.0.0-beta.26", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.26.tgz", + "integrity": "sha512-gPMRKC84VRw+tjqYoyBzyrBUqHQucMXdlBpYazHa5rCXrb91fYEQk5SqQ2U5kjxx9QxZxTBvWAmZ6DblIgaGhQ==", + "requires": { + "@babel/runtime": "^7.23.4", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.10", + "@mui/utils": "^5.14.20", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + } + } + }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "requires": { + "eslint-scope": "5.1.1" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "@remix-run/router": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.3.tgz", + "integrity": "sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q==" + }, + "@shelf/jest-mongodb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@shelf/jest-mongodb/-/jest-mongodb-5.1.0.tgz", + "integrity": "sha512-oA4hsDQCaigJtWk72kMlMIqPga6xrBQAsgRsnlftmXGTeLcxa76bxLQCw9R4LjDKChXcOvcfrtKwQzZGZyTy+w==", + "dev": true, + "requires": { + "debug": "4.3.4", + "mongodb-memory-server": "9.2.0" + } + }, + "@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 + }, + "@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@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, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, + "@smithy/abort-controller": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", + "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/config-resolver": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.21.tgz", + "integrity": "sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA==", + "requires": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + } + }, + "@smithy/credential-provider-imds": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", + "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", + "requires": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "tslib": "^2.5.0" + } + }, + "@smithy/eventstream-codec": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", + "requires": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/fetch-http-handler": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", + "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", + "requires": { + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "@smithy/hash-node": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", + "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", + "requires": { + "@smithy/types": "^2.7.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + } + }, + "@smithy/invalid-dependency": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", + "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/middleware-content-length": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", + "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", + "requires": { + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/middleware-endpoint": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", + "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", + "requires": { + "@smithy/middleware-serde": "^2.0.15", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + } + }, + "@smithy/middleware-retry": { + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.24.tgz", + "integrity": "sha512-q2SvHTYu96N7lYrn3VSuX3vRpxXHR/Cig6MJpGWxd0BWodUQUWlKvXpWQZA+lTaFJU7tUvpKhRd4p4MU3PbeJg==", + "requires": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/protocol-http": "^3.0.11", + "@smithy/service-error-classification": "^2.0.8", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-retry": "^2.0.8", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@smithy/middleware-serde": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", + "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/middleware-stack": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", + "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/node-config-provider": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", + "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", + "requires": { + "@smithy/property-provider": "^2.0.16", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/node-http-handler": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", + "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", + "requires": { + "@smithy/abort-controller": "^2.0.15", + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/property-provider": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", + "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/protocol-http": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", + "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/querystring-builder": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", + "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", + "requires": { + "@smithy/types": "^2.7.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/querystring-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", + "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/service-error-classification": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", + "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", + "requires": { + "@smithy/types": "^2.7.0" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", + "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/signature-v4": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", + "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", + "requires": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/smithy-client": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.18.tgz", + "integrity": "sha512-7FqdbaJiVaHJDD9IfDhmzhSDbpjyx+ZsfdYuOpDJF09rl8qlIAIlZNoSaflKrQ3cEXZN2YxGPaNWGhbYimyIRQ==", + "requires": { + "@smithy/middleware-stack": "^2.0.9", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", + "tslib": "^2.5.0" + } + }, + "@smithy/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", + "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/url-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", + "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", + "requires": { + "@smithy/querystring-parser": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "requires": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-body-length-browser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", + "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "requires": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-defaults-mode-browser": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.22.tgz", + "integrity": "sha512-qcF20IHHH96FlktvBRICDXDhLPtpVmtksHmqNGtotb9B0DYWXsC6jWXrkhrrwF7tH26nj+npVTqh9isiFV1gdA==", + "requires": { + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-defaults-mode-node": { + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.29.tgz", + "integrity": "sha512-+uG/15VoUh6JV2fdY9CM++vnSuMQ1VKZ6BdnkUM7R++C/vLjnlg+ToiSR1FqKZbMmKBXmsr8c/TsDWMAYvxbxQ==", + "requires": { + "@smithy/config-resolver": "^2.0.21", + "@smithy/credential-provider-imds": "^2.1.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-endpoints": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", + "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", + "optional": true, + "peer": true, + "requires": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-middleware": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", + "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", + "requires": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-retry": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", + "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", + "requires": { + "@smithy/service-error-classification": "^2.0.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-stream": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", + "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", + "requires": { + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + } + }, + "@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-utf8": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "requires": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-waiter": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", + "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", + "requires": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@testing-library/dom": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", + "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "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 + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + } + } + }, + "@testing-library/jest-dom": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz", + "integrity": "sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw==", + "dev": true, + "requires": { + "@adobe/css-tools": "^4.3.1", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + } + } + }, + "@testing-library/react": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz", + "integrity": "sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + } + }, + "@testing-library/user-event": { + "version": "14.5.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz", + "integrity": "sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==", + "dev": true, + "requires": {} + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/aria-query": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz", + "integrity": "sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", + "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==" + }, + "@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "@types/eslint": { + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", + "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/node": { + "version": "20.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.1.tgz", + "integrity": "sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" + }, + "@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "@types/react": { + "version": "18.2.33", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.33.tgz", + "integrity": "sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/tough-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz", + "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A==", + "dev": true + }, + "@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==" + }, + "@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, + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "dependencies": { + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + } + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "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==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true + }, + "acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "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, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "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 + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, + "array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.reduce": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "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, + "requires": { + "tslib": "^2.4.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "aws-cdk": { + "version": "2.102.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.102.0.tgz", + "integrity": "sha512-q+FQSeX/25QvZ1/Fxjr7GydMY/WR/+iTif2EiaN7rUlEEZx27o0I5k1p9YmTNUGiBl13ZvggIJjwTRmnL7E/lg==", + "dev": true, + "requires": { + "fsevents": "2.3.2" + } + }, + "aws-cdk-lib": { + "version": "2.100.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.100.0.tgz", + "integrity": "sha512-oWDPcbdqD69wDIUvcGdbDxmKcDfkCg515wf8JkiQLnhAI/AFyKAVTEWhbSUi00lvJQNUjX8Mal2lbKlCRA4hjQ==", + "requires": { + "@aws-cdk/asset-awscli-v1": "^2.2.200", + "@aws-cdk/asset-kubectl-v20": "^2.1.2", + "@aws-cdk/asset-node-proxy-agent-v6": "^2.0.1", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.1.1", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.5.4", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "dependencies": { + "@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", + "bundled": true + }, + "ajv": { + "version": "8.12.0", + "bundled": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "bundled": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "bundled": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "bundled": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "bundled": true + }, + "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==", + "bundled": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "bundled": true + }, + "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==", + "bundled": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "bundled": true + }, + "fs-extra": { + "version": "11.1.1", + "bundled": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "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==", + "bundled": true + }, + "ignore": { + "version": "5.2.4", + "bundled": true + }, + "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==", + "bundled": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "bundled": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "punycode": { + "version": "2.3.0", + "bundled": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "bundled": true + }, + "semver": { + "version": "7.5.4", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "bundled": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "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==", + "bundled": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "bundled": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "table": { + "version": "6.8.1", + "bundled": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, + "universalify": { + "version": "2.0.0", + "bundled": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "bundled": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "bundled": true + } + } + }, + "b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true + }, + "babel-jest": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.2.2.tgz", + "integrity": "sha512-kkq2QSDIuvpgfoac3WZ1OOcHsQQDU5xYk2Ql7tLdJ8BVAYbefEXal+NfS45Y5LVZA7cxC8KYcQMObpCt1J025w==", + "dev": true, + "requires": { + "@jest/transform": "^29.2.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "requires": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" + } + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "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, + "requires": { + "@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" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.0", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0" + } + }, + "babel-plugin-react-html-attrs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-react-html-attrs/-/babel-plugin-react-html-attrs-3.0.5.tgz", + "integrity": "sha512-o6RClilXl0T7HfVsHUE+xHV0HMBX0SzB94MMIrT52089CA6Sd4eXkY7jLHknQktFQ5UHpSXYPP0x7fUnIY97Qg==", + "dev": true + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true + } + } + }, + "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, + "requires": { + "@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" + } + }, + "babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "optional": true + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "requires": { + "safe-buffer": "5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "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==", + "requires": { + "ee-first": "1.1.1" + } + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "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, + "requires": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "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, + "requires": { + "node-int64": "^0.4.0" + } + }, + "bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "dev": true + }, + "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 + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "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" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001566", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", + "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + } + } + }, + "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 + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "clean-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", + "dev": true, + "requires": { + "del": "^4.1.1" + } + }, + "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, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "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==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorbrewer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.3.0.tgz", + "integrity": "sha512-AzVPpWa+fuO/qY8LxPQjej6F49Lb2Cl+7U9YhPn6y4/SOY6u/EZiXUc7qHzRb6i6fWPStCUdEaU2731QyQKWjg==" + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==" + }, + "colorspace": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", + "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "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, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concurrently": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", + "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "dependencies": { + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true + }, + "connect-mongo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-5.1.0.tgz", + "integrity": "sha512-xT0vxQLqyqoUTxPLzlP9a/u+vir0zNkhiy9uAdHjSCcUUf7TS5b55Icw8lVyYFxfemP3Mf9gdwUOgeF3cxCAhw==", + "requires": { + "debug": "^4.3.1", + "kruptein": "^3.0.0" + } + }, + "constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==" + }, + "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==", + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "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==" + } + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "core-js-compat": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", + "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", + "dev": true, + "requires": { + "browserslist": "^4.22.2" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "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, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "csv-stringify": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.3.0.tgz", + "integrity": "sha512-kTnnBkkLmAR1G409aUdShppWUClNbBQZXhrKrXzKYBGw4yfROspiFvVmjbKonCrdGfwnqwMXKLQG7ej7K/jwjg==" + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", + "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" + }, + "d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.10.tgz", + "integrity": "sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", + "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==" + }, + "d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.2.tgz", + "integrity": "sha512-p1vcHAUF1qH7yR+e8ip7Bs61AHjLeKkIn8Z2gzwU2lwEf2wkSpWdjXG0axudTHsVFnYGlMkFaEsVy2l8tAg1Gw==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + }, + "d3-geo": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.1.tgz", + "integrity": "sha512-GsG7x9G9sykseLviOVSJ3h5yjw0ItLopOtuDQKUt1TRklEegCw5WAmnIpYYiCkSH/QgUMleAeE2xZK38Qb+1+Q==", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + }, + "d3-polygon": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", + "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==" + }, + "d3-quadtree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.5.tgz", + "integrity": "sha512-U2tjwDFbZ75JRAg8A+cqMvqPg1G3BE7UTJn3h8DHjY/pnsAfWdbJKgyfcy7zKjqGtLAmI0q8aDSeG1TVIKRaHQ==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.2.tgz", + "integrity": "sha512-OoXdv1nZ7h2aKMVg3kaUFbLLK5jXUFAMLD/Tu5JA96mjf8f2a9ZUESGY+C36t8R1WFeWk/e55hy54Ml2I62CRQ==" + }, + "d3-shape": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.2.tgz", + "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.10.tgz", + "integrity": "sha512-hF+NTLCaJHF/JqHN5hE8HVGAXPStEq6/omumPE/SxyHVrR7/qQxusFDo0t0c/44+sCGHthC7yNGFZIEgju0P8g==" + }, + "d3-time-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", + "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", + "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "devOptional": true, + "requires": { + "@babel/runtime": "^7.21.0" + } + }, + "dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.0.0.tgz", + "integrity": "sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "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==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "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 + }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.2.0.tgz", + "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.610", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", + "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "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==", + "dev": true + }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "requires": { + "env-variable": "0.0.x" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "env-variable": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.4.tgz", + "integrity": "sha512-+jpGxSWG4vr6gVxUHOc4p+ilPnql7NzZxOZBxNldsKGjCF+97df3CbuX7XMaDa5oAVkKQj4rKp38rYdC4VcpDg==" + }, + "envinfo": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.9.0.tgz", + "integrity": "sha512-RODB4txU+xImYDemN5DqaKC0CHk05XSVkOX4pq0hK26Qx+1LChkuOyUDlGEjYb3ACr0n9qBhFjg37hQuJvpkRQ==", + "dev": true + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "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==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + } + }, + "es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "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==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "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, + "optional": true + } + } + }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, - "inherits": { - "version": "2.0.3", - "bundled": true + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "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, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, + "eslint-config-universe": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-universe/-/eslint-config-universe-12.0.0.tgz", + "integrity": "sha512-78UxGByheyDNL1RhszWYeDzWiBaUtLnFSeI20pJI89IXa9OAEZQHzG/iBFpMeaCs7Hqyg0wYJcuCbCx535wB7A==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "dependencies": { + "eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "requires": {} + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "eslint-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin/-/eslint-plugin-1.0.1.tgz", + "integrity": "sha512-ervp8C09On0fLA258TvE08AqAr/bhRYgHVZd3BrJjD4JfOA2JGANDLGs06j51oWqfPd7Feoo3OoqHD+fuI2sFQ==", + "dev": true, + "requires": { + "requireindex": "~1.1.0" + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^5.10.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "eslint-plugin-no-only-tests": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", + "dev": true + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + } + }, + "eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "requires": {} + }, + "eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "requires": {} + }, + "eslint-plugin-sort-keys-fix": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-sort-keys-fix/-/eslint-plugin-sort-keys-fix-1.1.2.tgz", + "integrity": "sha512-DNPHFGCA0/hZIsfODbeLZqaGY/+q3vgtshF85r+YWDNCQ2apd9PNs/zL6ttKm0nD1IFwvxyg3YOTI7FHl4unrw==", + "dev": true, + "requires": { + "espree": "^6.1.2", + "esutils": "^2.0.2", + "natural-compare": "^1.4.0", + "requireindex": "~1.2.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, "requires": { - "number-is-nan": "1.0.1" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, + "requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true + } + } + }, + "eslint-plugin-testing-library": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.2.0.tgz", + "integrity": "sha512-+LCYJU81WF2yQ+Xu4A135CgK8IszcFcyMF4sWkbiu6Oj+Nel0TrkZq/HvDw0/1WuO3dhDQsZA/OpEMGd0NfcUw==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^5.58.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, "requires": { - "brace-expansion": "1.1.11" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, - "minimist": { - "version": "0.0.8", - "bundled": true + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true }, - "minipass": { - "version": "2.2.4", - "bundled": true, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" } }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "optional": true, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, "requires": { - "minipass": "2.2.4" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" } }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, "requires": { - "minimist": "0.0.8" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" } }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, - "needle": { - "version": "2.2.0", - "bundled": true, - "optional": true, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" } }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "optional": true, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "lru-cache": "^6.0.0" } }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + } + } + }, + "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 + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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 + }, + "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 + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.2.2.tgz", + "integrity": "sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.2.2", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1" + } + }, + "express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "requires": { + "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" + }, + "dependencies": { + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "ms": "2.0.0" } }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "optional": true + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "optional": true, + "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==", "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ee-first": "1.1.1" } }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, + "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==" + } + } + }, + "express-session": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.0.tgz", + "integrity": "sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ==", + "requires": { + "cookie": "0.6.0", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, + "cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "ms": "2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, - "once": { - "version": "1.4.0", - "bundled": true, + "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==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==" + }, + "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 + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + } + } + }, + "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 + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" + }, + "fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "requires": { + "strnum": "^1.0.5" + } + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "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, + "requires": { + "bser": "2.1.1" + } + }, + "fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-saver": { + "version": "2.0.0-rc.4", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.0-rc.4.tgz", + "integrity": "sha512-6Runcc5CffLF9Rpf/MLc3db9eOi2f7b+DvBXpSpJ/hEy+olM+Bw0kx/bOnnp1X4QgOkFZe8ojrM4iZ0JCWmVMQ==" + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "requires": { - "wrappy": "1.0.2" + "balanced-match": "^1.0.0" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "brace-expansion": "^2.0.1" } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "optional": true, + } + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } + "ms": "2.0.0" } }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, + "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==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "ee-first": "1.1.1" } - }, + } + } + }, + "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, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "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, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { "rimraf": { - "version": "2.6.2", - "bundled": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { - "string-width": "1.0.2" + "glob": "^7.1.3" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "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, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "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 + }, + "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 + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "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 + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", "dev": true }, - "get-stream": { + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "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==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "helmet": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==" }, - "git-node-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", - "integrity": "sha1-SbIV4kLr5Dqkx1Ybu6SZUhdSCA8=" + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } }, - "git-sha1": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", - "integrity": "sha1-WZrBkrcYdYJeE6RF86bgURjC90U=" + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } }, - "gkt": { - "version": "https://tgz.pm2.io/gkt-1.0.0.tgz", - "integrity": "sha512-zr6QQnzLt3Ja0t0XI8gws2kn7zV2p0l/D3kreNvS6hFZhVU5g+uY/30l42jbgt0XGcNBEmBDGJR71J692V92tA==", - "optional": true + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, + "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 + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", + "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "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==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "2.1.1" - } + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" } } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "requires": { - "ini": "1.3.5" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + "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==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "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 + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "harmony-reflect": "^1.4.6" } }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { - "function-bind": "1.1.1" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { - "ansi-regex": "2.1.1" + "once": "^1.3.0", + "wrappy": "1" } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true + }, + "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, "requires": { - "isarray": "2.0.1" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + "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 } } }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + "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==" }, - "has-flag": { + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "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==", + "requires": { + "hasown": "^2.0.0" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "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 }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "has-tostringtag": "^1.0.0" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, + "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 + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-path-inside": "^2.1.0" }, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, "requires": { - "is-buffer": "1.1.6" + "path-is-inside": "^1.0.2" } } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "isobject": "^3.0.1" } }, - "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", - "dev": true, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "helmet": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.14.0.tgz", - "integrity": "sha512-VUOjHxegTX/dIr1KeU4ZrIkP8k0/nKKD6vNBT1LCS2+q5KO1oMFKGMVdMw/pUcxXbn/z8yP9rfyMZSTpxXPPMg==", - "requires": { - "dns-prefetch-control": "0.1.0", - "dont-sniff-mimetype": "1.0.0", - "expect-ct": "0.1.1", - "feature-policy": "0.1.0", - "frameguard": "3.0.0", - "helmet-crossdomain": "0.3.0", - "helmet-csp": "2.7.1", - "hide-powered-by": "1.0.0", - "hpkp": "2.0.0", - "hsts": "2.1.0", - "ienoopen": "1.0.0", - "nocache": "2.0.0", - "referrer-policy": "1.1.0", - "x-xss-protection": "1.1.0" - } - }, - "helmet-crossdomain": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz", - "integrity": "sha512-YiXhj0E35nC4Na5EPE4mTfoXMf9JTGpN4OtB4aLqShKuH9d2HNaJX5MQoglO6STVka0uMsHyG5lCut5Kzsy7Lg==" + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" }, - "helmet-csp": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.7.1.tgz", - "integrity": "sha512-sCHwywg4daQ2mY0YYwXSZRsgcCeerUwxMwNixGA7aMLkVmPTYBl7gJoZDHOZyXkqPrtuDT3s2B1A+RLI7WxSdQ==", + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "requires": { - "camelize": "1.0.0", - "content-security-policy-builder": "2.0.0", - "dasherize": "2.0.0", - "platform": "1.3.5" + "call-bind": "^1.0.7" } }, - "hide-powered-by": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz", - "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=" + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "requires": { - "hash.js": "1.1.5", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "has-tostringtag": "^1.0.0" } }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "has-symbols": "^1.0.2" } }, - "hosted-git-info": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", - "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==", - "dev": true - }, - "hpkp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", - "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" - }, - "hsts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz", - "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "which-typed-array": "^1.1.14" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" }, - "hyphenate-style-name": { + "is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", - "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "requires": { - "safer-buffer": "2.1.2" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "ienoopen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz", - "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, - "immutability-helper": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-2.8.1.tgz", - "integrity": "sha512-8AVB5EUpRBUdXqfe4cFsFECsOIZ9hX/Arl8B8S9/tmwpYv3UWvOsXUPOjkuZIMaVxfSWkxCzkng1rjmEoSWrxQ==", + "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, "requires": { - "invariant": "2.2.4" + "@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" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" } }, - "imports-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", - "integrity": "sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ==", + "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, "requires": { - "loader-utils": "1.1.0", - "source-map": "0.6.1" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "dependencies": { "source-map": { @@ -6877,423 +27673,779 @@ } } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indefinite-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.1.tgz", - "integrity": "sha1-CZFUI8yNb36xy3iCrRNGM8mm7cM=", + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, "requires": { - "symbol-observable": "1.0.4" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "requires": { - "loose-envify": "1.3.1" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + } } }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" - }, - "irregular-plurals": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", - "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", - "dev": true - }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" + "jest": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.2.2.tgz", + "integrity": "sha512-r+0zCN9kUqoON6IjDdjbrsWobXM/09Nd45kIPRD8kloaRh1z5ZCMdVsgLXGxmlL7UpAJsvCYOQNO+NjvG/gqiQ==", + "dev": true, + "requires": { + "@jest/core": "^29.2.2", + "@jest/types": "^29.2.1", + "import-local": "^3.0.2", + "jest-cli": "^29.2.2" + } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, "requires": { - "kind-of": "3.2.2" + "execa": "^5.0.0", + "p-limit": "^3.1.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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, "requires": { - "is-buffer": "1.1.6" + "yocto-queue": "^0.1.0" } } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "jest-circus": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.2.2.tgz", + "integrity": "sha512-upSdWxx+Mh4DV7oueuZndJ1NVdgtTsqM4YgywHEx05UMH5nxxA2Qu9T9T9XVuR021XxqSoaKvSmmpAbjwwwxMw==", + "dev": true, + "requires": { + "@jest/environment": "^29.2.2", + "@jest/expect": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.2.1", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-runtime": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "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, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "1.12.0" + "jest-cli": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.2.2.tgz", + "integrity": "sha512-R45ygnnb2CQOfd8rTPFR+/fls0d+1zXS6JPYTBBrnLPrhr58SSuPTiA5Tplv8/PXpz4zXR/AYNxmwIj6J6nrvg==", + "dev": true, + "requires": { + "@jest/core": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-config": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.2.2.tgz", + "integrity": "sha512-Q0JX54a5g1lP63keRfKR8EuC7n7wwny2HoTRDb8cx78IwQOiaYUVZAdjViY3WcTxpR02rPUpvNVmZ1fkIlZPcw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.2.2", + "@jest/types": "^29.2.1", + "babel-jest": "^29.2.2", + "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.2.2", + "jest-environment-node": "^29.2.2", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-runner": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "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, + "requires": { + "@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" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "jest-diff": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.2.1.tgz", + "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.2.0", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + } }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "detect-newline": "^3.0.0" } }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true + "jest-each": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.2.1.tgz", + "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.2.1", + "pretty-format": "^29.2.1" + } }, - "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "requires": { - "ci-info": "1.1.3" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "jest-environment-node": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.2.2.tgz", + "integrity": "sha512-B7qDxQjkIakQf+YyrqV5dICNs7tlCO55WJ4OMSXsqz1lpI/0PmeuXdx2F7eU8rnPbRkUR/fItSSUh0jvE2y/tw==", + "dev": true, "requires": { - "kind-of": "3.2.2" + "@jest/environment": "^29.2.2", + "@jest/fake-timers": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "jest-mock": "^29.2.2", + "jest-util": "^29.2.1" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true + }, + "jest-haste-map": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.2.1.tgz", + "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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 + }, + "jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "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, "requires": { - "is-buffer": "1.1.6" + "has-flag": "^4.0.0" } } } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true + "jest-leak-detector": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz", + "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "jest-matcher-utils": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz", + "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + } + }, + "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, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "@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" }, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "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, "requires": { - "number-is-nan": "1.0.1" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", "dev": true }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "2.1.1" + "jest-resolve": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.2.2.tgz", + "integrity": "sha512-3gaLpiC3kr14rJR3w7vWh0CBX2QAhfpfiQTwrFPvVrcHe5VUBtIXaR004aWE/X9B2CFrITOQAp5gxLONGrk6GA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } } }, - "is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + "jest-resolve-dependencies": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.2.tgz", + "integrity": "sha512-wWOmgbkbIC2NmFsq8Lb+3EkHuW5oZfctffTGvwsA4JcJ1IRk8b2tg+hz44f0lngvRTeHvp3Kyix9ACgudHH9aQ==", + "dev": true, + "requires": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.2.2" + } + }, + "jest-runner": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.2.2.tgz", + "integrity": "sha512-1CpUxXDrbsfy9Hr9/1zCUUhT813kGGK//58HeIw/t8fa/DmkecEwZSWlb1N/xDKXg3uCFHQp1GCvlSClfImMxg==", + "dev": true, + "requires": { + "@jest/console": "^29.2.1", + "@jest/environment": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.2.2", + "jest-haste-map": "^29.2.1", + "jest-leak-detector": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-resolve": "^29.2.2", + "jest-runtime": "^29.2.2", + "jest-util": "^29.2.1", + "jest-watcher": "^29.2.2", + "jest-worker": "^29.2.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "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 + }, + "jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "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, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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 + }, + "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, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "jest-runtime": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.2.2.tgz", + "integrity": "sha512-TpR1V6zRdLynckKDIQaY41od4o0xWL+KOPUCZvJK2bu5P1UXhjobt5nJ2ICNeIxgyj9NGkO0aWgDqYPVhDNKjA==", + "dev": true, + "requires": { + "@jest/environment": "^29.2.2", + "@jest/fake-timers": "^29.2.2", + "@jest/globals": "^29.2.2", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@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.2.1", + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.2", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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 + } } }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" + "jest-snapshot": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.2.2.tgz", + "integrity": "sha512-GfKJrpZ5SMqhli3NJ+mOspDqtZfJBryGA8RIBxF+G+WbDoC7HCqKaeAss4Z/Sab6bAW11ffasx8/vGsj83jyjA==", + "dev": true, + "requires": { + "@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/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.2.2", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.2.2", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.2.1", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.2.1", + "semver": "^7.3.5" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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==", + "dev": true, "requires": { - "is-buffer": "1.1.6" + "lru-cache": "^6.0.0" } } } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "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, "requires": { - "path-is-inside": "1.0.2" + "@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" + }, + "dependencies": { + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + } } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "jest-validate": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.2.2.tgz", + "integrity": "sha512-eJXATaKaSnOuxNfs8CLHgdABFgUrd0TtWS8QckiJ4L/QVDF4KVbZFBBOwCBZHOS0Rc5fOxqngXeGXE3nGQkpQA==", + "dev": true, "requires": { - "isobject": "3.0.1" + "@jest/types": "^29.2.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.2.1" } }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "jest-watcher": { + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.2.2.tgz", + "integrity": "sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==", "dev": true, "requires": { - "has": "1.0.3" + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.2.1", + "string-length": "^4.0.1" } }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "3.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "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 + }, + "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, "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "has-flag": "^4.0.0" } } } }, - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" - }, - "js-git": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", - "integrity": "sha1-UvplWrYYd9bxB578ZTS1VPMeVEQ=", - "requires": { - "bodec": "0.1.0", - "culvert": "0.1.2", - "git-sha1": "0.1.2", - "pako": "0.2.9" - }, - "dependencies": { - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - } - } - }, - "js-levenshtein": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.3.tgz", - "integrity": "sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ==", - "dev": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "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, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true + "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 + }, + "jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "dev": true, + "requires": {} + } + } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "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==" }, "json-schema-traverse": { "version": "0.4.1", @@ -7301,696 +28453,423 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, - "jsonschema": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", - "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==" - }, - "jss": { - "version": "9.8.7", - "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", - "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", - "requires": { - "is-in-browser": "1.1.3", - "symbol-observable": "1.2.0", - "warning": "3.0.0" - }, - "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "1.3.1" - } - } - } - }, - "jss-camel-case": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", - "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", + "jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, "requires": { - "hyphenate-style-name": "1.0.2" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" } }, - "jss-default-unit": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", - "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==" - }, - "jss-global": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", - "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==" - }, - "jss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", - "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", - "requires": { - "warning": "3.0.0" - }, - "dependencies": { - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "1.3.1" - } - } - } + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true }, - "jss-props-sort": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", - "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==" + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true }, - "jss-vendor-prefixer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", - "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", + "kruptein": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/kruptein/-/kruptein-3.0.6.tgz", + "integrity": "sha512-EQJjTwAJfQkC4NfdQdo3HXM2a9pmBm8oidzH270cYu1MbgXPNPMJuldN7OPX+qdhPO5rw4X3/iKz0BFBfkXGKA==", "requires": { - "css-vendor": "0.3.8" + "asn1.js": "^5.4.1" } }, - "keycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", - "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, "kuler": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.0.tgz", "integrity": "sha512-oyy6pu/yWRjiVfCoJebNUKFL061sNtrs9ejKTbirIwY3oiHmENVCSkHhxDV85Dkm7JYR/czMCBeoM87WilTdSg==", "requires": { - "colornames": "1.1.1" + "colornames": "^1.1.1" } }, - "latest-version": { + "leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "4.0.1" - } - }, - "lazy": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=" + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true }, - "ldap-filter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", - "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "requires": { - "assert-plus": "0.1.5" - }, - "dependencies": { - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" - } + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "ldapauth-fork": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.0.2.tgz", - "integrity": "sha512-YoPHsyfV6L/4SO5EMi/Jk1xUMaY+ANlR4Yp+WIsqGkWOLPKkuzRYB4s/IsdKBeb3sdwVCw+q/YN9eoa1dXmQdA==", - "requires": { - "@types/ldapjs": "1.0.3", - "@types/node": "7.10.0", - "bcryptjs": "2.4.3", - "ldapjs": "1.0.2", - "lru-cache": "4.1.3" - } + "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==" }, - "ldapjs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", - "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "backoff": "2.5.0", - "bunyan": "1.8.12", - "dashdash": "1.14.1", - "dtrace-provider": "0.8.7", - "ldap-filter": "0.2.2", - "once": "1.4.0", - "vasync": "1.6.4", - "verror": "1.10.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" } }, - "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "livereload-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", + "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", "dev": true }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" - }, - "lodash-es": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", - "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.findindex": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", - "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=" - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true }, - "lodash.last": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.last/-/lodash.last-3.0.0.tgz", - "integrity": "sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw=" + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true }, "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "2.4.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "logform": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", "requires": { - "colors": "1.3.2", - "fast-safe-stringify": "2.0.6", - "fecha": "2.3.3", - "ms": "2.1.1", - "triple-beam": "1.3.0" + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.2.0" }, "dependencies": { "ms": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "loglevelnext": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", - "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", - "dev": true, - "requires": { - "es6-symbol": "3.1.1", - "object.assign": "4.1.0" - } - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "1.0.1" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, - "material-ui-chip-input": { - "version": "1.0.0-beta.8", - "resolved": "https://registry.npmjs.org/material-ui-chip-input/-/material-ui-chip-input-1.0.0-beta.8.tgz", - "integrity": "sha512-Yqljgimr+AfLO2WPoErbU/YwYSB5N1IN4yjUQb6qEUyZcM5W+499JN+6lmNYJdr/oG9gUxRKHX7q0J2yH7NtTQ==", + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { - "classnames": "2.2.6", - "prop-types": "15.6.2" + "js-tokens": "^3.0.0 || ^4.0.0" } }, - "mathjs": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-5.2.1.tgz", - "integrity": "sha512-l+imExQ09Jj6Mz/YX8LbCb3Q32kjvYq5HQmUhMonuwhSU3o5XKvcnW6T6OzXkD+xadH2/Qg4zXC1ejI1MYcJeg==", + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, "requires": { - "complex.js": "2.0.11", - "decimal.js": "10.0.1", - "escape-latex": "1.1.1", - "fraction.js": "4.0.10", - "javascript-natural-sort": "0.7.1", - "seed-random": "2.2.0", - "tiny-emitter": "2.0.2", - "typed-function": "1.1.0" + "tslib": "^2.0.3" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "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==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "yallist": "^4.0.0" } }, - "meant": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.1.tgz", - "integrity": "sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg==", + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memoize-one": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.2.tgz", - "integrity": "sha512-ucx2DmXTeZTsS4GPPUZCbULAN7kdPT1G+H49Y34JjbQ5ESc6OGhVxKvb1iKhr9v19ZB9OtnHwNnhUnNR/7Wteg==" - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "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==", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.2.7" + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "memory-pager": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz", - "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==", - "optional": true + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.4.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0", - "yargs-parser": "10.1.0" + "tmpl": "1.0.5" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "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==" + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "merge-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", - "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } + "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 }, - "method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "requires": { - "debug": "3.1.0", - "methods": "1.1.2", - "parseurl": "1.3.2", - "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.33.0" + "mime-db": "1.52.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "minimalistic-assert": { + "min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, - "minimalistic-crypto-utils": { + "minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "is-plain-obj": "1.1.0" - } - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.6.1", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.3" - } + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "mongodb": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", + "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.2.0", + "mongodb-connection-string-url": "^3.0.0" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "@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==", + "requires": { + "@types/webidl-conversions": "*" + } + }, + "bson": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.3.0.tgz", + "integrity": "sha512-balJfqwwTBddxfnidJZagCBPP/f48zj9Sdp3OJswREOgsJzHiQSaOIAtApSgDQFYgHqAvFkp53AFSqjMDZoTFw==" + }, + "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==", + "requires": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "requires": { + "punycode": "^2.3.0" + } + }, + "whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", "requires": { - "is-plain-object": "2.0.4" + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" } } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" - }, - "moment-timezone": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.21.tgz", - "integrity": "sha512-j96bAh4otsgj3lKydm3K7kdtA3iKf2m6MY2iSYCzCm5a1zmHo1g+aK3068dDEeocLZQIS9kU8bsdQHLqEvgW0A==", + "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, "requires": { - "moment": "2.22.2" + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" } }, - "mongodb": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.8.tgz", - "integrity": "sha512-yNKwYxQ6m00NV6+pMoWoheFTHSQVv1KkSrfOhRDYMILGWDYtUtQRqHrFqU75rmPIY8hMozVft8zdC4KYMWaM3Q==", + "mongodb-memory-server": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-9.2.0.tgz", + "integrity": "sha512-w/usKdYtby5EALERxmA0+et+D0brP0InH3a26shNDgGefXA61hgl6U0P3IfwqZlEGRZdkbZig3n57AHZgDiwvg==", + "dev": true, "requires": { - "mongodb-core": "3.1.7", - "safe-buffer": "5.1.2" + "mongodb-memory-server-core": "9.2.0", + "tslib": "^2.6.2" } }, - "mongodb-core": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.7.tgz", - "integrity": "sha512-YffpSrLmgFNmrvkGx+yX00KyBNk64C0BalfEn6vHHkXtcMUGXw8nxrMmhq5eXPLLlYeBpD/CsgNxE2Chf0o4zQ==", + "mongodb-memory-server-core": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-9.2.0.tgz", + "integrity": "sha512-9SWZEy+dGj5Fvm5RY/mtqHZKS64o4heDwReD4SsfR7+uNgtYo+JN41kPCcJeIH3aJf04j25i5Dia2s52KmsMPA==", + "dev": true, "requires": { - "bson": "1.1.0", - "require_optional": "1.0.1", - "safe-buffer": "5.1.2", - "saslprep": "1.0.2" + "async-mutex": "^0.4.0", + "camelcase": "^6.3.0", + "debug": "^4.3.4", + "find-cache-dir": "^3.3.2", + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^7.0.4", + "mongodb": "^5.9.1", + "new-find-package-json": "^2.0.0", + "semver": "^7.6.0", + "tar-stream": "^3.1.7", + "tslib": "^2.6.2", + "yauzl": "^3.1.3" }, "dependencies": { - "bson": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", - "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==" + "agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true + }, + "https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "4" + } + }, + "mongodb": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", + "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "dev": true, + "requires": { + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + } + }, + "semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true } } }, @@ -7999,48 +28878,19 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", "requires": { - "basic-auth": "2.0.0", + "basic-auth": "~2.0.0", "debug": "2.6.9", - "depd": "1.1.2", - "on-finished": "2.3.0", - "on-headers": "1.0.1" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" }, "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "glob": "7.1.3" + "ms": "2.0.0" } } } @@ -8050,241 +28900,159 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "multer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.1.tgz", - "integrity": "sha512-zzOLNRxzszwd+61JFuAo0fxdQfvku12aNJgnla0AQ+hHxFmfc/B7jBVuPr5Rmvu46Jze/iJrFpSOsD7afO8SDw==", - "requires": { - "append-field": "1.0.0", - "busboy": "0.2.14", - "concat-stream": "1.6.2", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "on-finished": "2.3.0", - "type-is": "1.6.16", - "xtend": "4.0.1" - } + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "ncp": "2.0.0", - "rimraf": "2.4.5" - } + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "optional": true + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "ncp": { + "new-find-package-json": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true + "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, + "requires": { + "debug": "^4.3.4" + } }, - "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.23", - "sax": "1.2.4" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "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 }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "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 }, - "nocache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", - "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=" + "nodemailer": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==" }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.3", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.10", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.4", - "vm-browserify": "0.0.4" + "nodemon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", + "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "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==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "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, + "requires": { + "has-flag": "^3.0.0" + } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } + "nopt": "~1.0.10" } } } }, - "node-releases": { - "version": "1.0.0-alpha.11", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.11.tgz", - "integrity": "sha512-CaViu+2FqTNYOYNihXa5uPS/zry92I3vPU4nCB6JB3OeZ2UGtOpF5gRwuN4+m3hbEcL47bOXyun1jX2iC+3uEQ==", - "dev": true, - "requires": { - "semver": "5.5.0" - } - }, "nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "requires": { - "abbrev": "1.1.1" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "abbrev": "1" } }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "normalize-scroll-left": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz", - "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "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, "requires": { - "path-key": "2.0.1" + "path-key": "^3.0.0" } }, - "nssocket": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", - "integrity": "sha1-Wflvb/MhVm8zxw99vu7N/cBxVPo=", + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, "requires": { - "eventemitter2": "0.4.14", - "lazy": "1.0.11" - }, - "dependencies": { - "eventemitter2": { - "version": "0.4.14", - "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" - } + "boolbase": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "object-assign": { @@ -8292,93 +29060,102 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, "requires": { - "isobject": "3.0.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "object-keys": "1.0.12" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.12.0" + "array.prototype.reduce": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, + "object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, "requires": { - "isobject": "3.0.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.12.0", - "function-bind": "1.1.1", - "has": "1.0.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "on-finished": { @@ -8390,16 +29167,17 @@ } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "one-time": { @@ -8408,241 +29186,128 @@ "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "is-wsl": "1.1.0" + "mimic-fn": "^2.1.0" } }, - "ora": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz", - "integrity": "sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==", + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-spinners": "1.3.1", - "log-symbols": "2.2.0", - "strip-ansi": "4.0.0", - "wcwidth": "1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", "dev": true }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "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, "requires": { - "p-limit": "1.3.0" + "p-limit": "^2.2.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" - } - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "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 }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.2.7" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "callsites": "^3.0.0" } }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "1.0.2" - } + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, "requires": { - "better-assert": "1.0.2" + "entities": "^4.4.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + } } }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "passport": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", - "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, "requires": { - "passport-strategy": "1.0.0", - "pause": "0.0.1" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "passport-ldapauth": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.1.0.tgz", - "integrity": "sha512-znZdKW4f1bn4F8MRMzHog8fauSZictsC4GlOTs7ks4pL6HSSFuIZdxr/pnYkRJG+dmdLOqzOBXeFXZJIg4CFQg==", + "passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", "requires": { - "@types/node": "7.10.0", - "@types/passport": "0.4.6", - "ldapauth-fork": "4.0.2", - "passport-strategy": "1.0.0" + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" } }, "passport-local": { @@ -8650,7 +29315,7 @@ "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", "requires": { - "passport-strategy": "1.0.0" + "passport-strategy": "1.x.x" } }, "passport-strategy": { @@ -8658,53 +29323,34 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "requires": { - "process": "0.11.10", - "util": "0.10.4" - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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 }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.7", @@ -8712,777 +29358,512 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "3.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pause": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } + "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 }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, - "pidusage": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.17.tgz", - "integrity": "sha512-N8X5v18rBmlBoArfS83vrnD0gIFyZkXEo7a5pAS2aT0i2OLVymFb2AzVg+v8l/QcXnE1JwZcaXR8daJcoJqtjw==", - "requires": { - "safe-buffer": "5.1.2" - } + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "requires": { - "find-up": "2.1.0" - } - }, - "platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==" - }, - "plur": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plur/-/plur-3.0.1.tgz", - "integrity": "sha512-lJl0ojUynAM1BZn58Pas2WT/TXeC1+bS+UqShl0x9+49AtOn7DixRXVzaC8qrDOIxNDmepKnLuMTH7NQmkX0PA==", - "dev": true, - "requires": { - "irregular-plurals": "2.0.0" - } - }, - "pm2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/pm2/-/pm2-3.2.2.tgz", - "integrity": "sha512-Un3S5hirVHy48Pqrxgrqt6deLWf2E9pVeKwFCG0zbldyq415D3QW69KG+p1Rc2S36nuW2QEHoQyoTNai7rJz5Q==", - "requires": { - "@pm2/agent": "0.5.16", - "@pm2/io": "2.4.5", - "@pm2/js-api": "0.5.28", - "async": "2.6.1", - "blessed": "0.1.81", - "chalk": "2.4.1", - "chokidar": "2.0.4", - "cli-table-redemption": "1.0.1", - "commander": "2.15.1", - "cron": "1.4.1", - "date-fns": "1.29.0", - "debug": "3.2.6", - "eventemitter2": "5.0.1", - "fclone": "1.0.11", - "gkt": "https://tgz.pm2.io/gkt-1.0.0.tgz", - "mkdirp": "0.5.1", - "moment": "2.22.2", - "needle": "2.2.4", - "nssocket": "0.6.0", - "pidusage": "2.0.17", - "pm2-axon": "3.3.0", - "pm2-axon-rpc": "0.5.1", - "pm2-deploy": "0.3.10", - "pm2-multimeter": "0.1.2", - "promptly": "2.2.0", - "semver": "5.5.0", - "shelljs": "0.8.2", - "source-map-support": "0.5.9", - "sprintf-js": "1.1.1", - "v8-compile-cache": "2.0.0", - "vizion": "2.0.2", - "yamljs": "0.3.0" - }, - "dependencies": { - "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==", - "requires": { - "color-convert": "1.9.3" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" - } - }, - "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "3.0.0" - } - } + "pinkie": "^2.0.0" } }, - "pm2-axon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-3.3.0.tgz", - "integrity": "sha512-dAFlFYRuFbFjX7oAk41zT+dx86EuaFX/TgOp5QpUKRKwxb946IM6ydnoH5sSTkdI2pHSVZ+3Am8n/l0ocr7jdQ==", - "requires": { - "amp": "0.3.1", - "amp-message": "0.1.2", - "debug": "3.2.6", - "escape-regexp": "0.0.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true }, - "pm2-axon-rpc": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.5.1.tgz", - "integrity": "sha512-hT8gN3/j05895QLXpwg+Ws8PjO4AVID6Uf9StWpud9HB2homjc1KKCcI0vg9BNOt56FmrqKDT1NQgheIz35+sA==", + "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, "requires": { - "debug": "3.2.6" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } + "find-up": "^4.0.0" } }, - "pm2-deploy": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-0.3.10.tgz", - "integrity": "sha512-WagPKsX+LDCe8wLCL5nzu8RQvVUQ5GlFdJRVYCL0ogFnHfYRym91qNU4PkNSWSq11pdvG8la7DTjdW6FWXc8lw==", - "requires": { - "async": "2.6.1", - "tv4": "1.3.0" - } + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" }, - "pm2-multimeter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", - "integrity": "sha1-Gh5VFT1BoFU0zqI8/oYKuqDrSs4=", + "postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "dev": true, "requires": { - "charm": "0.1.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, - "popper.js": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.4.tgz", - "integrity": "sha1-juwdj/AqWjoVLdQ0FKFce3n9abY=" - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "pretty-bytes": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.1.0.tgz", - "integrity": "sha512-wa5+qGVg9Yt7PB6rYm3kXlKzgzgivYTLRandezh43jjRqgyDyP+9YxfJpJiLs9yKD1WeU8/OvtToWpW7255FtA==", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, "requires": { - "asap": "2.0.6" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + } } }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promptly": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", - "integrity": "sha1-KhP6BjaIoqWYOxYf/wEIoH0m/HQ=", + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, "requires": { - "read": "1.0.7" + "postcss-selector-parser": "^6.0.4" } }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "icss-utils": "^5.0.0" } }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.8.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "fast-diff": "^1.1.2" } }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "lodash": "^4.17.20", + "renderkid": "^3.0.0" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "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, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "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 + }, + "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 + } + } + }, + "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, "requires": { - "duplexify": "3.6.1", - "inherits": "2.0.3", - "pump": "2.0.1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true + "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==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { - "performance-now": "2.1.0" + "side-channel": "^1.0.4" } }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "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==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "react": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz", - "integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "schedule": "0.5.0" + "loose-envify": "^1.1.0" } }, + "react-colorful": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", + "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", + "requires": {} + }, "react-dom": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.5.2.tgz", - "integrity": "sha512-RC8LDw8feuZOHVgzEf7f+cxBr/DnKdqp56VU0lAs1f4UfKc4cU8wU4fTq/mgnvynLQo8OtlPC19NUFh/zjZPuA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "schedule": "0.5.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" } }, - "react-event-listener": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.4.tgz", - "integrity": "sha512-t7VSjIuUFmN+GeyKb+wm025YLeojVB85kJL6sSs0wEBJddfmKBEQz+CNBZ2zBLKVWkPy/fZXM6U5yvojjYBVYQ==", - "requires": { - "@babel/runtime": "7.0.0", - "prop-types": "15.6.2", - "warning": "4.0.2" - } + "react-hook-form": { + "version": "7.45.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz", + "integrity": "sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==", + "requires": {} }, - "react-input-autosize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz", - "integrity": "sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==", - "requires": { - "prop-types": "15.6.2" - } + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "react-redux": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", - "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", - "requires": { - "hoist-non-react-statics": "2.5.5", - "invariant": "2.2.4", - "lodash": "4.17.10", - "lodash-es": "4.17.10", - "loose-envify": "1.3.1", - "prop-types": "15.6.2" - } - }, - "react-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-2.1.0.tgz", - "integrity": "sha512-3SdRAKX64hNzDF/DT1J1Ei3fIoQlLMkMJuB3yOY6oOYwl2A9SFJMsqXLgsveiu7UGrdo+4lyZi3mSqvw8qeGMA==", - "requires": { - "classnames": "2.2.6", - "emotion": "9.2.12", - "memoize-one": "4.0.2", - "prop-types": "15.6.2", - "raf": "3.4.0", - "react-input-autosize": "2.2.1", - "react-transition-group": "2.5.0" - } - }, - "react-transition-group": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.0.tgz", - "integrity": "sha512-qYB3JBF+9Y4sE4/Mg/9O6WFpdoYjeeYqx0AFb64PTazVy8RPMiE3A47CG9QmM4WJ/mzDiZYslV+Uly6O1Erlgw==", + "react-router": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.13.0.tgz", + "integrity": "sha512-Si6KnfEnJw7gUQkNa70dlpI1bul46FuSxX5t5WwlUBxE25DAz2BjVkwaK8Y2s242bQrZPXCpmwLPtIO5pv4tXg==", "requires": { - "dom-helpers": "3.3.1", - "loose-envify": "1.4.0", - "prop-types": "15.6.2", - "react-lifecycles-compat": "3.0.4" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "3.0.2" - } - } + "@remix-run/router": "1.6.3" } }, - "react-virtualized": { - "version": "9.21.0", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.0.tgz", - "integrity": "sha512-duKD2HvO33mqld4EtQKm9H9H0p+xce1c++2D5xn59Ma7P8VT7CprfAe5hwjd1OGkyhqzOZiTMlTal7LxjH5yBQ==", + "react-router-dom": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.13.0.tgz", + "integrity": "sha512-6Nqoqd7fgwxxVGdbiMHTpDHCYPq62d7Wk1Of7B82vH7ZPwwsRaIa22zRZKPPg413R5REVNiyuQPKDG1bubcOFA==", "requires": { - "babel-runtime": "6.26.0", - "classnames": "2.2.6", - "dom-helpers": "3.3.1", - "loose-envify": "1.3.1", - "prop-types": "15.6.2", - "react-lifecycles-compat": "3.0.4" + "@remix-run/router": "1.6.3", + "react-router": "6.13.0" } }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "react-smooth": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz", + "integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==", "requires": { - "mute-stream": "0.0.7" + "fast-equals": "^5.0.0", + "react-transition-group": "2.9.0" } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" } }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" + "picomatch": "^2.2.1" } }, - "readable-stream": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", - "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "recharts": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.4.tgz", + "integrity": "sha512-/Q7/wdf8bW91lN3NEeCjL9RWfaiXQViJFgdnas4Eix/I8B9HAI3tHHK/CW/zDfgRMh4fzW1zlfjoz1IAapLO1Q==", "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.19", + "react-is": "^16.10.2", + "react-smooth": "^2.0.5", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" } }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", "requires": { - "graceful-fs": "4.1.11", - "micromatch": "3.1.10", - "readable-stream": "2.2.7" + "decimal.js-light": "^2.4.1" } }, "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "1.8.1" - } - }, - "recompose": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.29.0.tgz", - "integrity": "sha512-J/qLXNU4W+AeHCDR70ajW8eMd1uroqZaECTj6qqDLPMILz3y0EzpYlvrnxKB9DnqcngWrtGwjXY9JeXaW9kS1A==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, "requires": { - "@babel/runtime": "7.0.0", - "change-emitter": "0.1.6", - "fbjs": "0.8.17", - "hoist-non-react-statics": "2.5.5", - "react-lifecycles-compat": "3.0.4", - "symbol-observable": "1.0.4" + "resolve": "^1.20.0" } }, "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" } }, - "redux": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", - "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==", + "reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, "requires": { - "loose-envify": "1.4.0", - "symbol-observable": "1.2.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "3.0.2" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - } + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" } }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "referrer-policy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", - "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" - }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", - "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { - "regenerate": "1.4.0" + "regenerate": "^1.4.0" } }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "@babel/runtime": "^7.8.4" } }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, - "requires": { - "rc": "1.2.8", - "safe-buffer": "5.1.2" - } + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "requires": { - "rc": "1.2.8" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -9493,139 +29874,145 @@ } } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "requires": { - "is-finite": "1.0.2" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" } }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "2.0.0", - "semver": "5.5.0" - } + "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 + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { - "path-parse": "1.0.5" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "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, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^5.0.0" }, "dependencies": { "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "queue-microtask": "^1.2.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "requires": { - "glob": "6.0.4" - } + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "tslib": "^2.1.0" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "requires": { - "aproba": "1.2.0" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } } }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, "requires": { - "ret": "0.1.15" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" } }, "safer-buffer": { @@ -9633,99 +30020,113 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "saslprep": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", - "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", - "optional": true, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, "requires": { - "sparse-bitfield": "3.0.3" + "xmlchars": "^2.2.0" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "schedule": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", - "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "requires": { - "object-assign": "4.1.1" + "loose-envify": "^1.1.0" } }, "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { - "ajv": "6.5.2", - "ajv-keywords": "3.2.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "seed-random": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", - "integrity": "sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ=" - }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "5.5.0" - } + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "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": "1.6.3", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "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" }, "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "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==", + "requires": { + "ee-first": "1.1.1" + } } } }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, "serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", "requires": { - "etag": "1.8.1", + "etag": "~1.8.1", "fresh": "0.5.2", "ms": "2.1.1", - "parseurl": "1.3.2", + "parseurl": "~1.3.2", "safe-buffer": "5.1.1" }, "dependencies": { @@ -9742,113 +30143,98 @@ } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.2" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" } }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "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==", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } + "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" } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "kind-of": "^6.0.2" } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true }, - "shelljs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", - "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", + "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==", "requires": { - "glob": "7.1.3", - "interpret": "1.1.0", - "rechoir": "0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, - "shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" - }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { - "is-arrayish": "0.3.2" + "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { @@ -9858,498 +30244,366 @@ } } }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "semver": "^7.5.3" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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==", + "dev": true, "requires": { - "is-extendable": "0.1.1" + "lru-cache": "^6.0.0" } } } }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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 + }, + "socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "devOptional": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { - "kind-of": "3.2.2" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", "requires": { - "debug": "3.1.0", - "engine.io": "3.2.0", - "has-binary2": "1.0.3", - "socket.io-adapter": "1.1.1", - "socket.io-client": "2.1.1", - "socket.io-parser": "3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "memory-pager": "^1.0.2" } }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" + "spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "3.1.0", - "engine.io-client": "3.2.1", - "has-binary2": "1.0.3", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "3.2.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, "requires": { - "component-emitter": "1.2.1", - "debug": "3.1.0", - "isarray": "2.0.1" + "escape-string-regexp": "^2.0.0" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + "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 } } }, - "source-list-map": { + "statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dev": true, "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "bare-events": "^2.2.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" } }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "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, "requires": { - "source-map": "0.5.7" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, + "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==", + "dev": true, "requires": { - "memory-pager": "1.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" } }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" } }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, "requires": { - "extend-shallow": "3.0.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - } + "ansi-regex": "^5.0.1" } }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.2.7" - } + "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 }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "min-indent": "^1.0.0" } }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "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 + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "style-loader": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", "dev": true, + "requires": {} + }, + "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==", "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "has-flag": "^4.0.0" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" } } }, - "stream-shift": { + "supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + "synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "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, + "requires": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "terser": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", + "integrity": "sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, "requires": { - "safe-buffer": "5.1.2" + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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, "requires": { - "ansi-regex": "2.1.1" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "stylis": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.3.tgz", - "integrity": "sha512-TxU0aAscJghF9I3V9q601xcK3Uw1JbXvpsBGj/HULqexKOKlOEzzlIpLFRbKkCK990ccuxfXUqmPbIIo7Fq/cQ==" - }, - "stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" - }, - "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", - "dev": true - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "dev": true, "requires": { - "execa": "0.7.0" + "b4a": "^1.6.4" } }, "text-hex": { @@ -10363,114 +30617,66 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.2.7", - "xtend": "4.0.1" - } + "tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "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, "requires": { - "setimmediate": "1.0.5" + "is-number": "^7.0.0" } }, - "tiny-emitter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", - "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" - }, - "titleize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.1.tgz", - "integrity": "sha512-rUwGDruKq1gX+FFHbTl5qjI7teVO7eOe+C8IcQ7QT+1BK3eEUXJqbZcBOeaRP4FwSC/C1A5jDoIVta0nIQ9yew==", - "dev": true - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { + "toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, - "touch": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/touch/-/touch-2.0.2.tgz", - "integrity": "sha512-qjNtvsFXTRq7IuMLweVgFxmEuQ6gLbRs2jQxL80TtZ31dEKWYIxRXquij6w6VimyDek5hD3PytljHmEtAs2u0A==", + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, "requires": { - "nopt": "1.0.10" + "punycode": "^2.1.1" } }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, "triple-beam": { @@ -10478,356 +30684,286 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tv4": { + "ts-api-utils": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=" + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.18" + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, - "typed-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-1.1.0.tgz", - "integrity": "sha512-TuQzwiT4DDg19beHam3E66oRXhyqlyfgjHB/5fcvsRXbfmWPJfto9B4a0TBdTrQAPGlGmXh/k7iUI+WsObgORA==" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "ua-parser-js": { - "version": "0.7.18", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", - "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "dependencies": { - "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 + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } } } }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.7", - "serialize-javascript": "1.5.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.3.0", - "worker-farm": "1.6.0" + "tslib": "^1.8.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "requires": { - "random-bytes": "1.0.0" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "1.0.4", - "unicode-property-aliases-ecmascript": "1.0.4" + "prelude-ls": "^1.2.1" } }, - "unicode-match-property-value-ecmascript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", - "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "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 }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } + "media-typer": "0.3.0", + "mime-types": "~2.1.24" } }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "requires": { - "unique-slug": "2.0.1" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" } }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "boxen": "1.3.0", - "chalk": "2.4.1", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "punycode": "2.1.1" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "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, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } + "escalade": "^3.1.1", + "picocolors": "^1.0.0" } }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { - "prepend-http": "1.0.4" + "punycode": "^2.1.0" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, "requires": { - "inherits": "2.0.3" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, "util-deprecate": { @@ -10835,39 +30971,41 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "object.getownpropertydescriptors": "2.0.3" - } + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true }, - "v8-compile-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", - "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==" + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "homedir-polyfill": "^1.0.1" } }, "vary": { @@ -10875,362 +31013,338 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "vasync": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", - "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", - "requires": { - "verror": "1.6.0" + "victory-vendor": { + "version": "36.8.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.8.2.tgz", + "integrity": "sha512-NfSQi7ISCdBbDpn3b6rg+8RpFZmWIM9mcks48BbogHE2F6h1XKdA34oiCKP5hP1OGvTotDRzsexiJKzrK4Exuw==", + "requires": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" }, "dependencies": { - "verror": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", - "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", + "d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" + }, + "d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "requires": { - "extsprintf": "1.2.0" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" } + }, + "d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "requires": { + "d3-path": "^3.1.0" + } + }, + "d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" } } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.2.0" - } - }, - "vizion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.0.2.tgz", - "integrity": "sha512-UGDB/UdC1iyPkwyQaI9AFMwKcluQyD4FleEXObrlu254MEf16MV8l+AZdpFErY/iVKZVWlQ+OgJlVVJIdeMUYg==", - "requires": { - "async": "2.6.1", - "git-node-fs": "1.0.0", - "ini": "1.3.5", - "js-git": "0.7.8", - "lodash.findindex": "4.6.0", - "lodash.foreach": "4.5.0", - "lodash.get": "4.4.2", - "lodash.last": "3.0.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, "requires": { - "indexof": "0.0.1" + "xml-name-validator": "^4.0.0" } }, - "vxx": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/vxx/-/vxx-1.2.2.tgz", - "integrity": "sha1-dB+1HG8R0zg9pvm5IBil17qAdhE=", - "requires": { - "continuation-local-storage": "3.2.1", - "debug": "2.6.9", - "extend": "3.0.2", - "is": "3.2.1", - "lodash.findindex": "4.6.0", - "lodash.isequal": "4.5.0", - "lodash.merge": "4.6.1", - "methods": "1.1.2", - "semver": "5.5.0", - "shimmer": "1.2.0", - "uuid": "3.3.2" - } - }, - "warning": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", - "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, "requires": { - "loose-envify": "1.3.1" + "makeerror": "1.0.12" } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { - "chokidar": "2.0.4", - "graceful-fs": "4.1.11", - "neo-async": "2.6.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "1.0.3" - } + "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==" }, "webpack": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.22.0.tgz", - "integrity": "sha512-2+3EYFqyhPl12buLQ42QPHEEh8BHn3P9ipRvGRHhdfKJ1u9svhZ3QjhIoEdL5SeIhL5gfOZVbBnartYEabkEsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/wasm-edit": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "acorn": "5.7.3", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.5.2", - "ajv-keywords": "3.2.0", - "chrome-trace-event": "1.0.0", - "enhanced-resolve": "4.1.0", - "eslint-scope": "4.0.0", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.3.1", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.6.0", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.7", - "tapable": "1.1.0", - "uglifyjs-webpack-plugin": "1.3.0", - "watchpack": "1.6.0", - "webpack-sources": "1.3.0" - }, - "dependencies": { - "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", - "dev": true - } - } - }, - "webpack-command": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/webpack-command/-/webpack-command-0.3.1.tgz", - "integrity": "sha512-SZwsqaR29mb1WckonvL0jhPbzImkgr8hohIy/1M0KhhYku9deyu94OcpEe+ihoxRcDhj9m4BWik1ajQbgPditg==", - "dev": true, - "requires": { - "@webpack-contrib/config-loader": "1.1.3", - "@webpack-contrib/schema-utils": "1.0.0-beta.0", - "camelcase": "5.0.0", - "chalk": "2.4.1", - "debug": "3.1.0", - "decamelize": "2.0.0", - "enhanced-resolve": "4.1.0", - "import-local": "1.0.0", - "isobject": "3.0.1", - "loader-utils": "1.1.0", - "log-symbols": "2.2.0", - "loud-rejection": "1.6.0", - "meant": "1.0.1", - "meow": "5.0.0", - "merge-options": "1.0.1", - "object.values": "1.0.4", - "opn": "5.3.0", - "ora": "2.1.0", - "plur": "3.0.1", - "pretty-bytes": "5.1.0", - "strip-ansi": "4.0.0", - "text-table": "0.2.0", - "titleize": "1.0.1", - "update-notifier": "2.5.0", - "v8-compile-cache": "2.0.0", - "webpack-log": "1.2.0", - "wordwrap": "1.0.0" + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } + }, + "webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "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, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } } } }, - "webpack-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", - "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "requires": { - "chalk": "2.4.1", - "log-symbols": "2.2.0", - "loglevelnext": "1.0.5", - "uuid": "3.3.2" + "iconv-lite": "0.6.3" }, "dependencies": { - "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, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "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==", "dev": true, "requires": { - "has-flag": "3.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" } } } }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "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, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "requires": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true } } }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "requires": { - "isexe": "2.0.0" + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" } }, - "widest-line": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "dev": true, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "requires": { - "string-width": "2.1.1" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "winston": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz", "integrity": "sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==", "requires": { - "async": "2.6.1", - "diagnostics": "1.1.1", - "is-stream": "1.1.0", - "logform": "1.10.0", + "async": "^2.6.0", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^1.9.1", "one-time": "0.0.4", - "readable-stream": "2.3.6", - "stack-trace": "0.0.10", - "triple-beam": "1.3.0", - "winston-transport": "4.2.0" + "readable-stream": "^2.3.6", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.2.0" }, "dependencies": { "process-nextick-args": { @@ -11243,13 +31357,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -11257,7 +31371,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -11267,8 +31381,8 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz", "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==", "requires": { - "readable-stream": "2.3.6", - "triple-beam": "1.3.0" + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" }, "dependencies": { "process-nextick-args": { @@ -11281,13 +31395,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -11295,135 +31409,150 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "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, "requires": { - "errno": "0.1.7" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.2", - "ultron": "1.1.1" - } - }, - "x-xss-protection": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.1.0.tgz", - "integrity": "sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg==" - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "requires": {} }, - "xregexp": { + "xml-name-validator": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "requires": { - "argparse": "1.0.10", - "glob": "7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "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" } }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "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 + }, + "yauzl": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "dev": true, "requires": { - "camelcase": "4.1.0" + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "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 + }, + "yup": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.3.3.tgz", + "integrity": "sha512-v8QwZSsHH2K3/G9WSkp6mZKO+hugKT1EmnMqLNUcfu51HU9MDyhlETT/JgtzprnrnQHPWsjc6MUDMBp/l9fNnw==", + "requires": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" } } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } } diff --git a/package.json b/package.json index 8360cae3..95d529bf 100644 --- a/package.json +++ b/package.json @@ -1,97 +1,139 @@ { "name": "po", - "version": "0.0.0", + "version": "2.1.0", "private": true, "scripts": { - "build": "webpack --log-level debug --optimize-minimize --require babel-register", - "start": "NODE_ENV=production ./node_modules/pm2/bin/pm2 start bin/www", - "monitor": "./node_modules/pm2/bin/pm2 monit", - "stop": "./node_modules/pm2/bin/pm2 stop all && ./node_modules/pm2/bin/pm2 delete all", - "logs": "./node_modules/pm2/bin/pm2 logs", - "restart": "NODE_ENV=production ./node_modules/pm2/bin/pm2 stop all && ./node_modules/pm2/bin/pm2 delete all && ./node_modules/pm2/bin/pm2 start bin/www", - "node": "DEBUG=* node ./bin/www" + "build": "NODE_ENV=production webpack", + "build:watch": "webpack --watch", + "transpile": "npx babel ./server --out-dir dist && cp -r ./server/mailer/templates ./dist/mailer/templates", + "dev": "NODE_ENV=development concurrently \"npm run serve:watch\" \"npm run build:watch\"", + "start": "NODE_ENV=production start dist/bin/www.js", + "server": "nodemon --exec babel-node server/bin/www.js", + "serve:watch": "nodemon -r dotenv/config --exec babel-node server/bin/www.js --watch \"./server\" dotenv_config_path=./.env.development", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier . --check", + "format:fix": "prettier . --write", + "node": "DEBUG=* node ./dist/bin/www.js", + "test": "concurrently \"npm run test:ui\" \"npm run test:server\"", + "test:ui": "jest --env=jsdom --config=jestUIConfig.js views/", + "test:server": "jest --config=jestServerConfig.js server/", + "test:cdk": "jest --config=jestCdkConfig.js cdk_lib/", + "bootstrap": "cdk bootstrap", + "deploy": "cdk deploy" + }, + "jest": { + "testPathIgnorePatterns": [ + "/node_modules/" + ] }, "babel": { - "env": { - "production": { - "plugins": [ - "transform-react-constant-elements", - "transform-react-inline-elements", - "transform-react-remove-prop-types" - ] - } - } + "presets": [ + "@babel/preset-env", + "@babel/preset-react" + ], + "plugins": [ + "@babel/plugin-transform-runtime", + "@babel/plugin-transform-react-constant-elements", + "@babel/plugin-transform-react-inline-elements" + ] }, "dependencies": { - "@babel/preset-react": "^7.0.0", - "@babel/preset-stage-0": "^7.0.0", - "@material-ui/core": "^3.3.0", - "@material-ui/icons": "^3.0.1", - "amqplib": "^0.5.2", - "babel-preset-stage-0": "^6.24.1", + "@aws-sdk/client-ses": "^3.437.0", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@hookform/resolvers": "^3.3.2", + "@mui/icons-material": "^5.14.15", + "@mui/material": "^5.14.15", + "@mui/x-date-pickers": "^6.18.4", + "aws-cdk-lib": "2.100.0", "body-parser": "^1.18.3", "classnames": "^2.2.6", - "co": "^4.6.0", "colorbrewer": "^1.3.0", - "connect-mongo": "^2.0.1", + "connect-mongo": "^5.1.0", + "constructs": "^10.0.0", "cookie-parser": "^1.4.3", - "cron": "^1.4.1", - "csvtojson": "^2.0.8", + "csv-stringify": "^6.3.0", "d3": "^5.7.0", - "debug": "~2.6.9", + "dayjs": "^1.11.10", + "debounce": "^2.0.0", + "deep-equal": "^2.2.0", + "ejs": "^3.1.9", "express": "^4.16.4", "express-session": "^1.15.6", "file-saver": "^2.0.0-rc.4", - "fs": "0.0.1-security", - "helmet": "^3.14.0", - "http-errors": "~1.6.2", - "immutability-helper": "^2.8.1", - "jsonschema": "^1.2.4", - "material-ui-chip-input": "^1.0.0-beta.8", - "mathjs": "^5.2.1", - "method-override": "^3.0.0", - "moment": "^2.22.2", - "mongodb": "^3.1.8", + "helmet": "^7.1.0", + "mongodb": "^6.3.0", "morgan": "^1.9.1", - "multer": "^1.4.1", - "passport": "^0.4.0", - "passport-ldapauth": "^2.1.0", + "nodemailer": "^6.10.1", + "passport": "^0.7.0", "passport-local": "^1.0.0", - "path": "^0.12.7", - "pm2": "^3.2.2", - "react": "^16.5.2", - "react-dom": "^16.5.2", - "react-redux": "^5.0.7", - "react-select": "^2.1.0", - "react-virtualized": "^9.21.0", - "redux": "^4.0.1", - "redux-thunk": "^2.3.0", + "qs": "^6.11.0", + "react": "^18.2.0", + "react-colorful": "^5.5.1", + "react-dom": "^18.2.0", + "react-hook-form": "^7.45.2", + "react-router-dom": "^6.13.0", + "recharts": "^2.10.4", "serve-favicon": "^2.5.0", - "socket.io": "^2.1.1", - "uuid": "^3.3.2", - "winston": "^3.1.0" + "source-map-support": "^0.5.21", + "winston": "^3.1.0", + "yup": "^1.3.3" }, "devDependencies": { - "@babel/core": "^7.1.2", - "@babel/plugin-proposal-class-properties": "^7.1.0", - "@babel/plugin-proposal-decorators": "^7.1.2", - "@babel/plugin-transform-runtime": "^7.1.0", - "@babel/preset-env": "^7.1.0", - "babel-core": "^6.26.3", - "babel-loader": "^8.0.4", - "babel-plugin-react-html-attrs": "^2.1.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators-legacy": "^1.3.5", - "babel-plugin-transform-react-constant-elements": "^6.23.0", - "babel-plugin-transform-react-inline-elements": "^6.22.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.19", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-env": "^1.7.0", - "babel-preset-react": "^6.24.1", - "babel-register": "^6.26.0", - "exports-loader": "^0.7.0", - "imports-loader": "^0.8.0", - "webpack": "^4.22.0", - "webpack-command": "^0.3.1" + "@babel/cli": "^7.13.16", + "@babel/core": "^7.14.3", + "@babel/eslint-parser": "^7.24.1", + "@babel/node": "^7.18.5", + "@babel/plugin-proposal-decorators": "^7.13.15", + "@babel/plugin-transform-react-constant-elements": "^7.13.13", + "@babel/plugin-transform-react-inline-elements": "^7.12.13", + "@babel/plugin-transform-runtime": "^7.13.15", + "@babel/preset-env": "^7.14.0", + "@babel/preset-react": "^7.13.13", + "@babel/register": "^7.13.16", + "@shelf/jest-mongodb": "^5.1.0", + "@testing-library/jest-dom": "^6.1.4", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.5.1", + "@types/jest": "^29.5.5", + "@types/node": "20.7.1", + "@types/qs": "^6.9.11", + "aws-cdk": "^2.100.0", + "babel-loader": "^9.1.3", + "babel-plugin-react-html-attrs": "^3.0.5", + "babel-polyfill": "^6.26.0", + "clean-webpack-plugin": "^4.0.0", + "concurrently": "^8.2.0", + "connect-livereload": "^0.6.1", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "dotenv": "^16.3.1", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-config-universe": "^12.0.0", + "eslint-plugin": "^1.0.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-no-only-tests": "^3.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-sort-keys-fix": "^1.1.2", + "eslint-plugin-testing-library": "^6.2.0", + "html-webpack-plugin": "^5.5.3", + "identity-obj-proxy": "^3.0.0", + "jest": "^29.2.2", + "jest-environment-jsdom": "^29.7.0", + "livereload": "^0.9.3", + "nodemon": "^3.0.2", + "prettier": "^3.2.5", + "style-loader": "^3.3.3", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "~5.2.2", + "webpack": "^5.35.1", + "webpack-cli": "^5.1.4", + "webpack-node-externals": "^3.0.0" } } diff --git a/public/css/account.css b/public/css/account.css deleted file mode 100644 index 6d052ce7..00000000 --- a/public/css/account.css +++ /dev/null @@ -1,9 +0,0 @@ -body { - padding: 0px; - margin: 0px; - border: 0px; -} -.configCard button { - padding-top: 0px !important; - padding-left: 0px !important; -} diff --git a/public/css/admin.css b/public/css/admin.css deleted file mode 100644 index 2db287d6..00000000 --- a/public/css/admin.css +++ /dev/null @@ -1,13 +0,0 @@ -html, body { - height: 100%; - padding: 0px; - margin: 0px; -} -#main, #main>div{ - height: 100%; - padding: 0px; - margin: 0px; -} -.Select.is-open { - z-index: 1000 !important; -} diff --git a/public/css/config.css b/public/css/config.css deleted file mode 100644 index ed41caf6..00000000 --- a/public/css/config.css +++ /dev/null @@ -1,14 +0,0 @@ -html,body { - width: 100%; - height: 100%; - padding: 0px; - margin: 0px; - border: 0px; -} -#main{ - height: 100%; -} -.configCard button { - padding-top: 0px !important; - padding-left: 0px !important; -} diff --git a/public/css/fonts/.DS_Store b/public/css/fonts/.DS_Store deleted file mode 100755 index 5008ddfc..00000000 Binary files a/public/css/fonts/.DS_Store and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYQML_FYzokA9q.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYQML_FYzokA9q.woff2 deleted file mode 100644 index 90f5194e..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYQML_FYzokA9q.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYQcL_FYzokA9q.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYQcL_FYzokA9q.woff2 deleted file mode 100644 index 953497ce..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYQcL_FYzokA9q.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYT8L_FYzokA.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYT8L_FYzokA.woff2 deleted file mode 100644 index a885d0ed..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_p2HcYT8L_FYzokA.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYQML_FYzokA9q.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYQML_FYzokA9q.woff2 deleted file mode 100644 index a0ef756b..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYQML_FYzokA9q.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYQcL_FYzokA9q.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYQcL_FYzokA9q.woff2 deleted file mode 100644 index cec7767d..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYQcL_FYzokA9q.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYT8L_FYzokA.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYT8L_FYzokA.woff2 deleted file mode 100644 index e20a7734..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_pgHYYT8L_FYzokA.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYQML_FYzokA9q.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYQML_FYzokA9q.woff2 deleted file mode 100644 index bb731c72..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYQML_FYzokA9q.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYQcL_FYzokA9q.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYQcL_FYzokA9q.woff2 deleted file mode 100644 index 4e926082..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYQcL_FYzokA9q.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYT8L_FYzokA.woff2 b/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYT8L_FYzokA.woff2 deleted file mode 100644 index 4d372eb8..00000000 Binary files a/public/css/fonts/6xKodSZaM9iE8KbpRA_pkHEYT8L_FYzokA.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKtdSZaM9iE8KbpRA_hJFQNYuDyP7bh.woff2 b/public/css/fonts/6xKtdSZaM9iE8KbpRA_hJFQNYuDyP7bh.woff2 deleted file mode 100644 index a325e674..00000000 Binary files a/public/css/fonts/6xKtdSZaM9iE8KbpRA_hJFQNYuDyP7bh.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKtdSZaM9iE8KbpRA_hJVQNYuDyP7bh.woff2 b/public/css/fonts/6xKtdSZaM9iE8KbpRA_hJVQNYuDyP7bh.woff2 deleted file mode 100644 index 61be9881..00000000 Binary files a/public/css/fonts/6xKtdSZaM9iE8KbpRA_hJVQNYuDyP7bh.woff2 and /dev/null differ diff --git a/public/css/fonts/6xKtdSZaM9iE8KbpRA_hK1QNYuDyPw.woff2 b/public/css/fonts/6xKtdSZaM9iE8KbpRA_hK1QNYuDyPw.woff2 deleted file mode 100644 index 99a3f139..00000000 Binary files a/public/css/fonts/6xKtdSZaM9iE8KbpRA_hK1QNYuDyPw.woff2 and /dev/null differ diff --git a/public/css/fonts/Anders.ttf b/public/css/fonts/Anders.ttf deleted file mode 100644 index e0e966ba..00000000 Binary files a/public/css/fonts/Anders.ttf and /dev/null differ diff --git a/public/css/fonts/Arenq.otf b/public/css/fonts/Arenq.otf deleted file mode 100755 index 088f2c5a..00000000 Binary files a/public/css/fonts/Arenq.otf and /dev/null differ diff --git a/public/css/fonts/MANIFESTO.ttf b/public/css/fonts/MANIFESTO.ttf deleted file mode 100644 index 48bd0c3c..00000000 Binary files a/public/css/fonts/MANIFESTO.ttf and /dev/null differ diff --git a/public/css/fonts/MaterialIcons-Regular.eot b/public/css/fonts/MaterialIcons-Regular.eot deleted file mode 100644 index 133c015d..00000000 --- a/public/css/fonts/MaterialIcons-Regular.eot +++ /dev/null @@ -1,784 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - material-design-icons/MaterialIcons-Regular.eot at master · google/material-design-icons · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to content - - - - - - - - - - - -
- -
-
- - -
-
-
- - - -
-
- - - -Permalink - - - - - - -
- - - ac75e83 - - Feb 8, 2016 - - - -
- - @shyndman - @jestelle - - -
- - -
- - -
-
-
- - - - -
- -
- -
- 140 KB -
-
- - - -
-
- View Raw -
-
- -
- - - - -
- -
- - -
-
- -
- - - - - - - -
- - - You can't perform that action at this time. -
- - - - - - - - - -
- - You signed in with another tab or window. Reload to refresh your session. - You signed out in another tab or window. Reload to refresh your session. -
- - - - - diff --git a/public/css/fonts/MaterialIcons-Regular.ttf b/public/css/fonts/MaterialIcons-Regular.ttf deleted file mode 100644 index 057fe97e..00000000 --- a/public/css/fonts/MaterialIcons-Regular.ttf +++ /dev/null @@ -1,784 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - material-design-icons/MaterialIcons-Regular.ttf at master · google/material-design-icons · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to content - - - - - - - - - - - -
- -
-
- - -
-
-
- - - -
-
- - - -Permalink - - - - - - -
- - - ac75e83 - - Feb 8, 2016 - - - -
- - @shyndman - @jestelle - - -
- - -
- - -
-
-
- - - - -
- -
- -
- 125 KB -
-
- - - -
-
- View Raw -
-
- -
- - - - -
- -
- - -
-
- -
- - - - - - - -
- - - You can't perform that action at this time. -
- - - - - - - - - -
- - You signed in with another tab or window. Reload to refresh your session. - You signed out in another tab or window. Reload to refresh your session. -
- - - - - diff --git a/public/css/fonts/MaterialIcons-Regular.woff b/public/css/fonts/MaterialIcons-Regular.woff deleted file mode 100644 index 4f0bf9c0..00000000 --- a/public/css/fonts/MaterialIcons-Regular.woff +++ /dev/null @@ -1,786 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - material-design-icons/MaterialIcons-Regular.woff at master · google/material-design-icons · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to content - - - - - - - - - - - -
- -
-
- - -
-
-
- - - -
-
- - - -Permalink - - - - - - -
- - - 32c0c74 - - Mar 17, 2016 - - - -
- - @shyndman - @jestelle - - -
- - -
- - -
-
-
- - - - -
- -
- -
- 56.3 KB -
-
- - - -
-
- View Raw -
-
- -
- - - - -
- -
- - -
-
- -
- - - - - - - -
- - - You can't perform that action at this time. -
- - - - - - - - - -
- - You signed in with another tab or window. Reload to refresh your session. - You signed out in another tab or window. Reload to refresh your session. -
- - - - - diff --git a/public/css/fonts/MaterialIcons-Regular.woff2 b/public/css/fonts/MaterialIcons-Regular.woff2 deleted file mode 100644 index 0c8da6fb..00000000 Binary files a/public/css/fonts/MaterialIcons-Regular.woff2 and /dev/null differ diff --git a/public/css/fonts/Metria.ttf b/public/css/fonts/Metria.ttf deleted file mode 100644 index 579a8d6b..00000000 Binary files a/public/css/fonts/Metria.ttf and /dev/null differ diff --git a/public/css/fonts/QG.ttf b/public/css/fonts/QG.ttf deleted file mode 100644 index ac8b30ba..00000000 Binary files a/public/css/fonts/QG.ttf and /dev/null differ diff --git a/public/css/fonts/Roboto-Black-webfont.woff b/public/css/fonts/Roboto-Black-webfont.woff deleted file mode 100755 index 02290865..00000000 Binary files a/public/css/fonts/Roboto-Black-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-BlackItalic-webfont.woff b/public/css/fonts/Roboto-BlackItalic-webfont.woff deleted file mode 100755 index 1875c0b9..00000000 Binary files a/public/css/fonts/Roboto-BlackItalic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-Bold-webfont.woff b/public/css/fonts/Roboto-Bold-webfont.woff deleted file mode 100755 index 0c699487..00000000 Binary files a/public/css/fonts/Roboto-Bold-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-BoldItalic-webfont.woff b/public/css/fonts/Roboto-BoldItalic-webfont.woff deleted file mode 100755 index 99de61af..00000000 Binary files a/public/css/fonts/Roboto-BoldItalic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-Italic-webfont.woff b/public/css/fonts/Roboto-Italic-webfont.woff deleted file mode 100755 index dd742443..00000000 Binary files a/public/css/fonts/Roboto-Italic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-Light-webfont.woff b/public/css/fonts/Roboto-Light-webfont.woff deleted file mode 100755 index cc534a38..00000000 Binary files a/public/css/fonts/Roboto-Light-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-LightItalic-webfont.woff b/public/css/fonts/Roboto-LightItalic-webfont.woff deleted file mode 100755 index 3071ff4f..00000000 Binary files a/public/css/fonts/Roboto-LightItalic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-Medium-webfont.woff b/public/css/fonts/Roboto-Medium-webfont.woff deleted file mode 100755 index cd810ef9..00000000 Binary files a/public/css/fonts/Roboto-Medium-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-MediumItalic-webfont.woff b/public/css/fonts/Roboto-MediumItalic-webfont.woff deleted file mode 100755 index 69a14580..00000000 Binary files a/public/css/fonts/Roboto-MediumItalic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-Regular-webfont.woff b/public/css/fonts/Roboto-Regular-webfont.woff deleted file mode 100755 index bfa05d53..00000000 Binary files a/public/css/fonts/Roboto-Regular-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-Thin-webfont.woff b/public/css/fonts/Roboto-Thin-webfont.woff deleted file mode 100755 index f10b831e..00000000 Binary files a/public/css/fonts/Roboto-Thin-webfont.woff and /dev/null differ diff --git a/public/css/fonts/Roboto-ThinItalic-webfont.woff b/public/css/fonts/Roboto-ThinItalic-webfont.woff deleted file mode 100755 index 9ef17a86..00000000 Binary files a/public/css/fonts/Roboto-ThinItalic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/RobotoCondensed-Bold-webfont.woff b/public/css/fonts/RobotoCondensed-Bold-webfont.woff deleted file mode 100755 index 235c963d..00000000 Binary files a/public/css/fonts/RobotoCondensed-Bold-webfont.woff and /dev/null differ diff --git a/public/css/fonts/RobotoCondensed-BoldItalic-webfont.woff b/public/css/fonts/RobotoCondensed-BoldItalic-webfont.woff deleted file mode 100755 index df69b952..00000000 Binary files a/public/css/fonts/RobotoCondensed-BoldItalic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/RobotoCondensed-Italic-webfont.woff b/public/css/fonts/RobotoCondensed-Italic-webfont.woff deleted file mode 100755 index 67804e1e..00000000 Binary files a/public/css/fonts/RobotoCondensed-Italic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/RobotoCondensed-Light-webfont.woff b/public/css/fonts/RobotoCondensed-Light-webfont.woff deleted file mode 100755 index c414478c..00000000 Binary files a/public/css/fonts/RobotoCondensed-Light-webfont.woff and /dev/null differ diff --git a/public/css/fonts/RobotoCondensed-LightItalic-webfont.woff b/public/css/fonts/RobotoCondensed-LightItalic-webfont.woff deleted file mode 100755 index 5536e16c..00000000 Binary files a/public/css/fonts/RobotoCondensed-LightItalic-webfont.woff and /dev/null differ diff --git a/public/css/fonts/RobotoCondensed-Regular-webfont.woff b/public/css/fonts/RobotoCondensed-Regular-webfont.woff deleted file mode 100755 index ec28f95c..00000000 Binary files a/public/css/fonts/RobotoCondensed-Regular-webfont.woff and /dev/null differ diff --git a/public/css/fonts/modernesans.ttf b/public/css/fonts/modernesans.ttf deleted file mode 100644 index f1d29c05..00000000 Binary files a/public/css/fonts/modernesans.ttf and /dev/null differ diff --git a/public/css/fonts/nordic_alternative.ttf b/public/css/fonts/nordic_alternative.ttf deleted file mode 100644 index 097e3c2f..00000000 Binary files a/public/css/fonts/nordic_alternative.ttf and /dev/null differ diff --git a/public/css/fonts/phantom_regular.otf b/public/css/fonts/phantom_regular.otf deleted file mode 100644 index 22e5a999..00000000 Binary files a/public/css/fonts/phantom_regular.otf and /dev/null differ diff --git a/public/css/fonts/phantom_regular_italic.otf b/public/css/fonts/phantom_regular_italic.otf deleted file mode 100644 index 7f7dd156..00000000 Binary files a/public/css/fonts/phantom_regular_italic.otf and /dev/null differ diff --git a/public/css/graph.css b/public/css/graph.css deleted file mode 100755 index 4004448b..00000000 --- a/public/css/graph.css +++ /dev/null @@ -1,96 +0,0 @@ -/* d3 css start **/ -svg *::selection { - background: transparent; -} - -svg *::-moz-selection { - background: transparent; -} - -svg *::-webkit-selection { - background: transparent; -} -rect.selection { - stroke: #333; - stroke-dasharray: 4px; - stroke-opacity: 0.5; - fill: transparent; -} - -rect.cell-selected { - stroke: rgb(51,102,153); - stroke-width: 0.5px; -} - -rect.cell-hover { - opacity: 0.5; - stroke: #C0C0C0; - stroke-width:0.3px; -} - -text.text-selected { - fill: #000; -} - -text.text-highlight { - fill: #ff0000; -} -text.text-hover { - fill: #ff0000; -} -.xAxisLinearTop > path { - display: none; -} -.xAxisLinearBottom > path { - display: none; -} -.yAxisLinear > path { - display: none; -} -.tick > line { - display: none; -} -text.EmptyDates { - fill: #ffffff !important; -} -text.DatesText{ - fill: #000000; -} -/** d3 css end */ -.Matrix { - overflow:hidden; -} -.graph { - overflow:hidden; -} -.floatingButton { - right: 20px; - bottom: 10px; - z-index: 999; - position: fixed; -} -.floatingButton > a { - float: right; - bottom: 5px; - margin-bottom: 10px; -} -.floatingButton .mdl-button { - background: rgba(231, 231, 231, 0.8); -} -.resyncSpinner { - top: 3px; -} -.hide { - display: none; -} -.invisibleText { - opacity: 0; -} -html, body { - height: 98vh; - margin: 0; -} -#graph { - height: 98vh; - overflow: hidden; -} diff --git a/public/css/login.css b/public/css/login.css deleted file mode 100644 index 65c69a24..00000000 --- a/public/css/login.css +++ /dev/null @@ -1,24 +0,0 @@ -body { - height: 98vh; -} -#main { - width: inherit; - height: inherit; - - display: flex; - display: -webkit-flex; - display: -moz-flex; - display: -o-flex; - - justify-content: center; - -webkit-justify-content: center; - -moz-justify-content: center; - -o-justify-content: center; - - align-items: center; - -webkit-align-items: center; - -moz-align-items: center; - -o-align-items: center; - -} - diff --git a/public/css/main.css b/public/css/main.css deleted file mode 100644 index b426655d..00000000 --- a/public/css/main.css +++ /dev/null @@ -1,7 +0,0 @@ -html, body { - height: 98vh; - margin: 0; -} -#main { - height: 98vh; -} diff --git a/public/css/react-virtualized.css b/public/css/react-virtualized.css deleted file mode 100644 index df1c3bce..00000000 --- a/public/css/react-virtualized.css +++ /dev/null @@ -1,151 +0,0 @@ -html, body { - width: 100%; - height: 100%; - overflow: hidden; - font-family: 'Roboto'; -} -/* Collection default theme */ - -.ReactVirtualized__Collection { -} - -.ReactVirtualized__Collection__innerScrollContainer { -} - -/* Grid default theme */ - -.ReactVirtualized__Grid { -} - -.ReactVirtualized__Grid__innerScrollContainer { -} - -/* Table default theme */ - -.ReactVirtualized__Table { -} - -.ReactVirtualized__Table__Grid { -} - -.ReactVirtualized__Table__headerRow { - font-weight: 700; - text-transform: uppercase; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -moz-box-orient: horizontal; - -moz-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -moz-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ReactVirtualized__Table__row { - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -moz-box-orient: horizontal; - -moz-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -moz-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -.ReactVirtualized__Table__headerTruncatedText { - display: inline-block; - max-width: 100%; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} - -.ReactVirtualized__Table__headerColumn, -.ReactVirtualized__Table__rowColumn { - margin-right: 10px; - min-width: 0px; -} -.ReactVirtualized__Table__rowColumn { - text-overflow: ellipsis; - white-space: nowrap; -} - -.ReactVirtualized__Table__headerColumn:first-of-type, -.ReactVirtualized__Table__rowColumn:first-of-type { - margin-left: 10px; -} -.ReactVirtualized__Table__sortableHeaderColumn { - cursor: pointer; -} - -.ReactVirtualized__Table__sortableHeaderIconContainer { - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -moz-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ReactVirtualized__Table__sortableHeaderIcon { - -webkit-flex: 0 0 24px; - -moz-box-flex: 0; - -ms-flex: 0 0 24px; - flex: 0 0 24px; - height: 1em; - width: 1em; - fill: currentColor; -} - -/* List default theme */ - -.ReactVirtualized__List { -} -.Table { - width: 100%; - margin-top: 15px; -} -.oddRow { - background-color: #fafafa; -} -.headerRow { - border-bottom: 1px solid #e0e0e0; -} -.headerColumn { - text-transform: none; -} -.exampleColumn { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.checkboxLabel { - margin-left: .5rem; -} -.checkboxLabel:first-of-type { - margin-left: 0; -} - -.noRows { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - display: flex; - align-items: center; - justify-content: center; - font-size: 1em; - color: #bdbdbd; -} diff --git a/public/css/register.css b/public/css/register.css deleted file mode 100644 index 65c69a24..00000000 --- a/public/css/register.css +++ /dev/null @@ -1,24 +0,0 @@ -body { - height: 98vh; -} -#main { - width: inherit; - height: inherit; - - display: flex; - display: -webkit-flex; - display: -moz-flex; - display: -o-flex; - - justify-content: center; - -webkit-justify-content: center; - -moz-justify-content: center; - -o-justify-content: center; - - align-items: center; - -webkit-align-items: center; - -moz-align-items: center; - -o-align-items: center; - -} - diff --git a/public/css/roboto.css b/public/css/roboto.css deleted file mode 100755 index 6506d0c8..00000000 --- a/public/css/roboto.css +++ /dev/null @@ -1,69 +0,0 @@ -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-Regular-webfont.woff') format('woff'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-Italic-webfont.woff') format('woff'); - font-weight: normal; - font-style: italic; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-Bold-webfont.woff') format('woff'); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-BoldItalic-webfont.woff') format('woff'); - font-weight: bold; - font-style: italic; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-Thin-webfont.woff') format('woff'); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-ThinItalic-webfont.woff') format('woff'); - font-weight: 200; - font-style: italic; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-Light-webfont.woff') format('woff'); - font-weight: 100; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-LightItalic-webfont.woff') format('woff'); - font-weight: 100; - font-style: italic; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-Medium-webfont.woff') format('woff'); - font-weight: 300; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('./fonts/Roboto-MediumItalic-webfont.woff') format('woff'); - font-weight: 300; - font-style: italic; -} \ No newline at end of file diff --git a/public/css/study.css b/public/css/study.css deleted file mode 100644 index 2798fe73..00000000 --- a/public/css/study.css +++ /dev/null @@ -1,69 +0,0 @@ -/* d3 css start **/ -svg *::selection { - background: transparent; -} - -svg *::-moz-selection { - background: transparent; -} - -svg *::-webkit-selection { - background: transparent; -} -rect.selection { - stroke: #333; - stroke-dasharray: 4px; - stroke-opacity: 0.5; - fill: transparent; -} - -rect.cell-selected { - stroke: rgb(51,102,153); - stroke-width: 0.5px; -} - -rect.cell-hover { - opacity: 0.5; - stroke: #C0C0C0; - stroke-width:0.3px; -} - -text.text-selected { - fill: #000; -} - -text.text-highlight { - fill: #ff0000; -} -text.text-hover { - fill: #ff0000; -} -.xAxisLinearTop > path { - display: none; -} -.xAxisLinearBottom > path { - display: none; -} -.yAxisLinear > path { - display: none; -} -.tick > line { - display: none; -} -text.EmptyDates { - fill: #ffffff !important; -} -text.DatesText{ - fill: #000000; -} -/** d3 css end */ -html, body { - height: 100%; - padding: 0px; - margin: 0px; -} -#main, #main>div{ - height: 100%; - padding: 0px; - margin: 0px; -} diff --git a/public/css/style.css b/public/css/style.css deleted file mode 100644 index 9453385b..00000000 --- a/public/css/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/public/img/dpdash.png b/public/img/dpdash.png old mode 100755 new mode 100644 diff --git a/public/img/favicon.ico b/public/img/favicon.ico new file mode 100644 index 00000000..252b1547 Binary files /dev/null and b/public/img/favicon.ico differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 00000000..26938978 --- /dev/null +++ b/public/index.html @@ -0,0 +1,14 @@ + + + + + + + DPdash + + + + +
+ + diff --git a/routes/index.js b/routes/index.js deleted file mode 100644 index 371fcdce..00000000 --- a/routes/index.js +++ /dev/null @@ -1,1191 +0,0 @@ -var express = require('express'); -var router = express.Router(); -var MongoDB = require('mongodb'); -var MongoClient = MongoDB.MongoClient; -var ObjectID = MongoDB.ObjectID; -var path = require('path'); -var fs = require('fs'); -var d3 = require('d3'); -var multer = require('multer'); -var colorbrewer = require('colorbrewer'); -var validate = require('jsonschema').validate; -var csv = require('csvtojson'); -var amqp = require('amqplib/callback_api'); -var co = require('co'); -var crypto = require('crypto'); -var uuidV4 = require('uuid/v4'); -var passport = require('passport'); - -var configPath = process.env.DPDASH_CONFIG || '../config'; -var config = require(configPath); -var uploadPath = process.env.DPDASH_UPLOADS || '../uploads'; -var upload = multer({ dest: uploadPath }).single('file'); -var defaultStudyConfigPath = process.env.DPDASH_DASHBOARD_CONFIG_DEFAULT_STUDY || '../defaultStudyConfig'; -var defaultStudyConfig = require(defaultStudyConfigPath); - -var mongoURI = 'mongodb://' + config.database.mongo.username + ':'; -mongoURI = mongoURI + config.database.mongo.password + '@' + config.database.mongo.host; -mongoURI = mongoURI + ':' + config.database.mongo.port + '/' + config.database.mongo.authSource; - -var mongoClient; -var mongoApp; -var mongoData; -MongoClient.connect(mongoURI, config.database.mongo.server, function(err, client) { - if (err) { - console.error(err.message); - console.log('Could not connect to the database.'); - process.exit(); - } - mongoClient = client; - mongoApp = mongoClient.db(config.database.mongo.appDB); - mongoData = mongoClient.db(config.database.mongo.dataDB); -}); - -function checkMongo() { - if (!mongoClient.isConnected()) { - MongoClient.connect(mongoURI, config.database.mongo.server, function(err, client) { - if (err) { - console.error(err.message); - console.log('Could not connect to the database.'); - process.exit(); - } - mongoClient = client; - mongoApp = mongoClient.db(config.database.mongo.appDB); - mongoData = mongoClient.db(config.database.mongo.dataDB); - }); - } -} - -var amqpAddress = 'amqps://' + config.rabbitmq.username + ':' + config.rabbitmq.password + '@' + config.rabbitmq.host + ':' + config.rabbitmq.port; -var rabbimq_conn = null; -amqp.connect(amqpAddress, config.rabbitmq.opts, function(err, conn) { - if(err) console.log(err); - rabbitmq_conn = conn; -}); - -var loginPage = require('../views/Login.template.js'); -var registerPage = require('../views/Register.template.js'); -var resetPage = require('../views/Resetpw.template.js'); -var mainPage = require('../views/Main.template.js'); -var userPage = require('../views/Account.template.js'); -var configPage = require('../views/Config.template.js'); -var editConfig = require('../views/EditConfig.template.js'); -var adminPage = require('../views/Admin.template.js'); -var studyPage = require('../views/Study.template.js'); -var deepdivePage = require('../views/DeepDive.template.js'); -var graphPage = require('../views/Graph.template.js'); - -//User authentication middleware -function ensureAuthenticated(req, res, next) { - if(!req.isAuthenticated()) { - return res.redirect('/logout'); - } - checkMongo(); - mongoApp.collection('users').findOne( - { uid: req.user }, - { _id : 0, access: 1, blocked: 1, role: 1}, - function(err, data) { - if (err) { - console.log(err); - return res.redirect('/logout?e=forbidden'); - } else if (!data || Object.keys(data).length === 0) { - return res.redirect('/logout?e=forbidden'); - } else if (('role' in data) && data['role'] === 'admin') { - return next(); - } else if (('blocked' in data) && data['blocked'] == true) { - return res.redirect('/logout?e=forbidden'); - } else if (!('access' in data) || data.access.length == 0) { - return res.redirect('/logout?e=unauthorized'); - } else { - return next(); - } - }); -} -//Admin privilege checking middleware -function ensureAdmin(req, res, next) { - if(!req.isAuthenticated()) { - return res.redirect('/logout'); - } - checkMongo(); - mongoApp.collection('users').findOne( - { uid: req.user, role: 'admin' }, - { _id: 0, uid: 1} - , function(err, data) { - if (err) { - console.log(err); - return res.redirect('/?e=forbidden'); - } else if (!data || Object.keys(data).length === 0) { - return res.redirect('/?e=forbidden'); - } else { - return next(); - } - }); -} - -//Check if the information requested is for the user -function ensureUser(req, res, next) { - if(!req.isAuthenticated()) { - return res.redirect('/logout?e=forbidden'); - } else if(req.params.uid !== req.user) { - return res.redirect('/?e=forbidden'); - } else { - return next(); - } -} -//Check user privilege for the study -function ensurePermission(req, res, next) { - if(!req.isAuthenticated()) { - return res.redirect('/logout'); - } - checkMongo(); - mongoApp.collection('users').findOne( - { uid: req.user }, - { _id : 0, access: 1, blocked: 1, role: 1}, - function(err, data) { - if (err) { - console.log(err); - return res.redirect('/?e=forbidden'); - } else if (!data || Object.keys(data).length === 0) { - return res.redirect('/?e=forbidden'); - } else if (('role' in data) && data['role'] === 'admin') { - return next(); - } else if (('blocked' in data) && data['blocked'] == true) { - return res.redirect('/logout?e=forbidden'); - } else if (!('access' in data) || data.access.length == 0) { - return res.redirect('/logout?e=unauthorized'); - } else if(data.access.indexOf(req.params.study) < 0) { - return res.redirect('/?e=forbidden'); - } else { - return next(); - } - }); -} -//Home -router.get('/', ensureAuthenticated, function(req, res) { - return res.send(mainPage(req.user, req.session.display_name, req.session.role, req.session.icon)); -}); - -//User Home -router.route('/u') - .get(ensureAuthenticated, function(req, res) { - return res.status(200).send(userPage(req.user, req.session.display_name, req.session.icon, req.session.mail, req.session.role)); - }); - -//User Configuration -router.route('/u/configure') - .get(ensureAuthenticated, function(req, res) { - if(req.query.s && req.query.id) { - return res.status(200).send(editConfig(req.user, req.query.s, req.query.id)); - } else if (req.query.s) { - return res.status(200).send(editConfig(req.user, req.query.s, null)); - } else if (req.query.u) { - if(req.query.u == 'invalid') { - var message = 'Invalid configuration format.'; - } else if (req.query.u == 'error') { - var message = 'Error occurred while uploading the configuration.'; - } else if (req.query.u == 'success') { - var message = 'Configuratoin upload successful!'; - } else { - var message = req.query.u; - } - return res.status(200).send(configPage(req.user, req.session.display_name, req.session.icon, req.session.mail, req.session.role, message)); - } else { - return res.status(200).send(configPage(req.user, req.session.display_name, req.session.icon, req.session.mail, req.session.role, '')); - } - }); - -//Admin Home -router.route('/admin') - .get(ensureAdmin, function(req, res) { - return res.status(200).send(adminPage(req.user, req.session.display_name, req.session.role, req.session.icon)); - }); - -//Login -router.route('/login') - .get(function(req, res, next) { - if(req.query.e) { - if(req.query.e === 'forbidden') { - return res.send(loginPage('Not authorized. Please contact the admin')); - } else if (req.query.e === 'unauthorized') { - var message = 'Please contact the admin to get access to your projects'; - return res.send(loginPage(message)); - } else if (req.query.e === 'NA') { - var message = 'This application uses LDAP authentication. Please contact the admin.'; - return res.send(loginPage(message)); - } else if (req.query.e === 'resetpw') { - var message = 'Your password has been changed. Please log in'; - return res.send(loginPage(message)); - } else { - return res.send(loginPage(req.query.e)); - } - } else { - return res.send(loginPage('')); - } - }) - .post(function(req, res, next) { - passport.authenticate('local-login', {session: true}, function(err, user) { - if(err) { - return res.redirect('/login?e=' + err); - } - if(!user) { - if(config.auth.useLDAP) { - return require('../utils/passport/ldap')(req, res, next); - } else { - return res.redirect('/login'); - } - } - if (user.ldap) { - if(config.auth.useLDAP) { - return require('../utils/passport/ldap')(req, res, next); - } else { - return res.redirect('/login'); - } - } else { - return require('../utils/passport/local-login')(req, res, next, user); - } - })(req, res, next); - }); - -//register -router.route('/signup') - .get(function(req, res, next) { - if(config.auth.useLDAP) { - return res.redirect('/login?e=NA'); - } else if(req.query.e === 'existingUser') { - return res.send(registerPage('The username already exists. Please choose another.')); - } else { - return res.send(registerPage('')); - } - }) - .post(function(req, res, next) { - if(config.auth.useLDAP) { - return res.redirect('/login'); - } else { - return require('../utils/passport/local-signup')(req, res, next); - } - }); - -//Logout page -router.get('/logout', function(req, res){ - req.session.destroy(); - req.logout(); - if(req.query.e) { - return res.redirect('/login?e=' + req.query.e); - } else { - return res.redirect('/login'); - } -}); - -//deepdive page -router.get('/api/v1/studies/:study/subjects/:subject/deepdive/:day', ensurePermission, function(req, res) { - checkMongo(); - mongoData.collection('toc').find( - { - study : req.params.study, - subject: req.params.subject, - assessment : { - $regex: /^Deepdive/ - } - } - ).toArray(function(err, docs) { - if (err) { - console.log(err); - return res.status(502).send([]); - } else if (docs.length == 0) { - return res.status(404).send([]); - } else { - co(function*() { - var dataPiece = []; - for (var doc = 0; doc < docs.length; doc++) { - var data = yield mongoData.collection(docs[doc].collection).find({ - day: parseInt(req.params.day) - }).toArray(); - Array.prototype.push.apply(dataPiece, data); - } - return res.status(201).send(dataPiece); - }); - } - }); -}); - -router.get('/deepdive/:study/:subject/:day', ensurePermission, function(req, res) { - return res.send(deepdivePage(req.params.study, req.params.subject, req.params.day)); -}); - -//Dashboard page -router.get('/dashboard/:study/:subject', ensurePermission, function(req, res) { - checkMongo(); - mongoApp.collection('users').findOne( - { uid: req.user }, - { _id: 0, preferences: 1 } - , function(err, doc) { - if (err) { - console.log(err); - return res.status(502).send({}); - } else if (!doc || Object.keys(doc).length === 0) { - return res.status(404).send({}); - } else { - if('config' in doc['preferences']) { - mongoApp.collection('configs').findOne( - { readers: req.user, _id: new ObjectID(doc['preferences']['config'])} - , function(err, data) { - var keys = data ? Object.keys(data['config']) : []; - if (err) { - console.log(err); - return res.status(502).send({}); - } else if (!data || keys.length === 0) { - mongoApp.collection('configs').findOne( - { readers: req.user} - , function(err, data) { - var keys = data ? Object.keys(data['config']) : []; - if (err) { - console.log(err); - return res.status(502).send({}); - } else if (!data || keys.length === 0) { - return res.status(404).send({}); - } else { - var default_config = data['config'][keys[0]]; - var dashboardState = { - "matrixData" : [], - "yAxisData" : [], - "assessmentNames" : [], - "matrixConfig" : default_config, - "subject" : req.params.subject, - "project" : req.params.study, - "consentDate" : '', - "updated" : '' - }; - co(function*() { - var metadocReference = yield mongoData.collection('metadata').findOne({ - study: req.params.study, - role: 'metadata' - }); - if(metadocReference != null) { - dashboardState.updated = metadocReference.updated; - if('collection' in metadocReference) { - var metadoc = yield mongoData.collection(metadocReference.collection).find({}).toArray(); - if(metadoc != []) { - for (item in metadoc) { - if (metadoc[item]['Subject ID'] === req.params.subject && metadoc[item]['Consent']) { - dashboardState.consentDate = metadoc[item]['Consent']; - } - } - } - } - } - for(var configItem in default_config) { - if(default_config[configItem].variable === '' || default_config[configItem].analysis === '') { - continue; - } - dashboardState.yAxisData.push(default_config[configItem].label); - dashboardState.assessmentNames.push(default_config[configItem].analysis); - var assessment = default_config[configItem].analysis; - var collectionName = req.params.study + req.params.subject + assessment; - var encrypted = crypto.createHash('sha256').update(collectionName).digest('hex'); - var varName = default_config[configItem].variable; - var escapedVarName = encodeURIComponent(varName).replace(/\./g, '%2E'); - var query = '[{ $project: {_id: 0, day: 1, "' + escapedVarName + '" : "$' + varName + '"}}]'; - var data = yield mongoData.collection(encrypted.toString()).aggregate(eval(query)).toArray(); - var queryForStat = '[{ $match : {"' + escapedVarName + '" : { $ne: "" }}},{ $group : { _id: "$null", min: {$min : "$' + escapedVarName + '"}, max: {$max : "$' + escapedVarName + '"}, mean: {$avg : "$' + escapedVarName + '"}}}]'; - var stat = yield mongoData.collection(encrypted.toString()).aggregate(eval(queryForStat)).toArray(); - var dataPiece = {}; - dataPiece.text = default_config[configItem].text; - dataPiece.analysis = default_config[configItem].analysis; - dataPiece.category = default_config[configItem].category; - dataPiece.variable = default_config[configItem].variable; - dataPiece.label = default_config[configItem].label; - dataPiece.range = default_config[configItem].range; - dataPiece.color = default_config[configItem].color; - dataPiece.data = (data.length >= 1 && data[0].hasOwnProperty(default_config[configItem].variable)) ? data : []; - dataPiece.stat = (stat.length >= 1) ? stat : []; - dashboardState.matrixData.push(dataPiece); - } - return res.send(graphPage(req.params.subject, req.params.study, req.user, req.session.display_name, req.session.icon, req.session.mail, req.session.toc, dashboardState, default_config, req.session.celery_tasks, req.session.role)); - }); - } - }); - } else { - var default_config = data['config'][keys[0]]; - var dashboardState = { - "matrixData" : [], - "yAxisData" : [], - "assessmentNames" : [], - "matrixConfig" : default_config, - "subject" : req.params.subject, - "project" : req.params.study, - "consentDate" : '', - "updated" : '' - }; - co(function*() { - var metadocReference = yield mongoData.collection('metadata').findOne({ - study: req.params.study, - role: 'metadata' - }); - if(metadocReference != null) { - dashboardState.updated = metadocReference.updated; - if('collection' in metadocReference) { - var metadoc = yield mongoData.collection(metadocReference.collection).find({}).toArray(); - if(metadoc != []) { - for (item in metadoc) { - if (metadoc[item]['Subject ID'] === req.params.subject && metadoc[item]['Consent']) { - dashboardState.consentDate = metadoc[item]['Consent']; - } - } - } - } - } - for(var configItem in default_config) { - if(default_config[configItem].variable === '' || default_config[configItem].analysis === '') { - continue; - } - dashboardState.yAxisData.push(default_config[configItem].label); - dashboardState.assessmentNames.push(default_config[configItem].analysis); - var assessment = default_config[configItem].analysis; - var collectionName = req.params.study + req.params.subject + assessment; - var encrypted = crypto.createHash('sha256').update(collectionName).digest('hex'); - var varName = default_config[configItem].variable; - var escapedVarName = encodeURIComponent(varName).replace(/\./g, '%2E'); - var query = '[{ $project: {_id: 0, day: 1, "' + escapedVarName + '" : "$' + varName + '"}}]'; - var data = yield mongoData.collection(encrypted.toString()).aggregate(eval(query)).toArray(); - var queryForStat = '[{ $match : {"' + escapedVarName + '" : { $ne: "" }}},{ $group : { _id: "$null", min: {$min : "$' + escapedVarName + '"}, max: {$max : "$' + escapedVarName + '"}, mean: {$avg : "$' + escapedVarName + '"}}}]'; - var stat = yield mongoData.collection(encrypted.toString()).aggregate(eval(queryForStat)).toArray(); - var dataPiece = {}; - dataPiece.text = default_config[configItem].text; - dataPiece.analysis = default_config[configItem].analysis; - dataPiece.category = default_config[configItem].category; - dataPiece.variable = default_config[configItem].variable; - dataPiece.label = default_config[configItem].label; - dataPiece.range = default_config[configItem].range; - dataPiece.color = default_config[configItem].color; - dataPiece.data = (data.length >= 1 && data[0].hasOwnProperty(default_config[configItem].variable)) ? data : []; - dataPiece.stat = (stat.length >= 1) ? stat : []; - dashboardState.matrixData.push(dataPiece); - } - return res.send(graphPage(req.params.subject, req.params.study, req.user, req.session.display_name, req.session.icon, req.session.mail, req.session.toc, dashboardState, default_config, req.session.celery_tasks, req.session.role)); - }); - } - }); - } else { - mongoApp.collection('configs').findOne( - { readers: req.user} - , function(err, data) { - var keys = data ? Object.keys(data['config']) : []; - if (err) { - console.log(err); - return res.status(502).send({}); - } else if (!data || keys.length === 0) { - return res.status(404).send({}); - } else { - var default_config = data['config'][keys[0]]; - var dashboardState = { - "matrixData" : [], - "yAxisData" : [], - "assessmentNames" : [], - "matrixConfig" : default_config, - "subject" : req.params.subject, - "project" : req.params.study, - "consentDate" : '', - "updated" : '' - }; - co(function*() { - var metadocReference = yield mongoData.collection('metadata').findOne({ - study: req.params.study, - role: 'metadata' - }); - if(metadocReference != null) { - dashboardState.updated = metadocReference.updated; - if('collection' in metadocReference) { - var metadoc = yield mongoData.collection(metadocReference.collection).find({}).toArray(); - if(metadoc != []) { - for (item in metadoc) { - if (metadoc[item]['Subject ID'] === req.params.subject && metadoc[item]['Consent']) { - dashboardState.consentDate = metadoc[item]['Consent']; - } - } - } - } - } - for(var configItem in default_config) { - if(default_config[configItem].variable === '' || default_config[configItem].analysis === '') { - continue; - } - dashboardState.yAxisData.push(default_config[configItem].label); - dashboardState.assessmentNames.push(default_config[configItem].analysis); - var assessment = default_config[configItem].analysis; - var collectionName = req.params.study + req.params.subject + assessment; - var encrypted = crypto.createHash('sha256').update(collectionName).digest('hex'); - var varName = default_config[configItem].variable; - var escapedVarName = encodeURIComponent(varName).replace(/\./g, '%2E'); - var query = '[{ $project: {_id: 0, day: 1, "' + escapedVarName + '" : "$' + varName + '"}}]'; - var data = yield mongoData.collection(encrypted.toString()).aggregate(eval(query)).toArray(); - var queryForStat = '[{ $match : {"' + escapedVarName + '" : { $ne: "" }}},{ $group : { _id: "$null", min: {$min : "$' + escapedVarName + '"}, max: {$max : "$' + escapedVarName + '"}, mean: {$avg : "$' + escapedVarName + '"}}}]'; - var stat = yield mongoData.collection(encrypted.toString()).aggregate(eval(queryForStat)).toArray(); - var dataPiece = {}; - dataPiece.text = default_config[configItem].text; - dataPiece.analysis = default_config[configItem].analysis; - dataPiece.category = default_config[configItem].category; - dataPiece.variable = default_config[configItem].variable; - dataPiece.label = default_config[configItem].label; - dataPiece.range = default_config[configItem].range; - dataPiece.color = default_config[configItem].color; - dataPiece.data = (data.length >= 1 && data[0].hasOwnProperty(default_config[configItem].variable)) ? data : []; - dataPiece.stat = (stat.length >= 1) ? stat : []; - dashboardState.matrixData.push(dataPiece); - } - return res.send(graphPage(req.params.subject, req.params.study, req.user, req.session.display_name, req.session.icon, req.session.mail, req.session.toc, dashboardState, default_config, req.session.celery_tasks, req.session.role)); - }); - } - }); - } - } - }); -}); - -router.route('/resetpw') - .get(function(req, res) { - if(config.auth.useLDAP) { - return res.redirect('/login?e=NA'); - } else if (req.query.e) { - if(req.query.e === 'unmatched') { - var message = 'The passwords do not match. Please try again.'; - return res.send(resetPage(message)); - } else if(req.query.e === 'db') { - var message = 'There was an error. Please contact the admin.'; - return res.send(resetPage(message)); - } else if(req.query.e === 'nouser') { - var message = 'The username or reset key did not match. Please try again.'; - return res.send(resetPage(message)); - } else { - return res.send(resetPage(req.query.e)); - } - } else { - return res.send(resetPage('')); - } - }) - .post(function(req, res) { - if(req.body.password !== req.body.confirmpw) { - return res.redirect('/resetpw?e=unmatched'); - } else { - var hashedPW = require('../utils/crypto/hash')(req.body.password, 'aes-256-ctr', 'encrypt', config.app.secret); - - checkMongo(); - mongoApp.collection('users').findOneAndUpdate( - { uid: req.body.username, reset_key : req.body.reset_key }, - { $set: { password : hashedPW, reset_key : '', force_reset_pw: false } }, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.redirect('/resetpw?e=db'); - } else if (!doc || doc['value'] === null){ - return res.redirect('/resetpw?e=nouser'); - } else { - return res.redirect('/login?e=resetpw'); - } - }); - } - }); - -router.route('/resync/:study/:subject') - .post(ensureAuthenticated, function(req, res) { - var rootdir = config.app.rootDir; - var syncdir = rootdir + '/' + req.params.study + '/' + req.params.subject + '/'; - rabbitmq_conn.createChannel(function(err, ch) { - if(err) { - console.log(err); - try { - amqp.connect(amqpAddress, config.rabbitmq.opts, function(err, conn) { - rabbitmq_conn = conn; - }); - } catch(err) { - console.log(err); - process.exit(1); - } - } - ch.assertQueue(config.rabbitmq.consumerQueue, {durable: false}, function(err, q) { - var correlationId = uuidV4(); - publisher(rabbitmq_conn, ch, correlationId, [syncdir, rootdir, '', '', config.database.mongo.username, config.database.mongo.password, config.database.mongo.host, config.database.mongo.port, config.database.mongo.authSource, config.database.mongo.dataDB], q.queue); - return res.status(201).send({correlationId : correlationId}); - }); - }); - }); - -function publisher(conn, ch, correlationId, args, replyTo) { - var message = {}; - message.id = correlationId; - message.task = 'import'; - message.args = args; - message.kwargs = {}; - message.retries = 1; - - ch.sendToQueue(config.rabbitmq.publisherQueue, - new Buffer(JSON.stringify(message)), - { correlationId: correlationId, contentType: 'application/json', replyTo: replyTo }); - - setTimeout(function() { - ch.close(); - }, 500); -} - -router.get('/dashboard/:study', ensurePermission, function(req, res) { - co(function*() { - checkMongo(); - var configs_heatmap = defaultStudyConfig['colormap']; - var metadocReference = yield mongoData.collection('metadata').findOne({ - study: req.params.study, - role: 'metadata' - }); - if (!metadocReference) { - return res.status(500).send("Please contact the administrator."); - } - var metadoc = yield mongoData.collection(metadocReference['collection']).find({}).toArray(); - var dashboardData = []; - for (item in metadoc) { - var dashboardState = { - "matrixData" : [], - "project" : metadoc[item]['Study'], - "subject" : metadoc[item]['Subject ID'], - "consentDate" : metadoc[item]['Consent'] - }; - - for (var configItem in configs_heatmap) { - var assessment = configs_heatmap[configItem].analysis; - var collectionName = metadoc[item]['Study'] + metadoc[item]['Subject ID'] + assessment; - var encrypted = crypto.createHash('sha256').update(collectionName).digest('hex'); - - var varName = configs_heatmap[configItem].variable; - var escapedVarName = encodeURIComponent(varName).replace(/\./g, '%2E'); - var query = '[{ $project: {_id: 0, day: 1, "' + escapedVarName + '" : "$' + varName + '"}}]'; - var data = yield mongoData.collection(encrypted.toString()).aggregate(eval(query)).toArray(); - var queryForStat = '[{ $match : {"' + escapedVarName + '" : { $ne: "" }}},{ $group : { _id: "$null", min: {$min : "$' + escapedVarName + '"}, max: {$max : "$' + escapedVarName + '"}, mean: {$avg : "$' + escapedVarName + '"}}}]'; - var stat = yield mongoData.collection(encrypted.toString()).aggregate(eval(queryForStat)).toArray(); - var dataPiece = {}; - dataPiece.text = configs_heatmap[configItem].text; - dataPiece.analysis = configs_heatmap[configItem].analysis; - dataPiece.category = configs_heatmap[configItem].category; - dataPiece.variable = configs_heatmap[configItem].variable; - dataPiece.label = configs_heatmap[configItem].label; - dataPiece.range = configs_heatmap[configItem].range; - dataPiece.color = configs_heatmap[configItem].color; - dataPiece.data = (data.length >= 1 && data[0].hasOwnProperty(configs_heatmap[configItem].variable)) ? data : []; - dataPiece.stat = []; - dashboardState.matrixData.push(dataPiece); - } - dashboardData.push(dashboardState); - } - return res.send(studyPage(req.params.study, req.user, req.session.display_name, - req.session.icon, req.session.role, req.session.toc, req.session.celery_tasks, dashboardData, defaultStudyConfig)); - }); -}); - -router.route('/api/v1/studies') - .get(function(req, res) { - checkMongo(); - mongoApp.collection('users').findOne( - { uid : req.user }, - { _id : 0, access: 1} - , function(err, data) { - if (err) { - console.log(err); - return res.status(502).send([]); - } else if (!data || Object.keys(data).length == 0) { - return res.status(404).send([]); - } else if (!('access' in data) || data.access.length == 0) { - return res.status(404).send([]); - } else { - return res.status(200).send(data.access.sort()); - } - }); - }); - -router.get('/api/v1/search/studies', ensureAuthenticated, function(req, res) { - checkMongo(); - mongoData.collection('toc').distinct('study' - , function(err, studies) { - if(err) { - console.log(err); - return res.status(502).send([]); - } else if (!studies || studies.length == 0) { - return res.status(404).send([]); - } else { - return res.status(200).send(studies); - } - }); -}); - -router.get('/api/v1/subjects', function(req, res) { - checkMongo(); - mongoData.collection('metadata').aggregate([ - { $match : { study : { $in : JSON.parse(req.query.q) }}}, - { $addFields: { numOfSubjects: { $size: { "$ifNull": [ "$subjects", [] ] }}}}, - { $sort: { study: 1 }} - ]).toArray(function(err, subjects) { - if(err) { - console.log(err); - return res.status(502).send([]); - } else if(!subjects) { - return res.status(502).send([]); - } else { - return res.status(200).send(subjects); - } - }); -}); - -router.get('/api/v1/users', ensureAdmin, function(req, res) { - checkMongo(); - mongoApp.collection('users').find( - {},{_id: 0, configs: 0, member_of: 0, password: 0, last_logoff: 0}).toArray(function(err, users) { - if(err) { - console.log(err); - return res.status(502).send([]); - } else if (users.length == 0) { - return res.status(404).send([]); - } else { - return res.status(200).send(users); - } - }); -}); -router.get('/api/v1/search/users', ensureAuthenticated, function(req, res) { - checkMongo(); - mongoApp.collection('users').find( - {},{ uid: 1}).toArray(function(err, users) { - if(err) { - console.log(err); - return res.status(502).send([]); - } else if (!users || users.length == 0) { - return res.status(404).send([]); - } else { - return res.status(200).send(users.map(function(u){return u.uid; })); - } - }); -}); - -router.route('/api/v1/users/:uid') - .get(ensureUser, function(req, res) { - checkMongo(); - mongoApp.collection('users').findOne( - {uid: req.params.uid}, - { - configs: 0, - member_of: 0, - bad_pwd_count: 0, - lockout_time: 0, - last_logoff: 0, - last_logon: 0, - account_expires: 0, - force_reset_pw: 0, - realms: 0, - role: 0, - preferences: 0 - } - , function(err, user) { - if(err) { - console.log(err); - return res.status(502).send({}); - } else if (!user || Object.keys(user).length === 0) { - return res.status(404).send({}); - } else { - return res.status(200).send(user); - } - }); - }) - .post(ensureUser, function(req, res) { - checkMongo(); - mongoApp.collection('users').findOneAndUpdate( - {uid: req.params.uid}, - { - $set: { - display_name: req.body.user.display_name, - title: req.body.user.title, - department: req.body.user.department, - company: req.body.user.company, - mail: req.body.user.mail, - icon: req.body.user.icon - } - } - , function(err, user) { - if(err) { - console.log(err); - return res.sendStatus(502); - } else if (!user) { - return res.sendStatus(404); - } else { - req.session.display_name = req.body.user.display_name; - req.session.title = req.body.user.title; - req.session.department = req.body.user.department; - req.session.company = req.body.user.company; - req.session.mail = req.body.user.mail; - req.session.icon = req.body.user.icon; - return res.sendStatus(201); - } - }); - }); - -router.route('/api/v1/users/:uid/configs') - .get(ensureUser, function(req, res) { - checkMongo(); - mongoApp.collection('configs').find( - {readers: req.params.uid} - ).toArray(function(err, data) { - if (err) { - console.log(err); - return res.status(502).send([]); - } else if (data.length == 0) { - return res.status(404).send([]); - } else { - return res.status(200).send(data); - } - }); - }) - .post(ensureUser, function(req, res) { - if(req.body.hasOwnProperty('disable')) { - checkMongo(); - mongoApp.collection('configs').findOneAndUpdate( - { _id: new ObjectID(req.body.disable) }, - { $pull: { readers: req.params.uid }}, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else if (req.body.hasOwnProperty('remove')) { - checkMongo(); - mongoApp.collection('configs').deleteOne( - { _id: new ObjectID(req.body.remove) }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else if (req.body.hasOwnProperty('share')) { - checkMongo(); - mongoApp.collection('configs').findOneAndUpdate( - { _id: new ObjectID(req.body.share) }, - { $set: { readers : req.body.shared}}, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else if (req.body.hasOwnProperty('edit')) { - checkMongo(); - mongoApp.collection('configs').findOneAndUpdate( - { _id: new ObjectID(req.body.edit._id) }, - { $set: { - readers : req.body.edit.readers, - config: req.body.edit.config, - name: req.body.edit.name, - type: req.body.edit.type - }}, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else if (req.body.hasOwnProperty('add')) { - checkMongo(); - mongoApp.collection('configs').insertOne(req.body.add - ,function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - if('insertedId' in doc) { - var _id = doc['insertedId']; - var uri = '/u/configure?s=edit&id=' + _id; - return res.status(201).send({uri: uri}); - } else { - return res.status(502).send({message: 'fail'}); - } - } - }); - } else { - return res.status(502).send({message: 'fail'}); - } - - }); - -router.route('/api/v1/users/:uid/resetpw') - .post(ensureAdmin, function(req, res) { - if(req.body.hasOwnProperty('force_reset_pw') && req.body.hasOwnProperty('reset_key')) { - checkMongo(); - mongoApp.collection('users').findOneAndUpdate( - { uid: req.params.uid }, - { $set: { force_reset_pw : req.body.force_reset_pw, reset_key : req.body.reset_key} }, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else { - return res.status(502).send({message: 'fail'}); - } - }); - -router.route('/api/v1/users/:uid/delete') - .post(ensureAdmin, function(req, res) { - checkMongo(); - mongoApp.collection('users').deleteOne( - { uid: req.params.uid }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - }); - -router.route('/api/v1/users/:uid/role') - .get(ensureAdmin, function(req, res) { - checkMongo(); - mongoApp.collection('users').findOne( - { uid: req.params.uid }, - { _id: 0, role : 1} - , function(err, data) { - if (err) { - console.log(err); - return res.status(502).send(null); - } else if (!data || Object.keys(data).length === 0) { - return res.status(404).send(null); - } else { - return res.status(200).send(data['uid']); - } - }); - }) - .post(ensureAdmin, function(req, res) { - if(req.body.hasOwnProperty('role')) { - checkMongo(); - mongoApp.collection('users').findOneAndUpdate( - { uid: req.params.uid }, - { $set: { role : req.body.role} }, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else { - return res.status(502).send({message: 'fail'}); - } - }); - -router.route('/api/v1/users/:uid/blocked') - .get(ensureAdmin, function(req, res) { - checkMongo(); - mongoApp.collection('users').findOne( - { uid: req.params.uid }, - { _id: 0, blocked : 1} - , function(err, data) { - if (err) { - console.log(err); - return res.status(502).send(null); - } else if (!data || Object.keys(data).length === 0) { - return res.status(404).send(null); - } else { - return res.status(200).send(data['blocked']); - } - }); - }) - .post(ensureAdmin, function(req, res) { - if(req.body.hasOwnProperty('blocked')) { - checkMongo(); - mongoApp.collection('users').findOneAndUpdate( - { uid: req.params.uid }, - { $set: { blocked : req.body.blocked} }, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else { - return res.status(502).send({message: 'fail'}); - } - }); - -router.route('/api/v1/users/:uid/studies') - .get(ensureAdmin, function(req, res) { - checkMongo(); - mongoApp.collection('users').findOne( - { uid: req.params.uid }, - { _id : 0, access: 1}, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - }) - .post(ensureAdmin, function(req, res) { - if(req.body.hasOwnProperty('acl')) { - checkMongo(); - mongoApp.collection('users').findOneAndUpdate( - { uid: req.params.uid }, - { $set: { access: req.body.acl} }, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else { - return res.status(502).send({message: 'fail'}); - } - }); - -router.route('/api/v1/users/:uid/configs/:config_id') - .get(ensureUser, function(req, res) { - checkMongo(); - mongoApp.collection('configs').findOne( - { readers: req.params.uid, _id: new ObjectID(req.params.config_id)} - , function(err, data) { - if (err) { - console.log(err); - return res.status(502).send({}); - } else if (!data || Object.keys(data).length === 0) { - return res.status(404).send({}); - } else { - return res.status(200).send(data); - } - }); - }); - - -router.route('/api/v1/users/:uid/preferences') - .get(ensureUser, function(req, res) { - checkMongo(); - mongoApp.collection('users').findOne( - { uid: req.params.uid }, - { _id: 0, preferences: 1 } - ,function(err, data) { - if (err) { - console.log(err); - return res.status(502).send({}); - } else if (!data || Object.keys(data).length === 0) { - return res.status(404).send({}); - } else { - return res.status(200).send(data['preferences']); - } - }); - }) - .post(ensureUser, function(req, res) { - if(req.body.hasOwnProperty('preferences')) { - checkMongo(); - mongoApp.collection('users').findOneAndUpdate( - { uid: req.params.uid }, - { $set: {preferences: req.body.preferences} }, - { returnOriginal: false }, - function(err, doc) { - if(err) { - console.log(err); - return res.status(502).send({message: 'fail'}); - } else if (!doc) { - return res.status(404).send({message: 'fail'}); - } else { - return res.status(201).send({message: 'success'}); - } - }); - } else { - console.log('No property known as configurations.'); - return res.status(502).send({message: 'fail'}); - } - }); - -router.route('/api/v1/users/:uid/config/file') - .post(ensureUser, function(req, res) { - upload(req, res, function(err) { - if (err) { - console.log(err); - return res.redirect('/u/configure?u=error'); - } - if (req.file) { - try { - var mimetype = req.file.mimetype; - if (mimetype != 'text/csv') { - return res.redirect('/u/configure?u=error'); - } - var file_path = path.resolve(req.file.path); - var schema = JSON.parse(fs.readFileSync('config.schema', 'utf8')); - csv().fromFile(file_path).then((data) => { - /* cast range to numbers and add colorbar */ - data.forEach(function(d) { - if (d.range) { - d.range = d.range.split(';').map(Number); - } - if (!d.colorbar || !d.colorbar.trim()) { - d.colorbar = 'RdYlBu'; - } - }); - - /* validate configuration file (JSON Schema) */ - var validation = validate(data, schema); - if (validation.errors.length > 0) { - return res.redirect('/u/configure?u=invalid'); - } - - /* add colorbrewer colors to each config item */ - data.forEach(function(d) { - var colorbar = d.colorbar ? d.colorbar : 'RdYlBu'; - if(colorbar == 'RdYlBu') { - d.color = ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", - "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"]; - } else { - d.color = colorbrewer[colorbar][9]; - } - }); - - var newConfig = { - owner: req.user, - config: data, - name: req.body.path, - type: 'matrix', - readers : [req.user], - created: (new Date()).toUTCString() - }; - checkMongo(); - mongoApp.collection('configs').insertOne(newConfig); - return res.redirect('/u/configure?u=success'); - }); - } catch(err) { - console.log('Error occurred while uploading a configuration file.'); - console.log(err); - return res.redirect('/u/configure?u=error'); - } - } else { - return res.redirect('/u/configure?u=error'); - } - }); - }); -module.exports = router; diff --git a/routes/users.js b/routes/users.js deleted file mode 100644 index 623e4302..00000000 --- a/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express'); -var router = express.Router(); - -/* GET users listing. */ -router.get('/', function(req, res, next) { - res.send('respond with a resource'); -}); - -module.exports = router; diff --git a/server/app.js b/server/app.js new file mode 100644 index 00000000..2e800c97 --- /dev/null +++ b/server/app.js @@ -0,0 +1,188 @@ +import path from 'path' + +import bodyParser from 'body-parser' +import connectLiveReload from 'connect-livereload' +import MongoStore from 'connect-mongo' +import cookieParser from 'cookie-parser' +import express from 'express' +import expressSession from 'express-session' +import helmet from 'helmet' +import livereload from 'livereload' +import { MongoClient } from 'mongodb' +import morgan from 'morgan' +import passport from 'passport' +import { Strategy } from 'passport-local' +import favicon from 'serve-favicon' +import winston from 'winston' + +import { PASSPORT_FIELDS_ATTRIBUTES } from './constants' +import UserModel from './models/UserModel' +import adminRouter from './routes/admin' +import assessmentData from './routes/assessmentData' +import assessmentsRouter from './routes/assessments' +import authRouter from './routes/auth' +import chartsRouter from './routes/charts' +import configurationsRouter from './routes/configurations' +import dashboardsRouter from './routes/dashboards' +import indexRouter from './routes/index' +import participantsRouter from './routes/participants' +import siteMetadata from './routes/siteMetadata' +import usersRouter from './routes/users' +import userStudiesRouter from './routes/userStudies' +import { verifyHash } from './utils/crypto/hash' + +const localStrategy = Strategy +const isProduction = process.env.NODE_ENV === 'production' +const cookieAttributes = { + secure: isProduction, + maxAge: 24 * 60 * 60 * 1000, + sameSite: 'strict', +} +const app = express() + +if (process.env.NODE_ENV === 'development') { + const liveReloadServer = livereload.createServer() + liveReloadServer.watch(path.join(__dirname, '..', 'public', 'js')) + liveReloadServer.server.once('connection', () => { + setTimeout(() => { + liveReloadServer.refresh('/*') + }, 100) + }) + app.use(connectLiveReload()) +} + +/** favicon setup */ +app.use(favicon(path.join(__dirname, '../public/img/favicon.ico'))) + +app.use(helmet({ noSniff: true, contentSecurityPolicy: isProduction })) + +/** logger setup */ +morgan.token('remote-user', function (req) { + return req.user ? req.user.uid : 'unidentified' +}) +const logger = winston.createLogger({ + transports: [ + new winston.transports.Console({ + level: 'debug', + handleExceptions: true, + json: false, + colorize: true, + }), + ], + exitOnError: false, +}) +logger.stream = { + write(message) { + logger.info(message) + }, +} +app.use(morgan('tiny', { stream: logger.stream })) + +/** parsers setup */ +app.use(express.static('public')) +app.use(cookieParser(process.env.SESSION_SECRET)) +app.use(bodyParser.json({ limit: '500mb', extended: true })) +app.use(bodyParser.urlencoded({ limit: '50mb', extended: true })) + +/* database setup */ +const mongoURI = + process.env.MONGODB_URI || + `mongodb://${process.env.MONGODB_USER}:${process.env.MONGODB_PASSWORD}@${process.env.MONGODB_HOST}:27017/?tls=true&tlsCAfile=global-bundle.pem&retryWrites=false` + +logger.info(` + MongoDB URI: ${mongoURI.replace(/:.*@/g, ':MASKED:MASKED@')} +`) + +const client = new MongoClient(mongoURI, { monitorCommands: true }) +app.locals.appDb = client.db() + +UserModel.createFirstAdmin(app.locals.appDb) + +/** session store setup */ +app.set('trust proxy', true) +app.use( + expressSession({ + secret: process.env.SESSION_SECRET, + saveUninitialized: false, + resave: true, + proxy: true, + cookie: cookieAttributes, + store: MongoStore.create({ + mongoUrl: mongoURI, + }), + }) +) +app.use(passport.initialize()) +app.use(passport.session()) +//passport local strategy +passport.use( + new localStrategy( + { + ...PASSPORT_FIELDS_ATTRIBUTES, + }, + async (username, password, done) => { + const { appDb } = app.locals + const userAttributes = { uid: username } + + const user = await UserModel.findOne(appDb, userAttributes, { + password: 1, + role: 1, + display_name: 1, + mail: 1, + icon: 1, + access: 1, + account_expires: 1, + uid: 1, + }) + if (!user) return done(null, false) + + if (!verifyHash(password, user?.password)) return done(null, false) + + delete user.password + + return done(null, user) + } + ) +) + +passport.serializeUser(function (user, done) { + done(null, user) +}) + +passport.deserializeUser(async function (user, done) { + done(null, user) +}) + +app.use('/', adminRouter) +app.use('/', assessmentsRouter) +app.use('/', assessmentData) +app.use('/', authRouter) +app.use('/', chartsRouter) +app.use('/', configurationsRouter) +app.use('/', dashboardsRouter) +app.use('/', indexRouter) +app.use('/', participantsRouter) +app.use('/', siteMetadata) +app.use('/', usersRouter) +app.use('/', userStudiesRouter) +app.use('./img', express.static(path.join(__dirname, '../public/img'))) + +app.get('/*', async (req, res, next) => { + return res.sendFile( + path.join(__dirname, '..', 'public', 'index.html'), + (err) => { + if (err) { + return next(err) + } + } + ) +}) + +//catch any other error +app.use(function (err, _req, res, _) { + console.error(err) + + return res.send({ error: err.message }) +}) + +export default app diff --git a/server/bin/www.js b/server/bin/www.js new file mode 100755 index 00000000..3c95e0e6 --- /dev/null +++ b/server/bin/www.js @@ -0,0 +1,82 @@ +/** + * Module dependencies. + */ + +import { createServer } from 'http' + +import { configDotenv } from 'dotenv' + +import app from '../app' + +configDotenv({ path: '.env' }) + +/** + * Get port from environment and store in Express. + */ + +const port = process.env.SERVER_PORT || 8000 +app.set('port', port) + +/** + * Create HTTP server. + */ + +const server = createServer(app) + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port) +server.on('error', onError) +server.on('listening', onListening) + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error + } + + const bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges') + process.exit(1) + break + case 'EADDRINUSE': + console.error(bind + ' is already in use') + process.exit(1) + break + default: + throw error + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + const addr = server.address() + const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port + console.log('Listening on ' + bind) +} + +process.on('SIGTERM', shutDown) +process.on('SIGINT', shutDown) + +function shutDown() { + console.log('Received kill signal, shutting down gracefully') + if (app.locals.connection) { + app.locals.connection.close() + } + server.close(() => { + console.log('Http server closed.') + process.exit(0) + }) +} diff --git a/server/constants/defaultUserConfig.js b/server/constants/defaultUserConfig.js new file mode 100644 index 00000000..1c8db264 --- /dev/null +++ b/server/constants/defaultUserConfig.js @@ -0,0 +1,4109 @@ +const userConfig = {} +userConfig.colormap = [ + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_00_filesize', + label: 'callLog_00HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_01_filesize', + label: 'callLog_01HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_02_filesize', + label: 'callLog_02HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_03_filesize', + label: 'callLog_03HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_04_filesize', + label: 'callLog_04HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_05_filesize', + label: 'callLog_05HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_06_filesize', + label: 'callLog_06HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_07_filesize', + label: 'callLog_07HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_08_filesize', + label: 'callLog_08HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_09_filesize', + label: 'callLog_09HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_10_filesize', + label: 'callLog_10HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_11_filesize', + label: 'callLog_11HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_12_filesize', + label: 'callLog_12HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_13_filesize', + label: 'callLog_13HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_14_filesize', + label: 'callLog_14HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_15_filesize', + label: 'callLog_15HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_16_filesize', + label: 'callLog_16HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_17_filesize', + label: 'callLog_17HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_18_filesize', + label: 'callLog_18HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_19_filesize', + label: 'callLog_19HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_20_filesize', + label: 'callLog_20HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_21_filesize', + label: 'callLog_21HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_22_filesize', + label: 'callLog_22HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'callLog', + analysis: 'balancesheetCalllog', + variable: 'callLog_hour_23_filesize', + label: 'callLog_23HR', + range: [165, 565], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_00_filesize', + label: 'textsLog_00HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_01_filesize', + label: 'textsLog_01HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_02_filesize', + label: 'textsLog_02HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_03_filesize', + label: 'textsLog_03HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_04_filesize', + label: 'textsLog_04HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_05_filesize', + label: 'textsLog_05HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_06_filesize', + label: 'textsLog_06HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_07_filesize', + label: 'textsLog_07HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_08_filesize', + label: 'textsLog_08HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_09_filesize', + label: 'textsLog_09HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_10_filesize', + label: 'textsLog_10HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_11_filesize', + label: 'textsLog_11HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_12_filesize', + label: 'textsLog_12HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_13_filesize', + label: 'textsLog_13HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_14_filesize', + label: 'textsLog_14HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_15_filesize', + label: 'textsLog_15HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_16_filesize', + label: 'textsLog_16HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_17_filesize', + label: 'textsLog_17HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_18_filesize', + label: 'textsLog_18HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_19_filesize', + label: 'textsLog_19HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_20_filesize', + label: 'textsLog_20HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_21_filesize', + label: 'textsLog_21HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_22_filesize', + label: 'textsLog_22HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'textsLog', + analysis: 'balancesheetTextslog', + variable: 'textsLog_hour_23_filesize', + label: 'textsLog_23HR', + range: [174, 2524], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_00_filesize', + label: 'surveyAnswers_00HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_01_filesize', + label: 'surveyAnswers_01HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_02_filesize', + label: 'surveyAnswers_02HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_03_filesize', + label: 'surveyAnswers_03HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_04_filesize', + label: 'surveyAnswers_04HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_05_filesize', + label: 'surveyAnswers_05HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_06_filesize', + label: 'surveyAnswers_06HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_07_filesize', + label: 'surveyAnswers_07HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_08_filesize', + label: 'surveyAnswers_08HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_09_filesize', + label: 'surveyAnswers_09HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_10_filesize', + label: 'surveyAnswers_10HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_11_filesize', + label: 'surveyAnswers_11HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_12_filesize', + label: 'surveyAnswers_12HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_13_filesize', + label: 'surveyAnswers_13HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_14_filesize', + label: 'surveyAnswers_14HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_15_filesize', + label: 'surveyAnswers_15HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_16_filesize', + label: 'surveyAnswers_16HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_17_filesize', + label: 'surveyAnswers_17HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_18_filesize', + label: 'surveyAnswers_18HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_19_filesize', + label: 'surveyAnswers_19HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_20_filesize', + label: 'surveyAnswers_20HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_21_filesize', + label: 'surveyAnswers_21HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_22_filesize', + label: 'surveyAnswers_22HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'surveyAnswers', + analysis: 'balancesheetSurveyanswers', + variable: 'surveyAnswers_hour_23_filesize', + label: 'surveyAnswers_23HR', + range: [7400, 13300], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_00_filesize', + label: 'voiceRecording_00HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_01_filesize', + label: 'voiceRecording_01HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_02_filesize', + label: 'voiceRecording_02HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_03_filesize', + label: 'voiceRecording_03HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_04_filesize', + label: 'voiceRecording_04HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_05_filesize', + label: 'voiceRecording_05HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_06_filesize', + label: 'voiceRecording_06HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_07_filesize', + label: 'voiceRecording_07HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_08_filesize', + label: 'voiceRecording_08HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_09_filesize', + label: 'voiceRecording_09HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_10_filesize', + label: 'voiceRecording_10HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_11_filesize', + label: 'voiceRecording_11HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_12_filesize', + label: 'voiceRecording_12HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_13_filesize', + label: 'voiceRecording_13HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_14_filesize', + label: 'voiceRecording_14HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_15_filesize', + label: 'voiceRecording_15HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_16_filesize', + label: 'voiceRecording_16HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_17_filesize', + label: 'voiceRecording_17HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_18_filesize', + label: 'voiceRecording_18HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_19_filesize', + label: 'voiceRecording_19HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_20_filesize', + label: 'voiceRecording_20HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_21_filesize', + label: 'voiceRecording_21HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_22_filesize', + label: 'voiceRecording_22HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'voiceRecording', + analysis: 'balancesheetVoicerecording', + variable: 'voiceRecording_hour_23_filesize', + label: 'voiceRecording_23HR', + range: [249566, 648577], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_00_filesize', + label: 'powerState_00HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_01_filesize', + label: 'powerState_01HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_02_filesize', + label: 'powerState_02HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_03_filesize', + label: 'powerState_03HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_04_filesize', + label: 'powerState_04HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_05_filesize', + label: 'powerState_05HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_06_filesize', + label: 'powerState_06HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_07_filesize', + label: 'powerState_07HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_08_filesize', + label: 'powerState_08HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_09_filesize', + label: 'powerState_09HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_10_filesize', + label: 'powerState_10HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_11_filesize', + label: 'powerState_11HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_12_filesize', + label: 'powerState_12HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_13_filesize', + label: 'powerState_13HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_14_filesize', + label: 'powerState_14HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_15_filesize', + label: 'powerState_15HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_16_filesize', + label: 'powerState_16HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_17_filesize', + label: 'powerState_17HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_18_filesize', + label: 'powerState_18HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_19_filesize', + label: 'powerState_19HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_20_filesize', + label: 'powerState_20HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_21_filesize', + label: 'powerState_21HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_22_filesize', + label: 'powerState_22HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'powerState', + analysis: 'balancesheetPowerstate', + variable: 'powerState_hour_23_filesize', + label: 'powerState_23HR', + range: [77, 2680], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_00_filesize', + label: 'gps_00HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_01_filesize', + label: 'gps_01HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_02_filesize', + label: 'gps_02HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_03_filesize', + label: 'gps_03HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_04_filesize', + label: 'gps_04HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_05_filesize', + label: 'gps_05HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_06_filesize', + label: 'gps_06HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_07_filesize', + label: 'gps_07HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_08_filesize', + label: 'gps_08HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_09_filesize', + label: 'gps_09HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_10_filesize', + label: 'gps_10HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_11_filesize', + label: 'gps_11HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_12_filesize', + label: 'gps_12HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_13_filesize', + label: 'gps_13HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_14_filesize', + label: 'gps_14HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_15_filesize', + label: 'gps_15HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_16_filesize', + label: 'gps_16HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_17_filesize', + label: 'gps_17HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_18_filesize', + label: 'gps_18HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_19_filesize', + label: 'gps_19HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_20_filesize', + label: 'gps_20HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_21_filesize', + label: 'gps_21HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_22_filesize', + label: 'gps_22HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'gps', + analysis: 'balancesheetGps', + variable: 'gps_hour_23_filesize', + label: 'gps_23HR', + range: [37500, 60000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_00_filesize', + label: 'accel_00HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_01_filesize', + label: 'accel_01HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_02_filesize', + label: 'accel_02HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_03_filesize', + label: 'accel_03HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_04_filesize', + label: 'accel_04HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_05_filesize', + label: 'accel_05HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_06_filesize', + label: 'accel_06HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_07_filesize', + label: 'accel_07HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_08_filesize', + label: 'accel_08HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_09_filesize', + label: 'accel_09HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_10_filesize', + label: 'accel_10HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_11_filesize', + label: 'accel_11HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_12_filesize', + label: 'accel_12HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_13_filesize', + label: 'accel_13HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_14_filesize', + label: 'accel_14HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_15_filesize', + label: 'accel_15HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_16_filesize', + label: 'accel_16HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_17_filesize', + label: 'accel_17HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_18_filesize', + label: 'accel_18HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_19_filesize', + label: 'accel_19HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_20_filesize', + label: 'accel_20HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_21_filesize', + label: 'accel_21HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_22_filesize', + label: 'accel_22HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'accel', + analysis: 'balancesheetAccel', + variable: 'accel_hour_23_filesize', + label: 'accel_23HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_00_filesize', + label: 'wifiLog_00HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_01_filesize', + label: 'wifiLog_01HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_02_filesize', + label: 'wifiLog_02HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_03_filesize', + label: 'wifiLog_03HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_04_filesize', + label: 'wifiLog_04HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_05_filesize', + label: 'wifiLog_05HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_06_filesize', + label: 'wifiLog_06HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_07_filesize', + label: 'wifiLog_07HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_08_filesize', + label: 'wifiLog_08HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_09_filesize', + label: 'wifiLog_09HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_10_filesize', + label: 'wifiLog_10HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_11_filesize', + label: 'wifiLog_11HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_12_filesize', + label: 'wifiLog_12HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_13_filesize', + label: 'wifiLog_13HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_14_filesize', + label: 'wifiLog_14HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_15_filesize', + label: 'wifiLog_15HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_16_filesize', + label: 'wifiLog_16HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_17_filesize', + label: 'wifiLog_17HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_18_filesize', + label: 'wifiLog_18HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_19_filesize', + label: 'wifiLog_19HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_20_filesize', + label: 'wifiLog_20HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_21_filesize', + label: 'wifiLog_21HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_22_filesize', + label: 'wifiLog_22HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'wifiLog', + analysis: 'balancesheetWifilog', + variable: 'wifiLog_hour_23_filesize', + label: 'wifiLog_23HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_00_filesize', + label: 'bluetoothLog_00HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_01_filesize', + label: 'bluetoothLog_01HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_02_filesize', + label: 'bluetoothLog_02HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_03_filesize', + label: 'bluetoothLog_03HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_04_filesize', + label: 'bluetoothLog_04HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_05_filesize', + label: 'bluetoothLog_05HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_06_filesize', + label: 'bluetoothLog_06HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_07_filesize', + label: 'bluetoothLog_07HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_08_filesize', + label: 'bluetoothLog_08HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_09_filesize', + label: 'bluetoothLog_09HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_10_filesize', + label: 'bluetoothLog_10HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_11_filesize', + label: 'bluetoothLog_11HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_12_filesize', + label: 'bluetoothLog_12HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_13_filesize', + label: 'bluetoothLog_13HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_14_filesize', + label: 'bluetoothLog_14HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_15_filesize', + label: 'bluetoothLog_15HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_16_filesize', + label: 'bluetoothLog_16HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_17_filesize', + label: 'bluetoothLog_17HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_18_filesize', + label: 'bluetoothLog_18HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_19_filesize', + label: 'bluetoothLog_19HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_20_filesize', + label: 'bluetoothLog_20HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_21_filesize', + label: 'bluetoothLog_21HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_22_filesize', + label: 'bluetoothLog_22HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, + { + category: 'bluetoothLog', + analysis: 'balancesheetBluetoothlog', + variable: 'bluetoothLog_hour_23_filesize', + label: 'bluetoothLog_23HR', + range: [1711938, 2000000], + color: [ + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + ], + text: false, + }, +] + +export default userConfig diff --git a/server/constants/index.js b/server/constants/index.js new file mode 100644 index 00000000..43926539 --- /dev/null +++ b/server/constants/index.js @@ -0,0 +1,37 @@ +import { + ADMIN_ROLE, + ASC, + ALL_SUBJECTS_MONGO_PROJECTION, + DEFAULT_PARTICIPANTS_SORT, + EMPTY_VALUE, + FILTERS_FORM, + INCLUSION_EXCLUSION_CRITERIA_FORM, + N_A, + PASSPORT_FIELDS_ATTRIBUTES, + SOCIODEMOGRAPHICS_FORM, + STUDIES_TO_OMIT, + SITE, + SITE_CODE, + SITE_NAME, + TOTALS_STUDY, + TOTAL_LABEL, +} from './vars' + +export { + ADMIN_ROLE, + ASC, + ALL_SUBJECTS_MONGO_PROJECTION, + DEFAULT_PARTICIPANTS_SORT, + EMPTY_VALUE, + FILTERS_FORM, + INCLUSION_EXCLUSION_CRITERIA_FORM, + N_A, + PASSPORT_FIELDS_ATTRIBUTES, + SOCIODEMOGRAPHICS_FORM, + STUDIES_TO_OMIT, + SITE, + SITE_CODE, + SITE_NAME, + TOTALS_STUDY, + TOTAL_LABEL, +} diff --git a/server/constants/vars.js b/server/constants/vars.js new file mode 100644 index 00000000..76742723 --- /dev/null +++ b/server/constants/vars.js @@ -0,0 +1,33 @@ +export const ASC = 'ASC' +export const N_A = 'N/A' +export const TOTALS_STUDY = 'Totals' +export const EMPTY_VALUE = '' +export const STUDIES_TO_OMIT = ['files', 'combined'] +export const INCLUSION_EXCLUSION_CRITERIA_FORM = + 'form_inclusionexclusion_criteria_review' +export const SOCIODEMOGRAPHICS_FORM = 'form_sociodemographics' +// form_filters_status has all of the filters for participants +export const FILTERS_FORM = 'form_filters' +export const TOTAL_LABEL = 'Total' +export const SITE = 'Site' +export const SITE_NAME = 'Site Name' +export const SITE_CODE = 'Site Code' + +export const ALL_SUBJECTS_MONGO_PROJECTION = { + study: 1, + _id: 0, + participant: 1, + dayData: 1, +} + +export const PASSPORT_FIELDS_ATTRIBUTES = { + usernameField: 'username', + passwordField: 'password', +} + +export const DEFAULT_PARTICIPANTS_SORT = { + sortBy: 'participant', + sortDirection: ASC, +} + +export const ADMIN_ROLE = 'admin' diff --git a/server/controllers/adminController/adminController.test.js b/server/controllers/adminController/adminController.test.js new file mode 100644 index 00000000..252e311f --- /dev/null +++ b/server/controllers/adminController/adminController.test.js @@ -0,0 +1,83 @@ +import AdminUsersController from '.' +import { createRequestWithUser, createResponse } from '../../../test/fixtures' + +describe('AdminUsersController', () => { + describe(AdminUsersController.update, () => { + describe('when successful', () => { + const request = createRequestWithUser({ + params: { uid: 'uid' }, + }) + const response = createResponse() + + it('sends a status of 200 with a data result', async () => { + request.app.locals.appDb.findOneAndUpdate.mockResolvedValueOnce({ + uid: 'uid', + }) + + await AdminUsersController.update(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: { uid: 'uid' }, + }) + }) + }) + + describe('when unsuccessful', () => { + const request = createRequestWithUser({ + params: { uid: 'uid' }, + }) + const response = createResponse() + + it('returns a 404 error with the error message', async () => { + request.app.locals.appDb.findOneAndUpdate.mockRejectedValueOnce( + new Error('some error') + ) + + await AdminUsersController.update(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + }) + + describe(AdminUsersController.destroy, () => { + const params = { uid: 'owl' } + + describe('When successful', () => { + it('returns a status of 204', async () => { + const request = createRequestWithUser(params) + const response = createResponse() + + request.app.locals.appDb.deleteOne.mockResolvedValueOnce({ + deletedCount: 1, + }) + + await AdminUsersController.destroy(request, response) + + expect(response.status).toHaveBeenCalledWith(204) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message property when there is an error', async () => { + const request = createRequestWithUser(params) + const response = createResponse() + + request.app.locals.appDb.deleteOne.mockRejectedValueOnce( + new Error('destroy error') + ) + + await AdminUsersController.destroy(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'destroy error', + }) + }) + }) + }) +}) diff --git a/server/controllers/adminController/index.js b/server/controllers/adminController/index.js new file mode 100644 index 00000000..30bcb4a9 --- /dev/null +++ b/server/controllers/adminController/index.js @@ -0,0 +1,29 @@ +import UserModel from '../../models/UserModel' + +const AdminUsersController = { + update: async (req, res) => { + try { + const { appDb } = req.app.locals + const { uid } = req.params + const updatedUser = await UserModel.update(appDb, uid, req.body) + + return res.status(200).json({ data: updatedUser }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + destroy: async (req, res) => { + try { + const { appDb } = req.app.locals + const { uid } = req.params + + await UserModel.destroy(appDb, uid) + + return res.status(204).end() + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, +} + +export default AdminUsersController diff --git a/server/controllers/api/assessmentDayDataController/assessmentDayDataController.test.js b/server/controllers/api/assessmentDayDataController/assessmentDayDataController.test.js new file mode 100644 index 00000000..a8efaa02 --- /dev/null +++ b/server/controllers/api/assessmentDayDataController/assessmentDayDataController.test.js @@ -0,0 +1,436 @@ +import AssessmentDayDataController from '.' +import { + createAssessmentDayData, + createAssessmentDayDataMetadata, + createNewAssessmentDayData, + createRequest, + createResponse, + createAsessmentVariable, + createParticipantDayData, +} from '../../../../test/fixtures' +import AssessmentVariablesModel from '../../../models/AssessmentVariablesModel' +import { collections } from '../../../utils/mongoCollections' + +describe('assessmentDayDataController', () => { + let appDb + + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db() + }) + beforeEach(async () => { + await appDb.createCollection(collections.metadata) + await appDb.createCollection(collections.assessmentDayData) + await appDb.createCollection(collections.assessments) + await appDb.createCollection(collections.assessmentVariables) + }) + + afterEach(async () => { + const existingCollections = await appDb.listCollections().toArray() + const collectionNames = existingCollections.map((c) => c.name) + if (collectionNames.includes(collections.metadata)) { + await appDb.collection(collections.metadata).drop() + } + if (collectionNames.includes(collections.assessmentDayData)) { + await appDb.collection(collections.assessmentDayData).drop() + } + if (collectionNames.includes(collections.assessments)) { + await appDb.collection(collections.assessments).drop() + } + if (collectionNames.includes(collections.assessmentVariables)) { + await appDb.collection(collections.assessmentVariables).drop() + } + }) + afterAll(async () => { + await appDb.dropDatabase() + }) + + describe(AssessmentDayDataController.create, () => { + describe('When successful', () => { + const initialAssessmentVariables = [ + createAsessmentVariable({ + name: 'var1', + }), + createAsessmentVariable({ + name: 'var2', + }), + createAsessmentVariable({ + name: 'var3', + }), + createAsessmentVariable({ + name: 'var4', + }), + createAsessmentVariable({ + name: 'var6', + }), + createAsessmentVariable({ + name: 'var7', + }), + ] + const assessmentDayDataControllerMetadata = + createAssessmentDayDataMetadata({ + study: 'study', + participant: 'participant', + assessment: 'assessment', + units: 'day', + start: '1', + end: '4', + time_end: '4', + Consent: new Date('2020-01-02'), + }) + const updatedParticipantDayData = [ + createParticipantDayData({ + day: 1, + var1: 9, + var2: 4, + var3: 'str', + }), + createParticipantDayData({ + day: 4, + var1: 9, + var2: 4, + var3: 'str', + }), + createParticipantDayData({ + day: 8, + var1: 2, + var2: 2, + var3: 'str', + var4: 5, + var6: 6, + var7: 'str2', + }), + createParticipantDayData({ + day: 12, + var1: 2, + var2: 2, + var3: 'str', + var4: 5, + var6: 6, + var7: 'str2', + }), + ] + const initialParticipantDayData = [ + createParticipantDayData({ + day: 1, + var1: 1, + var2: 2, + var3: 'str', + }), + createParticipantDayData({ + day: 8, + var1: 2, + var2: 2, + var3: 'str', + var4: 5, + var6: 6, + var7: 'str2', + }), + ] + + it('creates a participants assessment day data', async () => { + const data = createNewAssessmentDayData({ + metadata: assessmentDayDataControllerMetadata, + participant_assessments: initialParticipantDayData, + }) + const request = createRequest({ + body: data, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await AssessmentDayDataController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: 'participant assessment data imported', + }) + + const newDocument = await appDb + .collection(collections.assessmentDayData) + .findOne( + { participant: 'participant' }, + { + projection: { _id: 0 }, + } + ) + + expect(newDocument).toEqual({ + ...assessmentDayDataControllerMetadata, + dayData: initialParticipantDayData, + }) + }) + + it('updates existing day data records or adds new ones', async () => { + await appDb.collection(collections.assessmentDayData).insertOne({ + ...assessmentDayDataControllerMetadata, + dayData: initialParticipantDayData, + }) + + const data = createNewAssessmentDayData({ + metadata: createAssessmentDayDataMetadata({ + ...assessmentDayDataControllerMetadata, + end: '12', + time_end: '12', + }), + participant_assessments: updatedParticipantDayData, + }) + const request = createRequest({ + body: data, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await AssessmentDayDataController.create(request, response) + + const newDocument = await appDb + .collection(collections.assessmentDayData) + .findOne( + { participant: 'participant' }, + { + projection: { _id: 0, updatedAt: 0 }, + } + ) + + expect(newDocument).toEqual({ + ...createAssessmentDayDataMetadata({ + ...assessmentDayDataControllerMetadata, + end: '12', + time_end: '12', + daysInStudy: 12, + Active: 1, + Consent: new Date('2020-01-02'), + assessment: 'assessment', + }), + dayData: updatedParticipantDayData, + }) + }) + it('creates a metadata document', async () => { + const data = createNewAssessmentDayData({ + metadata: assessmentDayDataControllerMetadata, + participant_assessments: initialParticipantDayData, + }) + const request = createRequest({ + body: data, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await AssessmentDayDataController.create(request, response) + + const newDocument = await appDb + .collection(collections.metadata) + .findOne( + { study: 'study' }, + { + projection: { + _id: 0, + 'participants.synced': 0, + updatedAt: 0, + }, + } + ) + + expect(newDocument).toEqual({ + study: 'study', + participants: [ + { + Active: 1, + Consent: new Date('2020-01-02'), + study: 'study', + participant: 'participant', + daysInStudy: 8, + }, + ], + }) + expect(newDocument.participants.length).toEqual(1) + }) + + it('updates a metadata document', async () => { + const participant = { + Active: 1, + study: 'study', + participant: 'participant', + Consent: new Date('2022-06-09'), + } + + await appDb.collection(collections.metadata).insertOne({ + study: 'study', + participants: [participant], + }) + + const data = createNewAssessmentDayData({ + metadata: assessmentDayDataControllerMetadata, + participant_assessments: initialParticipantDayData, + }) + const request = createRequest({ + body: data, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await AssessmentDayDataController.create(request, response) + + const newDocument = await appDb + .collection(collections.metadata) + .findOne( + { study: 'study' }, + { + projection: { + _id: 0, + }, + } + ) + + expect(newDocument.participants[0]).toHaveProperty('synced') + expect(newDocument.participants[0].daysInStudy).toEqual(8) + }) + it('creates new assessment and assessment variables documents', async () => { + const newAssessment = 'initialAssessment' + const assessment_variables = initialAssessmentVariables + const data = createNewAssessmentDayData({ + metadata: createAssessmentDayDataMetadata({ + ...assessmentDayDataControllerMetadata, + assessment: newAssessment, + }), + participant_assessments: initialParticipantDayData, + assessment_variables, + }) + const request = createRequest({ + body: data, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await AssessmentDayDataController.create(request, response) + + const assessmentDocument = await appDb + .collection(collections.assessments) + .findOne({ + name: newAssessment, + }) + const assessmentVariables = await appDb + .collection(collections.assessmentVariables) + .find( + { assessment_id: assessmentDocument._id }, + { projection: { _id: 0, assessment_id: 0 } } + ) + .sort({ name: 1 }) + .toArray() + + expect(assessmentVariables).toEqual(assessment_variables) + expect(assessmentDocument.name).toEqual(newAssessment) + }) + it('Updates the assessment variables when there are new variables', async () => { + const assessmentVariableSpy = jest.spyOn( + AssessmentVariablesModel, + 'upsert' + ) + const newAssessment = 'update-vars-assessment' + const newAssessmentVariables = [ + createAsessmentVariable({ + name: 'var1', + }), + createAsessmentVariable({ + name: 'var2', + }), + createAsessmentVariable({ + name: 'var3', + }), + createAsessmentVariable({ + name: 'var4', + }), + createAsessmentVariable({ + name: 'var6', + }), + createAsessmentVariable({ + name: 'var7', + }), + createAsessmentVariable({ + name: 'var5', + }), + createAsessmentVariable({ + name: 'new-var1', + }), + createAsessmentVariable({ + name: 'newvar2', + }), + ] + + const data = createNewAssessmentDayData({ + metadata: createAssessmentDayDataMetadata({ + ...assessmentDayDataControllerMetadata, + assessment: newAssessment, + }), + participant_assessments: initialParticipantDayData, + assessment_variables: newAssessmentVariables, + }) + const request = createRequest({ + body: data, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await AssessmentDayDataController.create(request, response) + const assessment = await appDb + .collection(collections.assessments) + .findOne({ name: newAssessment }) + + newAssessmentVariables.forEach((variable, i) => { + expect(assessmentVariableSpy.mock.calls[i]).toEqual([ + appDb, + { + name: variable.name, + assessment_id: assessment._id, + }, + { + name: variable.name, + assessment_id: assessment._id, + }, + ]) + }) + expect(assessmentVariableSpy).toBeCalledTimes( + newAssessmentVariables.length + ) + assessmentVariableSpy.mockClear() + }) + }) + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message when payload is missing', async () => { + const request = createRequest() + const response = createResponse() + + await AssessmentDayDataController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + message: 'Nothing to import', + }) + }) + }) + }) + describe(AssessmentDayDataController.destroy, () => { + describe('when successful', () => { + it('deletes all documents in the assessmentDayData collection', async () => { + await appDb + .collection(collections.assessmentDayData) + .insertMany([createAssessmentDayData(), createAssessmentDayData()]) + + const request = createRequest({ + app: { locals: { appDb } }, + }) + + const response = createResponse() + + await AssessmentDayDataController.destroy(request, response) + + const remainingCollections = await appDb.listCollections().toArray() + expect(response.status).toHaveBeenCalledWith(200) + expect( + remainingCollections + .map((c) => c.name) + .includes(collections.assessmentDayData) + ).toBe(false) + }) + }) + }) +}) diff --git a/server/controllers/api/assessmentDayDataController/index.js b/server/controllers/api/assessmentDayDataController/index.js new file mode 100644 index 00000000..b97ecc2c --- /dev/null +++ b/server/controllers/api/assessmentDayDataController/index.js @@ -0,0 +1,184 @@ +import AssessmentDayDataModel from '../../../models/AssessmentDayDataModel' +import AssessmentModel from '../../../models/AssessmentModel' +import AssessmentVariablesModel from '../../../models/AssessmentVariablesModel' +import SiteMetadataModel from '../../../models/SiteMetadataModel' +import { collections } from '../../../utils/mongoCollections' + +const AssessmentDayDataController = { + create: async (req, res, next) => { + try { + const { appDb } = req.app.locals + const { metadata, participant_assessments, assessment_variables } = + req.body + + if (!metadata || !participant_assessments.length) + return res.status(400).json({ message: 'Nothing to import' }) + + const { assessment, participant, study, Consent, Active } = metadata + let parsedConsent = null + + try { + if (Consent) { + parsedConsent = new Date(Consent) + } + } catch { + // Missing consent dates could come in a number of formats, + // so we attempt to parse the date and leave it as null if there's + // an error + } + + const query = { + assessment, + participant, + } + const assessmentQuery = { + name: assessment, + } + const newAssessmentProperties = AssessmentModel.withDefaults({ + name: assessment, + }) + + const participantAssessmentData = await AssessmentDayDataModel.findOne( + appDb, + query + ) + + let sortedDayData = participant_assessments + let maxDayInDayData = Math.max( + ...participant_assessments.map((pa) => pa.day) + ) + if (participantAssessmentData) { + sortedDayData = sortDayData( + participantAssessmentData, + participant_assessments + ) + maxDayInDayData = Math.max( + ...sortedDayData.map((dayData) => dayData.day) + ) + await AssessmentDayDataModel.upsert(appDb, query, { + ...participantAssessmentData, + ...metadata, + daysInStudy: maxDayInDayData, + dayData: sortedDayData, + }) + } else { + await AssessmentDayDataModel.upsert(appDb, query, { + ...metadata, + Consent: parsedConsent, + dayData: participant_assessments, + }) + } + + const studyMetadata = await SiteMetadataModel.findOne(appDb, { + study, + }) + + if (!studyMetadata) { + await SiteMetadataModel.upsert$Set( + appDb, + { study }, + { + study, + participants: [ + { + Active, + Consent: parsedConsent, + study, + participant, + daysInStudy: maxDayInDayData, + synced: new Date(), + }, + ], + } + ) + } else { + const isParticipantInDocument = await SiteMetadataModel.findOne(appDb, { + participants: { $elemMatch: { participant } }, + }) + + if (isParticipantInDocument) { + await SiteMetadataModel.upsert$Set( + appDb, + { participants: { $elemMatch: { participant } } }, + { + 'participants.$.daysInStudy': maxDayInDayData, + 'participants.$.synced': new Date(), + } + ) + } else { + await SiteMetadataModel.upsert$addToSet( + appDb, + { study }, + { + participants: { + Active, + Consent: parsedConsent, + daysInStudy: maxDayInDayData, + study, + participant, + synced: new Date(), + }, + } + ) + } + } + + const currentAssessment = await AssessmentModel.upsert( + appDb, + assessmentQuery, + newAssessmentProperties + ) + + if (assessment_variables.length) { + await Promise.all( + assessment_variables.map(async ({ name }) => { + const variableAttributes = { + name, + assessment_id: currentAssessment._id, + } + + return await AssessmentVariablesModel.upsert( + appDb, + variableAttributes, + variableAttributes + ) + }) + ) + } + return res + .status(200) + .json({ data: `${participant} ${assessment} data imported` }) + } catch (err) { + return next(err) + } + }, + destroy: async (req, res, next) => { + try { + const { appDb } = req.app.locals + await appDb.collection(collections.assessmentDayData).drop() + + return res.status(200) + } catch (error) { + next(error) + } + }, +} + +function sortDayData(participantAssessmentData, participant_assessments) { + const { dayData } = participantAssessmentData + const filteredDays = dayData.filter( + ({ day }) => + !participant_assessments.find((assessment) => day === assessment.day) + ) + return filteredDays + .concat(participant_assessments) + .sort((prevParticipant, nextParticipant) => + prevParticipant.day < nextParticipant.day + ? -1 + : prevParticipant.day > nextParticipant.day + ? 1 + : 0 + ) +} + +export default AssessmentDayDataController diff --git a/server/controllers/api/siteMetadataController/index.js b/server/controllers/api/siteMetadataController/index.js new file mode 100644 index 00000000..02b6acb0 --- /dev/null +++ b/server/controllers/api/siteMetadataController/index.js @@ -0,0 +1,84 @@ +import SiteMetadataModel from '../../../models/SiteMetadataModel' +import { collections } from '../../../utils/mongoCollections' + +const SiteMetadataController = { + create: async (req, res, next) => { + try { + const { appDb } = req.app.locals + const { metadata, participants } = req.body + const { study } = metadata + + participants.forEach((participant, i) => { + participants[i].Consent = new Date(participant.Consent) + }) + const studyMetadata = await SiteMetadataModel.findOne(appDb, { study }) + + if (!studyMetadata) { + await SiteMetadataModel.upsert$Set( + appDb, + { study }, + { + ...metadata, + participants, + createdAt: new Date(), + } + ) + } else { + Promise.all( + participants.map(async (participant) => { + const isParticipantInSiteMetadata = await SiteMetadataModel.findOne( + appDb, + { + participants: { + $elemMatch: { participant: participant.participant }, + }, + } + ) + if (!isParticipantInSiteMetadata) { + await SiteMetadataModel.upsert$addToSet( + appDb, + { study }, + { participants: participant } + ) + } else { + const updatedAttributes = Object.keys(participant).reduce( + (attributes, key) => { + attributes[`participants.$.${key}`] = participant[key] + + return attributes + }, + {} + ) + await SiteMetadataModel.upsert$Set( + appDb, + { + participants: { + $elemMatch: { participant: participant.participant }, + }, + }, + updatedAttributes + ) + } + }) + ) + } + + return res.status(200).json({ data: 'Metadata imported successfully.' }) + } catch (error) { + next(error) + } + }, + destroy: async (req, res) => { + try { + const { appDb } = req.app.locals + + await appDb.collection(collections.metadata).drop() + + return res.status(200).json({ data: 'Metadata collection restarted' }) + } catch (error) { + return res.status(400).json({ message: error.message }) + } + }, +} + +export default SiteMetadataController diff --git a/server/controllers/api/siteMetadataController/siteMetadataController.test.js b/server/controllers/api/siteMetadataController/siteMetadataController.test.js new file mode 100644 index 00000000..7f561015 --- /dev/null +++ b/server/controllers/api/siteMetadataController/siteMetadataController.test.js @@ -0,0 +1,307 @@ +import SiteMetadataController from '.' +import { + createRequest, + createResponse, + createSiteMetadata, +} from '../../../../test/fixtures' + +describe('siteMetadataController', () => { + describe(SiteMetadataController.create, () => { + describe('When new data is imported', () => { + let appDb + + beforeAll(() => { + appDb = global.MONGO_INSTANCE.db('siteMetadata') + }) + beforeEach(async () => { + await appDb.createCollection('metadata') + }) + afterEach(async () => { + await appDb.collection('metadata').drop() + }) + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('creates new metadata document', async () => { + const body = createSiteMetadata({ + metadata: { + filetype: 'text/csv', + encoding: 'utf-8', + dirname: '/path/to/files', + mtime: 1234567890.0, + size: 1024, + uid: 1000, + gid: 1000, + mode: 420, + role: 'metadata', + study: 'CA', + extension: '.csv', + }, + participants: [ + { + participant: 'CA1', + Active: 4, + Consent: '2022-06-02', + study: 'CA', + }, + { + participant: 'CA2', + Active: 3, + Consent: '2022-06-02', + study: 'CA', + }, + ], + }) + const request = createRequest({ + body, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await SiteMetadataController.create(request, response) + + const newDocumentCount = await appDb + .collection('metadata') + .countDocuments({ study: 'CA' }) + + expect(newDocumentCount).toEqual(1) + }) + it('appends new participant when new data is imported but site metadata is present', async () => { + const body = createSiteMetadata({ + metadata: { + filetype: 'text/csv', + encoding: 'utf-8', + dirname: '/path/to/files', + mtime: 1234567890.0, + size: 1024, + uid: 1000, + gid: 1000, + mode: 420, + role: 'metadata', + study: 'LA', + extension: '.csv', + }, + participants: [ + { + participant: 'LA3', + Active: 5, + Consent: '2022-06-02', + study: 'LA', + }, + ], + }) + const request = createRequest({ + body, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await SiteMetadataController.create(request, response) + + const updatedSiteMetadata = await appDb + .collection('metadata') + .findOne({ participants: { $elemMatch: { participant: 'LA3' } } }) + + expect(updatedSiteMetadata).toBeDefined() + }) + it('updates existing participant data', async () => { + const body = createSiteMetadata({ + metadata: { + filetype: 'text/csv', + encoding: 'utf-8', + dirname: '/path/to/files', + mtime: 1234567890.0, + size: 1024, + uid: 1000, + gid: 1000, + mode: 420, + role: 'metadata', + study: 'YA', + extension: '.csv', + }, + participants: [ + { + participant: 'YA1', + Active: 4, + Consent: '2022-06-02', + study: 'YA', + }, + { + participant: 'YA2', + Active: 3, + Consent: '2022-06-02', + study: 'YA', + }, + ], + }) + const request = createRequest({ + body, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await SiteMetadataController.create(request, response) + + const updatedDocs = await appDb + .collection('metadata') + .findOne({ study: 'YA' }) + + expect(updatedDocs.participants).toEqual([ + { + participant: 'YA1', + Active: 4, + Consent: new Date('2022-06-02'), + study: 'YA', + }, + { + participant: 'YA2', + Active: 3, + Consent: new Date('2022-06-02'), + study: 'YA', + }, + ]) + }) + }) + describe('When successful', () => { + it('returns a status of 200 and a success data message', async () => { + const body = createSiteMetadata({ + metadata: { + filetype: 'text/csv', + encoding: 'utf-8', + dirname: '/path/to/files', + mtime: 1234567890.0, + size: 1024, + uid: 1000, + gid: 1000, + mode: 420, + role: 'metadata', + study: 'site', + extension: '.csv', + }, + participants: [ + { + participant: 'YA1', + Active: 1, + Consent: '2022-06-02', + study: 'YA', + }, + { + participant: 'YA2', + Active: 1, + Consent: '2022-06-02', + study: 'YA', + }, + ], + }) + + const request = createRequest({ + body, + }) + const response = createResponse() + + request.app.locals.appDb.findOne.mockResolvedValueOnce(null) + request.app.locals.appDb.findOneAndUpdate.mockImplementation() + + await SiteMetadataController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: 'Metadata imported successfully.', + }) + }) + }) + + describe('When unsuccessful', () => { + it('it passess error to next', async () => { + const body = createSiteMetadata({ + metadata: { + filetype: 'text/csv', + encoding: 'utf-8', + dirname: '/path/to/files', + mtime: 1234567890.0, + size: 1024, + uid: 1000, + gid: 1000, + mode: 420, + role: 'metadata', + study: 'site', + extension: '.csv', + updatedAt: new Date(), + }, + participants: [ + { + participant: 'YA1', + Active: 1, + Consent: '2022-06-02', + study: 'YA', + daysInStudy: 55, + }, + { + participant: 'YA2', + Active: 1, + Consent: '2022-06-02', + study: 'YA', + daysInStudy: 105, + }, + ], + }) + + const request = createRequest({ body }) + const response = createResponse() + const error = new Error('some error') + + request.app.locals.appDb.findOne.mockRejectedValueOnce(error) + const next = jest.fn() + await SiteMetadataController.create(request, response, next) + + expect(next).toHaveBeenCalledWith(error) + }) + }) + }) + describe(SiteMetadataController.destroy, () => { + describe('When successful', () => { + let appDb + + beforeAll(() => { + appDb = global.MONGO_INSTANCE.db('dpdata') + }) + beforeEach(async () => { + await appDb.createCollection('metadata') + }) + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('removes the metadata collection', async () => { + const request = createRequest() + const response = createResponse() + + await SiteMetadataController.destroy(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: 'Metadata collection restarted', + }) + }) + }) + describe('When unsuccessful', () => { + it('returns a status of 200 and an error', async () => { + const request = createRequest() + const response = createResponse() + + request.app.locals.appDb.collection.mockImplementation(() => { + return { + drop: jest.fn().mockRejectedValueOnce(new Error('some error')), + } + }) + await SiteMetadataController.destroy(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + message: 'some error', + }) + }) + }) + }) +}) diff --git a/server/controllers/apiUsersController/apiUsersController.test.js b/server/controllers/apiUsersController/apiUsersController.test.js new file mode 100644 index 00000000..33eda3df --- /dev/null +++ b/server/controllers/apiUsersController/apiUsersController.test.js @@ -0,0 +1,45 @@ +import ApiUsersController from '.' +import { + createRequestWithUser, + createResponse, + createUser, +} from '../../../test/fixtures' + +describe('ApiUsersController', () => { + describe(ApiUsersController.index, () => { + describe('When successful', () => { + it('returns a status of 200 and a collection of user objects', async () => { + const users = [createUser({ uid: 1 }), createUser({ uid: 2 })] + const request = createRequestWithUser() + const response = createResponse() + + request.app.locals.appDb.toArray.mockResolvedValueOnce(users) + + await ApiUsersController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: users, + }) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const request = createRequestWithUser() + const response = createResponse() + + request.app.locals.appDb.find.mockImplementationOnce(() => { + throw new Error('some error') + }) + + await ApiUsersController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + }) +}) diff --git a/server/controllers/apiUsersController/index.js b/server/controllers/apiUsersController/index.js new file mode 100644 index 00000000..c090c3e7 --- /dev/null +++ b/server/controllers/apiUsersController/index.js @@ -0,0 +1,16 @@ +import UserModel from '../../models/UserModel' + +const ApiUsersController = { + index: async (req, res) => { + try { + const { appDb } = req.app.locals + const users = await UserModel.all(appDb) + + return res.status(200).json({ data: users }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, +} + +export default ApiUsersController diff --git a/server/controllers/assessmentsController/assessmentsController.test.js b/server/controllers/assessmentsController/assessmentsController.test.js new file mode 100644 index 00000000..c778f7d7 --- /dev/null +++ b/server/controllers/assessmentsController/assessmentsController.test.js @@ -0,0 +1,78 @@ +import { ObjectId } from 'mongodb' + +import assessmentsController from '.' +import { + createAssessment, + createRequest, + createResponse, +} from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +describe('assessmentsController', () => { + describe('when successful', () => { + let appDb + + const [assess1, assess2, assess3, assess4] = [ + createAssessment({ name: 'assessment_1', _id: new ObjectId() }), + createAssessment({ name: 'form', _id: new ObjectId() }), + createAssessment({ name: 'assessment_2', _id: new ObjectId() }), + createAssessment({ name: 'pilfer', _id: new ObjectId() }), + ] + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db('assessments') + + await appDb + .collection(collections.assessments) + .insertMany([assess1, assess2, assess3, assess4]) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('returns a list of all assessments', async () => { + const request = createRequest({ + app: { locals: { appDb } }, + }) + const response = createResponse() + + await assessmentsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: [assess1, assess2, assess3, assess4], + }) + }) + + it('returns a list of assessments that match search query', async () => { + const request = createRequest({ + app: { locals: { appDb } }, + query: { search: 'f' }, + }) + const response = createResponse() + + await assessmentsController.index(request, response) + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: [assess2, assess4], + }) + }) + }) + describe('when unsuccessful', () => { + it('returns an error', async () => { + const request = createRequest() + const response = createResponse() + + request.app.locals.appDb.toArray.mockRejectedValueOnce( + new Error('This is an error') + ) + + await assessmentsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(401) + expect(response.json).toHaveBeenCalledWith({ + error: 'This is an error', + }) + }) + }) +}) diff --git a/server/controllers/assessmentsController/index.js b/server/controllers/assessmentsController/index.js new file mode 100644 index 00000000..ae2ad401 --- /dev/null +++ b/server/controllers/assessmentsController/index.js @@ -0,0 +1,25 @@ +import AssessmentModel from '../../models/AssessmentModel' + +const assessmentsController = { + index: async (req, res) => { + try { + const { appDb } = req.app.locals + const isSearchRequested = Object.hasOwn(req.query, 'search') + const assessmentModelQuery = !isSearchRequested + ? {} + : { + name: { $regex: req.query.search, $options: 'i' }, + } + const assessmentList = await AssessmentModel.all( + appDb, + assessmentModelQuery + ) + + return res.status(200).json({ data: assessmentList }) + } catch (error) { + return res.status(401).json({ error: error.message }) + } + }, +} + +export default assessmentsController diff --git a/server/controllers/authController/authController.test.js b/server/controllers/authController/authController.test.js new file mode 100644 index 00000000..cb9b6eb2 --- /dev/null +++ b/server/controllers/authController/authController.test.js @@ -0,0 +1,257 @@ +import AuthController from '.' +import { + createRequest, + createRequestWithUser, + createResponse, + createUser, +} from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +afterEach(() => { + jest.clearAllMocks() +}) +describe('AuthController', () => { + describe(AuthController.destroy, () => { + describe('When successful', () => { + it('returns a status of 200 and success data message', async () => { + const request = createRequestWithUser() + const response = createResponse() + + await AuthController.destroy(request, response, jest.fn()) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: { message: 'User is logged out' }, + }) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 500 and an error message', async () => { + const request = createRequestWithUser() + const response = createResponse() + const next = jest.fn() + + request.logout.mockImplementationOnce(() => { + throw new Error('some error') + }) + + await AuthController.destroy(request, response, next) + + expect(response.status).toHaveBeenCalledWith(500) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + }) + describe(AuthController.show, () => { + describe('When successful', () => { + it('returns a status of 200 and a user object', async () => { + const request = createRequestWithUser() + const response = createResponse() + const user = createUser() + + request.app.locals.appDb.findOne.mockResolvedValueOnce(user) + + await AuthController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: user, + }) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error', async () => { + const request = createRequestWithUser() + const response = createResponse() + + request.app.locals.appDb.findOne.mockRejectedValueOnce( + new Error('some error') + ) + + await AuthController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + }) + + describe(AuthController.update, () => { + describe('When successful', () => { + it('Resets the user password and returns a user object', async () => { + const request = createRequestWithUser({ + body: { + username: 'username', + password: 'newpass', + confirmPassword: 'newpass', + reset_key: 'reset_key', + }, + }) + const response = createResponse() + const user = createUser({ + password: 'oldpass', + reset_key: 'reset_key', + }) + const updatedUser = { + ...user, + reset_key: '', + } + + request.app.locals.appDb.findOne.mockResolvedValueOnce(user) + request.app.locals.appDb.findOneAndUpdate.mockResolvedValueOnce( + updatedUser + ) + + await AuthController.update(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: { + ...user, + reset_key: '', + }, + }) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error', async () => { + const request = createRequestWithUser({ + body: { + username: 'username', + password: 'newpass', + confirmPassword: 'newpass', + reset_key: 'reset_key', + }, + }) + const response = createResponse() + request.app.locals.appDb.findOne.mockRejectedValueOnce( + new Error('some error') + ) + + await AuthController.update(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ error: 'some error' }) + }) + }) + + describe('When sent non-string values', () => { + it('stringifies the value before querying the database', async () => { + const request = createRequestWithUser({ + body: { + username: { + $nin: [], + }, + password: 'newpass', + confirmPassword: 'newpass', + reset_key: { + $nin: [], + }, + }, + }) + const response = createResponse() + const mockFindOne = jest.fn().mockResolvedValueOnce(null) + request.app.locals.appDb.collection = jest + .fn() + .mockImplementation(() => ({ + findOne: mockFindOne, + })) + + await AuthController.update(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(mockFindOne).toHaveBeenCalledWith( + { + uid: '[object Object]', + reset_key: '[object Object]', + force_reset_pw: true, + }, + { + projection: { + _id: 0, + password: 0, + bad_pwd_count: 0, + lockout_time: 0, + last_logoff: 0, + last_logon: 0, + force_reset_pw: 0, + }, + } + ) + }) + }) + }) + describe(AuthController.create, () => { + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const response = createResponse() + const user = createUser({ + password: 'somepassword', + confirmPassword: 'somepassword', + }) + const request = createRequest({ + body: user, + }) + + request.app.locals.appDb.findOne.mockRejectedValueOnce( + new Error('some error') + ) + + await AuthController.create(request, response, jest.fn()) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + describe('When user has an account', () => { + let appDb + + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db('auth') + }) + + beforeEach(async () => { + await appDb.createCollection(collections.users) + }) + afterEach(async () => { + await appDb.collection(collections.users).drop() + }) + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('returns a status of 400 and an error message when user has an account', async () => { + const next = jest.fn() + const request = createRequestWithUser({ + body: { + username: 'username', + password: 'newpass', + confirmPassword: 'newpass', + }, + app: { + locals: { appDb }, + }, + }) + const response = createResponse() + const user = createUser({ uid: 'username' }) + + await appDb.collection(collections.users).insertOne(user) + await AuthController.create(request, response, next) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'User has an account', + }) + }) + }) + }) +}) diff --git a/server/controllers/authController/index.js b/server/controllers/authController/index.js new file mode 100644 index 00000000..6fb121f0 --- /dev/null +++ b/server/controllers/authController/index.js @@ -0,0 +1,142 @@ +import dayjs from 'dayjs' +import passport from 'passport' + +import RegistrationMailer from '../../mailer/RegistrationMailer' +import ConfigModel from '../../models/ConfigModel' +import UserModel from '../../models/UserModel' +import { hash } from '../../utils/crypto/hash' +import { isAccountExpired } from '../../utils/passport/helpers' +import { logout } from '../../utils/passport/logout' + +const AuthController = { + authenticate: async (req, res, next) => { + passport.authenticate( + 'local', + { session: true }, + async function (err, user) { + if (err) return next(err) + + const { uid } = user + + const { appDb } = req.app.locals + + const userInfo = await UserModel.update(appDb, uid, { + last_logon: Date.now(), + }) + const { role, account_expires } = userInfo + + if (isAccountExpired(account_expires, role)) { + logout(req, res, next) + + res.clearCookie('connect.sid') + + return res.status(401).json({ error: 'Account is expired' }) + } + req.login(user, function (err) { + if (err) { + return next(err) + } + res.json({ data: userInfo }) + }) + } + )(req, res, next) + }, + create: async (req, res) => { + try { + const { appDb } = req.app.locals + const info = req.body + + const existingUser = await UserModel.findOne(appDb, { + uid: info.username, + }) + if (existingUser) + return res.status(400).json({ error: 'User has an account' }) + + const password = info.password + const uid = info.username + const mail = info.mail + const display_name = info.fullName + const hashedPW = hash(password) + const account_expires = dayjs().add(1, 'years').format() + const configAttributes = ConfigModel.withDefaults({ + owner: uid, + readers: [uid], + }) + const configuration = await ConfigModel.create(appDb, configAttributes) + + const newUserAttributes = { + uid, + display_name, + password: hashedPW, + mail, + account_expires, + preferences: { config: configuration._id.toString() }, + } + const newUser = await UserModel.create(appDb, newUserAttributes) + const registrationMailer = new RegistrationMailer(newUser) + + await registrationMailer.sendMail() + + return res.status(200).json({ data: newUser }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + destroy: async (req, res, next) => { + try { + logout(req, res, next) + + return res.status(200).json({ data: { message: 'User is logged out' } }) + } catch (error) { + return res.status(500).json({ error: error.message }) + } + }, + show: async (req, res) => { + try { + const { appDb } = req.app.locals + const user = await UserModel.findOne(appDb, { uid: req.user.uid }) + + return res.status(200).json({ data: user }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + update: async (req, res) => { + try { + const { password, confirmPassword, reset_key, username } = req.body + + if (password !== confirmPassword) + return res.status(400).json({ error: 'passwords do not match' }) + + const { appDb } = req.app.locals + const encryptPassword = hash(password) + const user = await UserModel.findOne(appDb, { + uid: String(username), + reset_key: String(reset_key), + force_reset_pw: true, + }) + + if (!user) + return res.status(400).json({ + error: 'User not found or there is a problem with the reset key', + }) + + const userAttributes = { + password: encryptPassword, + reset_key: '', + force_reset_pw: false, + } + const updatedUser = await UserModel.update( + appDb, + username, + userAttributes + ) + + return res.status(200).json({ data: updatedUser }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, +} + +export default AuthController diff --git a/server/controllers/chartsController/chartsController.test.js b/server/controllers/chartsController/chartsController.test.js new file mode 100644 index 00000000..9bc41de3 --- /dev/null +++ b/server/controllers/chartsController/chartsController.test.js @@ -0,0 +1,611 @@ +import { ObjectId } from 'mongodb' + +import chartsController from '.' +import { + createRequestWithUser, + createResponse, + createChart, + createUser, + createFieldLabelValue, +} from '../../../test/fixtures' +import UserModel from '../../models/UserModel' +import { collections } from '../../utils/mongoCollections' + +describe('chartsController', () => { + describe('create', () => { + describe('When successful', () => { + let appDb + let user + + beforeAll(async () => { + user = createUser({ + uid: 'owl', + preferences: {}, + access: ['YA', 'LA', 'MA'], + }) + appDb = await global.MONGO_INSTANCE.db('chartsCreate') + + await appDb.collection(collections.users).insertOne(user) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + it('returns a status of 200 and a chart_id', async () => { + const body = createChart( + { + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + const request = createRequestWithUser({ + app: { locals: { appDb }, body }, + }) + const response = createResponse() + + await chartsController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledTimes(1) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const request = createRequestWithUser() + const response = createResponse() + + request.app.locals.appDb.insertOne.mockImplementation(() => { + throw new Error('some error') + }) + + await chartsController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + message: 'some error', + }) + }) + }) + }) + + describe('index', () => { + describe('When successful', () => { + let appDb + + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db('chartsIndex') + }) + + beforeEach(async () => { + await appDb.createCollection(collections.charts) + await appDb.createCollection(collections.users) + }) + + afterEach(async () => { + await appDb.collection(collections.users).drop() + await appDb.collection(collections.charts).drop() + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('returns a list of charts in order of user favorite, title, alongside a status of 200', async () => { + const [chart1, chart2, chart3] = [ + createChart({ + _id: new ObjectId(), + title: 'LES', + description: 'Participant EEG Measurements', + assessment: 'EEG Quick', + variable: 'Rating', + public: false, + owner: 'owl', + }), + createChart({ + _id: new ObjectId(), + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'Foo', + variable: 'Rating', + public: false, + owner: 'owl', + }), + createChart( + { + _id: new ObjectId(), + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ), + ] + const user = createUser({ + uid: 'owl', + favoriteCharts: [chart3._id.toString()], + }) + await appDb.collection(collections.users).insertOne(user) + await appDb + .collection(collections.charts) + .insertMany([chart1, chart2, chart3]) + + const request = createRequestWithUser( + { + app: { locals: { appDb } }, + query: { sortBy: 'title', sortDirection: 'ASC' }, + }, + await UserModel.findOne(appDb, { uid: user.uid }) + ) + + const response = createResponse() + const { _id, icon: _icon, ...restOfUser } = user + + await chartsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: [ + { + ...chart3, + chartOwner: restOfUser, + favorite: true, + chart_id: chart3._id.toString(), + }, + { + ...chart2, + chartOwner: restOfUser, + favorite: false, + chart_id: chart2._id.toString(), + }, + { + ...chart1, + chartOwner: restOfUser, + favorite: false, + chart_id: chart1._id.toString(), + }, + ], + }) + }) + + it('returns a list of charts that match the search query, the results are sorted by favorites first then title', async () => { + const [chart1, chart2, chart3] = [ + createChart({ + _id: new ObjectId(), + title: 'recent chart', + assessment: 'EEG', + variable: 'Rating', + owner: 'owl', + }), + createChart({ + _id: new ObjectId(), + assessment: 'EEG Drive', + variable: 'drtive', + owner: 'owl', + title: 'all charts', + }), + createChart({ + _id: new ObjectId(), + title: 'recent chart', + assessment: 'Foo', + variable: 'Rating', + owner: 'anotherUser', + sharedWith: ['owl'], + }), + ] + const { user, anotherUser } = { + user: createUser({ + uid: 'owl', + favoriteCharts: [chart3._id.toString()], + }), + anotherUser: createUser({ + uid: 'anotherUser', + }), + } + const { _id, icon: _icon, ...restOfUser } = user + const { _id: _x, icon: _icon2, ...restOfanotherUser } = anotherUser + + await appDb + .collection(collections.users) + .insertMany([user, anotherUser]) + await appDb + .collection(collections.charts) + .insertMany([chart1, chart2, chart3]) + + const request = createRequestWithUser( + { + app: { locals: { appDb } }, + query: { search: 'recent', sortBy: 'title', sortDirection: 'ASC' }, + }, + await UserModel.findOne(appDb, { uid: user.uid }) + ) + const response = createResponse() + + await chartsController.index(request, response) + + expect(response.json).toHaveBeenCalledWith({ + data: [ + { + ...chart3, + chartOwner: restOfanotherUser, + favorite: true, + chart_id: chart3._id.toString(), + }, + { + ...chart1, + chartOwner: restOfUser, + favorite: false, + chart_id: chart1._id.toString(), + }, + ], + }) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const request = createRequestWithUser() + const response = createResponse() + + request.app.locals.appDb.findOne.mockRejectedValueOnce( + new Error('Rejected error message') + ) + + await chartsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'Rejected error message', + }) + }) + }) + }) + + describe('destroy', () => { + describe('When successful', () => { + let appDb + let user + const chart_id = new ObjectId() + + beforeAll(async () => { + user = createUser({ + uid: 'owl', + preferences: {}, + access: ['YA', 'LA', 'MA'], + }) + appDb = await global.MONGO_INSTANCE.db('chartsDestroy') + + await appDb.collection(collections.charts).insertOne( + createChart( + { + _id: chart_id, + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + ) + await appDb.collection(collections.users).insertOne(user) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + it('returns a status of 204', async () => { + const request = createRequestWithUser( + { + params: { chart_id: chart_id.toString() }, + app: { locals: { appDb } }, + }, + { uid: 'owl' } + ) + const response = createResponse() + + await chartsController.destroy(request, response) + + expect(response.status).toHaveBeenCalledWith(204) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const params = { chart_id: 'some-id' } + const request = createRequestWithUser(params, { uid: 'user-id' }) + const response = createResponse() + + request.app.locals.appDb.findOne.mockResolvedValueOnce({ + owner: 'user-id', + }) + request.app.locals.appDb.deleteOne.mockRejectedValueOnce( + new Error('Some error') + ) + + await chartsController.destroy(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'Some error', + }) + }) + }) + }) + + describe('show', () => { + describe('When successful', () => { + let appDb + let user + const chart_id = new ObjectId() + + beforeAll(async () => { + user = createUser({ + uid: 'owl', + preferences: {}, + access: ['YA', 'LA', 'MA'], + }) + appDb = await global.MONGO_INSTANCE.db('chartsShow') + + await appDb.collection(collections.charts).insertOne( + createChart( + { + _id: chart_id, + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + ) + await appDb.collection(collections.users).insertOne(user) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + it('returns a status of 200 and a chart', async () => { + const userOverrides = { access: ['YA', 'CA'], uid: 'owl' } + const request = createRequestWithUser( + { + app: { locals: { appDb } }, + params: { chart_id: chart_id.toString() }, + }, + userOverrides + ) + const response = createResponse() + + await chartsController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: { + _id: chart_id, + assessment: 'eeg', + description: 'Participant EEG Measurements', + fieldLabelValueMap: [ + { + color: '#e2860a', + label: 'Foo', + targetValues: { + CA: '', + LA: '3', + MA: '3', + YA: '3', + }, + value: 'foo', + }, + { + color: 'red', + label: 'Bar', + targetValues: { + CA: '', + LA: '2', + MA: '2', + YA: '1', + }, + value: 'bar', + }, + ], + owner: 'owl', + public: false, + title: 'Eeg Measurements', + variable: 'eeg', + }, + }) + }) + }) + describe('When unsucessful', () => { + it('returns a status of 400 and an error message', async () => { + const params = { chart_id: 'chart-id' } + const request = createRequestWithUser(params) + const response = createResponse() + + request.app.locals.appDb.findOne.mockRejectedValueOnce( + new Error('some error') + ) + + await chartsController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + }) + + describe('update', () => { + describe('When successful', () => { + let appDb + let user + const chart_id = new ObjectId() + + beforeAll(async () => { + user = createUser({ + uid: 'owl', + preferences: {}, + access: ['YA', 'LA', 'MA'], + }) + appDb = await global.MONGO_INSTANCE.db('chartsUpdate') + + await appDb.collection(collections.charts).insertOne( + createChart( + { + _id: chart_id, + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + ) + await appDb.collection(collections.users).insertOne(user) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + it('returns a status of 200 and an updated chart', async () => { + const params = { chart_id: chart_id.toString() } + const body = createChart( + { + title: 'New Title', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + const request = createRequestWithUser({ + app: { locals: { appDb } }, + params, + body, + }) + const response = createResponse() + + await chartsController.update(request, response) + const updatedChart = await appDb + .collection(collections.charts) + .findOne({ + _id: chart_id, + }) + + expect(response.status).toHaveBeenCalledWith(200) + expect(updatedChart.title).toEqual('New Title') + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const params = { chart_id: new ObjectId().toString() } + const body = { + title: 'New title', + variable: 'Rating', + assessment: 'EEGquick', + description: 'EEG Rating', + public: false, + } + const request = createRequestWithUser({ + params, + body, + }) + const response = createResponse() + + request.app.locals.appDb.findOneAndUpdate.mockRejectedValueOnce( + new Error('Chart not found error') + ) + + await chartsController.update(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'Chart not found error', + }) + }) + }) + }) +}) diff --git a/server/controllers/chartsController/index.js b/server/controllers/chartsController/index.js new file mode 100644 index 00000000..58799365 --- /dev/null +++ b/server/controllers/chartsController/index.js @@ -0,0 +1,147 @@ +import { ObjectId } from 'mongodb' + +import ChartsModel from '../../models/ChartsModel' +import UserModel, { userMongoProjection } from '../../models/UserModel' +import { defaultTargetValueMap } from '../../utils/defaultTargetValueMap' + +const chartsController = { + create: async (req, res) => { + try { + const { + fieldLabelValueMap, + title, + variable, + assessment, + description, + public: isPublic, + } = req.body + const { appDb } = req.app.locals + + const { insertedId } = await ChartsModel.create(appDb, { + title, + variable, + assessment, + description, + fieldLabelValueMap, + public: isPublic, + owner: req.user.uid, + }) + + return res.status(200).json({ data: { chart_id: insertedId } }) + } catch (error) { + return res.status(400).json({ message: error.message }) + } + }, + index: async (req, res) => { + try { + const chartList = [] + const { appDb } = req.app.locals + const parsedQueryParams = Object.keys(req.query).length + ? req.query + : undefined + + const currentUser = await UserModel.findOne(appDb, { uid: req.user.uid }) + const chartListCursor = await ChartsModel.all( + appDb, + currentUser, + parsedQueryParams + ) + + while (await chartListCursor.hasNext()) { + const chart = await chartListCursor.next() + + chart.chartOwner = await UserModel.findOne( + appDb, + { uid: chart.owner }, + { ...userMongoProjection, icon: 0 } + ) + + chartList.push(chart) + } + + return res.status(200).json({ data: chartList }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + destroy: async (req, res) => { + try { + const { chart_id } = req.params + const { appDb } = req.app.locals + const { owner } = await ChartsModel.show(appDb, { + _id: new ObjectId(chart_id), + }) + + if (owner !== req.user.uid) + return res + .status(422) + .json({ message: 'Only the owner can delete a chart' }) + + await ChartsModel.destroy(appDb, chart_id) + + return res.status(204).end() + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + show: async (req, res) => { + try { + const { appDb } = req.app.locals + const { chart_id } = req.params + const { access } = req.user + const chart = await ChartsModel.show(appDb, { + _id: new ObjectId(chart_id), + owner: req.user.uid, + }) + + if (!chart) return res.status(400).json({ error: 'Chart not found.' }) + + const targetValuesMap = defaultTargetValueMap(access) + chart.fieldLabelValueMap = chart.fieldLabelValueMap.map((fieldValue) => { + const updateTargetValues = { + ...targetValuesMap, + ...fieldValue.targetValues, + } + fieldValue.targetValues = updateTargetValues + + return fieldValue + }) + + return res.status(200).json({ data: chart }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + update: async (req, res) => { + try { + const { appDb } = req.app.locals + const { chart_id } = req.params + const { + title, + variable, + assessment, + description, + fieldLabelValueMap, + public: isPublic, + } = req.body + const value = await ChartsModel.update( + appDb, + { _id: new ObjectId(chart_id) }, + { + title, + variable, + assessment, + description, + fieldLabelValueMap, + public: isPublic, + } + ) + + return res.status(200).json({ data: value }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, +} + +export default chartsController diff --git a/server/controllers/chartsDataController/chartsDataController.test.js b/server/controllers/chartsDataController/chartsDataController.test.js new file mode 100644 index 00000000..d8bec897 --- /dev/null +++ b/server/controllers/chartsDataController/chartsDataController.test.js @@ -0,0 +1,213 @@ +import { ObjectId } from 'mongodb' + +import chartsDataController from '.' +import { + createChart, + createRequestWithUser, + createResponse, + createUser, + createFieldLabelValue, +} from '../../../test/fixtures' +import { + chartsDataFilterResponse, + chartsDataInitialResponse, + chartsDataSuccessResponse, + dayDataAssessments, +} from '../../../test/testUtils' +import { collections } from '../../utils/mongoCollections' + +describe('chartsDataController', () => { + describe(chartsDataController.show, () => { + describe('when successful', () => { + let appDb + let user + let chart_id + + beforeAll(async () => { + user = createUser({ + uid: 'owl', + preferences: {}, + access: ['YA', 'LA', 'MA'], + }) + chart_id = new ObjectId() + appDb = await global.MONGO_INSTANCE.db('chartsData') + + await appDb.collection(collections.charts).insertOne( + createChart( + { + _id: chart_id, + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + ) + await appDb.collection(collections.users).insertOne(user) + await appDb + .collection(collections.assessmentDayData) + .insertMany(dayDataAssessments) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + + test('When all filters are deselected, create a graph object with assessment data counts of a specific variable, assessment value combination', async () => { + const request = createRequestWithUser( + { + app: { locals: { appDb } }, + params: { chart_id: chart_id.toString() }, + query: { + filters: { + chrcrit_part: { + HC: { label: 'HC', value: '0' }, + CHR: { label: 'CHR', value: '0' }, + Missing: { label: 'Missing', value: '0' }, + }, + sex_at_birth: { + Male: { label: 'Male', value: '0' }, + Female: { label: 'Female', value: '0' }, + Missing: { label: 'Missing', value: '0' }, + }, + sites: { + YA: { label: 'YA', value: '1' }, + LA: { label: 'LA', value: '1' }, + MA: { label: 'MA', value: '1' }, + }, + recruitment_status: { + 'Not recruited': { + label: 'Not Recruited', + value: '0', + }, + Recruited: { + label: 'Recruited', + value: '0', + }, + }, + networks: { + PRESCIENT: { label: 'PRESCIENT', value: '0' }, + ProNET: { label: 'ProNET', value: '0' }, + }, + }, + }, + }, + user + ) + const response = createResponse() + + await chartsDataController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: chartsDataSuccessResponse({ + chart_id: chart_id.toString(), + }), + }) + }) + + test('When data is requested for the first time, the initial filters are applied to the data', async () => { + const request = createRequestWithUser( + { + app: { locals: { appDb } }, + params: { chart_id: chart_id.toString() }, + }, + user + ) + const response = createResponse() + + await chartsDataController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: chartsDataInitialResponse({ + chart_id: chart_id.toString(), + }), + }) + }) + it('returns data when a user selects a specific filter', async () => { + const request = createRequestWithUser( + { + app: { locals: { appDb } }, + params: { chart_id: chart_id.toString() }, + query: { + filters: { + chrcrit_part: { + HC: { label: 'HC', value: '0' }, + CHR: { label: 'CHR', value: '0' }, + Missing: { label: 'Missing', value: '0' }, + }, + recruitment_status: { + 'Not recruited': { + label: 'Not Recruited', + value: '1', + }, + Recruited: { + label: 'Recruited', + value: '0', + }, + }, + sex_at_birth: { + Male: { label: 'Male', value: '1' }, + Female: { label: 'Female', value: '0' }, + Missing: { label: 'Missing', value: '0' }, + }, + sites: { + YA: { label: 'YA', value: '1' }, + LA: { label: 'LA', value: '1' }, + MA: { label: 'MA', value: '1' }, + }, + networks: { + PRESCIENT: { label: 'PRESCIENT', value: '0' }, + ProNET: { label: 'ProNET', value: '0' }, + }, + }, + }, + }, + user + ) + const response = createResponse() + + await chartsDataController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: chartsDataFilterResponse({ + chart_id: chart_id.toString(), + }), + }) + }) + }) + describe('when unsuccessful', () => { + it('returns a status of 500 and a message', async () => { + const request = createRequestWithUser() + const response = createResponse() + + request.app.locals.appDb.findOne.mockRejectedValueOnce( + new Error('This is an error') + ) + + await chartsDataController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(500) + expect(response.send).toHaveBeenCalledWith({ + message: 'This is an error', + }) + }) + }) + }) +}) diff --git a/server/controllers/chartsDataController/index.js b/server/controllers/chartsDataController/index.js new file mode 100644 index 00000000..96f62b6f --- /dev/null +++ b/server/controllers/chartsDataController/index.js @@ -0,0 +1,78 @@ +import { ObjectId } from 'mongodb' + +import StudiesModel from '../../models/StudiesModel' +import UserModel from '../../models/UserModel' +import BarChartService from '../../services/BarChartService' +import BarChartTableService from '../../services/BarChartTableService' +import CsvService from '../../services/CSVService' +import FiltersService from '../../services/FiltersService' +import { collections } from '../../utils/mongoCollections' + +const show = async (req, res, next) => { + try { + const { appDb } = req.app.locals + const user = await UserModel.findOne(appDb, { uid: req.user.uid }) + const userSites = StudiesModel.sanitizeAndSort(user.access) + const { chart_id } = req.params + const filtersService = new FiltersService(req.query.filters, userSites) + const filters = filtersService.filters + const chart = await appDb.collection(collections.charts).findOne({ + _id: new ObjectId(chart_id), + }) + const chartService = new BarChartService(appDb, chart, filtersService) + const { processedDataBySite, studyTotals, labelMap } = + await chartService.createChart() + const dataBySite = + processedDataBySite.size > 0 + ? Array.from(processedDataBySite.values()) + : [] + const labels = Array.from(labelMap.values()) + const chartTableService = new BarChartTableService(dataBySite, labels) + const websiteTable = chartTableService.websiteTableData() + const chartOwner = await appDb.collection(collections.users).findOne( + { uid: chart.owner }, + { + projection: { + _id: 0, + display_name: 1, + icon: 1, + uid: 1, + }, + } + ) + + if (req.headers['content-type'] === 'text/csv') { + res.header('Content-Type', 'text/csv') + + const csvTableData = chartTableService.csvTableData() + const csvService = new CsvService(csvTableData) + const csvStream = csvService.toReadableStream().pipe(res) + csvStream.on('error', (err) => next(err)) + csvStream.on('end', () => res.end()) + + return res.send() + } + + const graph = { + chart_id, + dataBySite, + labels, + title: chart.title, + description: chart.description, + legend: chartService.legend(), + studyTotals, + filters, + chartOwner, + graphTable: websiteTable, + userSites, + lastModified: chart.updatedAt || '', + } + return res.status(200).json({ data: graph }) + } catch (err) { + return res.status(500).send({ message: err.message }) + } +} + +export default { + show, +} diff --git a/server/controllers/chartsDuplicateController/chartsDuplicateController.test.js b/server/controllers/chartsDuplicateController/chartsDuplicateController.test.js new file mode 100644 index 00000000..a26cb793 --- /dev/null +++ b/server/controllers/chartsDuplicateController/chartsDuplicateController.test.js @@ -0,0 +1,86 @@ +import { ObjectId } from 'mongodb' + +import chartsDuplicateController from '.' +import { + createChart, + createRequestWithUser, + createResponse, + createFieldLabelValue, +} from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +describe('chartsDuplicateController', () => { + describe('create', () => { + describe('When successful', () => { + let appDb + const chart = createChart( + { + _id: new ObjectId(), + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db('chartsDuplicate') + + await appDb.collection(collections.charts).insertOne(chart) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + it('returns status of 200 and the new chart id', async () => { + const body = { chart_id: chart._id.toString() } + const request = createRequestWithUser({ + body, + app: { locals: { appDb } }, + }) + const response = createResponse() + + await chartsDuplicateController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledTimes(1) + }) + }) + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const sourceChart = new ObjectId().toString() + const body = { chart_id: sourceChart } + const request = createRequestWithUser(body) + const response = createResponse() + + request.app.locals.appDb.findOne.mockResolvedValueOnce({ + _id: sourceChart, + }) + request.app.locals.appDb.insertOne.mockRejectedValueOnce( + new Error('error message') + ) + + await chartsDuplicateController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'error message', + }) + }) + }) + }) +}) diff --git a/server/controllers/chartsDuplicateController/index.js b/server/controllers/chartsDuplicateController/index.js new file mode 100644 index 00000000..8b79acaf --- /dev/null +++ b/server/controllers/chartsDuplicateController/index.js @@ -0,0 +1,28 @@ +import { ObjectId } from 'mongodb' + +import ChartsModel from '../../models/ChartsModel' + +const chartsDuplicateController = { + create: async (req, res) => { + try { + const { appDb } = req.app.locals + const { chart_id } = req.body + const { _id, ...rest } = await ChartsModel.show(appDb, { + _id: new ObjectId(chart_id), + }) + const { insertedId } = await ChartsModel.create(appDb, { + ...rest, + title: `${rest.title} (copy)`, + owner: req.user.uid, + public: false, + sharedWith: [], + }) + + return res.status(200).json({ data: insertedId }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, +} + +export default chartsDuplicateController diff --git a/server/controllers/chartsShareController/chartsShareController.test.js b/server/controllers/chartsShareController/chartsShareController.test.js new file mode 100644 index 00000000..607c382e --- /dev/null +++ b/server/controllers/chartsShareController/chartsShareController.test.js @@ -0,0 +1,97 @@ +import { ObjectId } from 'mongodb' + +import chartsShareController from '.' +import { + createChart, + createRequestWithUser, + createResponse, + createFieldLabelValue, +} from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +describe('chartsShareController', () => { + describe('create', () => { + describe('When successful', () => { + let appDb + const chart = createChart( + { + _id: new ObjectId(), + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + + beforeAll(() => { + appDb = global.MONGO_INSTANCE.db('chartsShare') + }) + beforeEach(async () => { + await appDb.collection(collections.charts).insertOne(chart) + }) + afterEach(async () => { + await appDb.collection('charts').drop() + }) + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('returns status of 200 and the new chart id', async () => { + const sharedWith = ['eagle'] + const body = { sharedWith } + const params = { chart_id: chart._id.toString() } + const request = createRequestWithUser( + { body, params, app: { locals: { appDb } } }, + { uid: 'owl' } + ) + const response = createResponse() + + await chartsShareController.create(request, response) + + const updatedChart = await appDb + .collection(collections.charts) + .findOne({ _id: chart._id }) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: updatedChart, + }) + }) + }) + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const sourceChart = new ObjectId().toString() + const sharedWith = ['owl', 'eagle'] + const body = { sharedWith } + const params = { chart_id: sourceChart } + const request = createRequestWithUser({ body, params }) + const response = createResponse() + + request.app.locals.appDb.findOneAndUpdate.mockRejectedValueOnce( + new Error('update error') + ) + + await chartsShareController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'Chart could not be shared', + }) + }) + }) + }) +}) diff --git a/server/controllers/chartsShareController/index.js b/server/controllers/chartsShareController/index.js new file mode 100644 index 00000000..579e18e1 --- /dev/null +++ b/server/controllers/chartsShareController/index.js @@ -0,0 +1,26 @@ +import { ObjectId } from 'mongodb' + +import ChartsModel from '../../models/ChartsModel' + +const chartsShareController = { + create: async (req, res) => { + try { + const { chart_id } = req.params + const { appDb } = req.app.locals + const { sharedWith } = req.body + const data = await ChartsModel.update( + appDb, + { _id: new ObjectId(chart_id) }, + { + sharedWith, + } + ) + + return res.status(200).json({ data }) + } catch { + return res.status(400).json({ error: 'Chart could not be shared' }) + } + }, +} + +export default chartsShareController diff --git a/server/controllers/configurationsController/configurationsController.test.js b/server/controllers/configurationsController/configurationsController.test.js new file mode 100644 index 00000000..754c24cd --- /dev/null +++ b/server/controllers/configurationsController/configurationsController.test.js @@ -0,0 +1,297 @@ +import { ObjectId } from 'mongodb' + +import ConfigurationsController from '.' +import { + createRequestWithUser, + createResponse, + createConfiguration, + createUser, +} from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +describe('ConfigurationsController', () => { + describe(ConfigurationsController.create, () => { + const newConfiguration = { body: { name: 'new matrix', owner: 'owl' } } + + describe('When successful', () => { + const request = createRequestWithUser(newConfiguration) + const response = createResponse() + + it('sends a status of 200 with a data property when successful', async () => { + const insertedConfiguration = createConfiguration() + + request.app.locals.appDb.insertOne.mockResolvedValueOnce({ + insertedCount: 1, + insertedId: 'eagle', + }) + request.app.locals.appDb.findOne.mockResolvedValueOnce( + insertedConfiguration + ) + + await ConfigurationsController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: insertedConfiguration, + }) + }) + }) + + describe('When unsuccessful', () => { + it('sends a status of 400 with a message when database there is an error', async () => { + const request = createRequestWithUser(newConfiguration) + const response = createResponse() + + request.app.locals.appDb.insertOne.mockRejectedValueOnce( + new Error('Rejected error message') + ) + + await ConfigurationsController.create(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'Rejected error message', + }) + }) + }) + }) + + describe(ConfigurationsController.update, () => { + const configAttributes = { body: { name: 'new matrix', owner: 'owl' } } + + describe('When successful', () => { + it('sends a status of 200 and with a data payload', async () => { + const request = createRequestWithUser(configAttributes) + const response = createResponse() + const updatedConfiguration = createConfiguration({ + owner: 'owl', + type: 'new matrix ', + }) + + request.app.locals.appDb.findOneAndUpdate.mockResolvedValueOnce( + updatedConfiguration + ) + + await ConfigurationsController.update(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: updatedConfiguration, + }) + }) + }) + + describe('When unsuccessful', () => { + it('sends a status of 422 with a message when database there is an error', async () => { + const request = createRequestWithUser(configAttributes) + const response = createResponse() + + request.app.locals.appDb.findOneAndUpdate.mockRejectedValueOnce( + new Error('mocked error') + ) + + await ConfigurationsController.update(request, response) + + expect(response.status).toHaveBeenCalledWith(422) + expect(response.json).toHaveBeenCalledWith({ + error: 'mocked error', + }) + }) + }) + }) + + describe(ConfigurationsController.index, () => { + const params = { uid: 'owl' } + + describe('When successful', () => { + let appDb + let user + const [activeConfig, draftConfig, activeConfig2, legacyConfiguration] = [ + createConfiguration({ _id: new ObjectId() }), + createConfiguration({ _id: new ObjectId(), status: 0 }), + createConfiguration({ + _id: new ObjectId(), + readers: ['owl', 'eagle'], + owner: 'eagle', + }), + { + _id: new ObjectId(), + owner: 'eagle', + config: {}, + type: 'matrix', + created: 'Mon, 12 June 2023', + readers: ['owl', 'eagle'], + }, + ] + beforeAll(async () => { + user = createUser({ + uid: 'owl', + preferences: {}, + access: ['YA', 'LA', 'MA'], + display_name: 'Owl Owlson', + }) + const secondUser = createUser({ + uid: 'eagle', + preferences: {}, + access: ['YA', 'LA', 'MA'], + display_name: 'Eagle Eagleson', + }) + + appDb = await global.MONGO_INSTANCE.db('configData') + + await appDb + .collection(collections.configs) + .insertMany([ + activeConfig, + draftConfig, + activeConfig2, + legacyConfiguration, + ]) + await appDb.collection(collections.users).insertMany([user, secondUser]) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('returns a status of 200 and an array of all configurations', async () => { + const result = [ + createConfiguration({ + ...activeConfig, + owner_display_name: 'Owl Owlson', + }), + createConfiguration({ + ...draftConfig, + owner_display_name: 'Owl Owlson', + }), + createConfiguration({ + ...activeConfig2, + owner_display_name: 'Eagle Eagleson', + }), + { + ...legacyConfiguration, + owner_display_name: 'Eagle Eagleson', + }, + ] + const request = createRequestWithUser({ + app: { locals: { appDb } }, + params, + user, + }) + const response = createResponse() + + await ConfigurationsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: result, + }) + }) + + it('returns a status of 200 and an array of only published/active configurations', async () => { + const result = [ + createConfiguration({ + ...activeConfig, + owner_display_name: 'Owl Owlson', + }), + createConfiguration({ + ...activeConfig2, + owner_display_name: 'Eagle Eagleson', + }), + { + ...legacyConfiguration, + owner_display_name: 'Eagle Eagleson', + }, + ] + const request = createRequestWithUser({ + app: { locals: { appDb } }, + params, + query: { status: 'active' }, + user, + }) + const response = createResponse() + + await ConfigurationsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: result, + }) + }) + }) + }) + + describe(ConfigurationsController.destroy, () => { + const params = { config_id: 'matrix-config' } + + describe('When successful', () => { + it('returns a status of 200 and a json with a data property', async () => { + const request = createRequestWithUser(params) + const response = createResponse() + + request.app.locals.appDb.deleteOne.mockResolvedValueOnce({ + deletedCount: 1, + }) + + await ConfigurationsController.destroy(request, response) + + expect(response.status).toHaveBeenCalledWith(204) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message property when there is an error', async () => { + const request = createRequestWithUser(params) + const response = createResponse() + + request.app.locals.appDb.deleteOne.mockRejectedValueOnce( + new Error('destroy error') + ) + + await ConfigurationsController.destroy(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'destroy error', + }) + }) + }) + }) + describe(ConfigurationsController.findOne, () => { + describe('When successful', () => { + it('sends a status of 200 with a data property when successful', async () => { + const config = createConfiguration() + const params = { config_id: '1' } + const request = createRequestWithUser(params) + const response = createResponse() + + request.app.locals.appDb.findOne.mockResolvedValueOnce(config) + + await ConfigurationsController.findOne(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: config, + }) + }) + }) + + describe('When unsuccessful', () => { + it('sends a status of 400 with a message when database there is an error', async () => { + const request = createRequestWithUser() + const response = createResponse() + + request.app.locals.appDb.findOne.mockRejectedValueOnce( + new Error('Rejected error message') + ) + + await ConfigurationsController.findOne(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'Rejected error message', + }) + }) + }) + }) +}) diff --git a/server/controllers/configurationsController/index.js b/server/controllers/configurationsController/index.js new file mode 100644 index 00000000..2f72de8c --- /dev/null +++ b/server/controllers/configurationsController/index.js @@ -0,0 +1,105 @@ +import { ObjectId } from 'mongodb' + +import ConfigModel from '../../models/ConfigModel' +import UserModel from '../../models/UserModel' + +const ConfigurationsController = { + create: async (req, res) => { + try { + const { appDb } = req.app.locals + const newConfiguration = await ConfigModel.create(appDb, { + ...req.body, + createdAt: new Date(), + updatedAt: new Date(), + }) + + return res.status(200).json({ data: newConfiguration }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + destroy: async (req, res) => { + try { + const { appDb } = req.app.locals + const { config_id } = req.params + await ConfigModel.destroy(appDb, config_id) + + return res.status(204).end() + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + findOne: async (req, res) => { + try { + const { appDb } = req.app.locals + const { config_id } = req.params + const currentConfig = await ConfigModel.findOne(appDb, { + _id: new ObjectId(config_id), + }) + return res.status(200).json({ data: currentConfig }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + update: async (req, res) => { + try { + const { appDb } = req.app.locals + const { config_id } = req.params + const updatedConfiguration = await ConfigModel.update(appDb, config_id, { + ...req.body, + updatedAt: new Date(), + }) + + return res.status(200).json({ data: updatedConfiguration }) + } catch (error) { + return res.status(422).json({ error: error.message }) + } + }, + index: async (req, res) => { + const cachedUsers = new Map() + const dataSet = [] + const { appDb } = req.app.locals + const { uid } = req.params + const isActive = + Object.hasOwn(req.query, 'status') && req.query.status === 'active' + const streamConfigurations = isActive + ? await ConfigModel.active(appDb, uid) + : await ConfigModel.all(appDb, uid) + + streamConfigurations.on('data', async (config) => { + streamConfigurations.pause() + + const isUserCached = cachedUsers.has(config.owner) + + if (isUserCached) { + const configOwner = cachedUsers.get(config.owner) + + dataSet.push({ ...config, owner_display_name: configOwner }) + } else { + const configOwner = await UserModel.findOne( + appDb, + { uid: config.owner }, + { display_name: 1 } + ) + + cachedUsers.set(config.owner, configOwner.display_name) + dataSet.push({ + ...config, + owner_display_name: configOwner.display_name, + }) + } + + streamConfigurations.resume() + }) + + await new Promise((resolve, reject) => { + streamConfigurations.on('end', () => resolve()) + + streamConfigurations.on('error', (err) => reject(err)) + }) + + return res.status(200).json({ data: dataSet }) + }, +} + +export default ConfigurationsController diff --git a/server/controllers/dashboardController/dashboardController.test.js b/server/controllers/dashboardController/dashboardController.test.js new file mode 100644 index 00000000..3a31aecc --- /dev/null +++ b/server/controllers/dashboardController/dashboardController.test.js @@ -0,0 +1,213 @@ +import { ObjectId } from 'mongodb' + +import DashboardsController from '.' +import { + createConfiguration, + createRequestWithUser, + createResponse, + createUser, + createAnalysisConfig, + createParticipantDayData, +} from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +describe('Dashboard Controller', () => { + describe(DashboardsController.show, () => { + describe('When successful', () => { + let appDb + let user + const configAnalysisData = [ + createAnalysisConfig({ + label: 'Jump', + analysis: 'jump_of', + variable: 'jumpVariable', + category: 'power', + }), + createAnalysisConfig({ + label: 'Size', + analysis: 'size_of', + variable: 'sizeVariable', + category: 'sizeing', + }), + ] + const newConfiguration = createConfiguration({ + _id: new ObjectId(), + config: { + 0: configAnalysisData, + }, + }) + const dataOne = { + study: 'YA', + assessment: 'jump_of', + participant: 'YA01', + dayData: [ + createParticipantDayData({ + day: 10, + jumpVariable: 1, + }), + createParticipantDayData({ + day: 20, + jumpVariable: 30, + }), + ], + } + const dataTwo = { + study: 'YA', + participant: 'YA01', + assessment: 'size_of', + dayData: [ + createParticipantDayData({ + day: 1, + sizeVariable: 30, + }), + createParticipantDayData({ + day: 45, + sizeVariable: 2, + }), + ], + } + + beforeAll(async () => { + user = createUser({ + uid: 'owl', + preferences: { + config: newConfiguration._id.toString(), + }, + access: ['YA', 'LA', 'MA'], + }) + appDb = await global.MONGO_INSTANCE.db('matrix') + await appDb.collection(collections.configs).insertOne(newConfiguration) + await appDb + .collection(collections.assessmentDayData) + .insertMany([dataOne, dataTwo]) + await appDb.collection(collections.users).insertOne(user) + await appDb.collection(collections.metadata).insertOne({ + study: 'YA', + participants: [ + { participant: 'YA01', Consent: new Date('2022-02-26') }, + ], + }) + }) + afterAll(async () => await appDb.dropDatabase()) + + it('returns a status of 200 and a user object', async () => { + const study = 'YA' + const subject = 'YA01' + const params = { + study, + subject, + } + const request = createRequestWithUser( + { app: { locals: { appDb } }, params }, + user + ) + const response = createResponse() + + await DashboardsController.show(request, response) + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: { + graph: { + configurations: [ + { + analysis: 'jump_of', + category: 'power', + color: [], + label: 'Jump', + range: [], + variable: 'jumpVariable', + }, + { + analysis: 'size_of', + category: 'sizeing', + color: [], + label: 'Size', + range: [], + variable: 'sizeVariable', + }, + ], + consentDate: new Date('2022-02-26T00:00:00.000Z'), + matrixData: [ + { + analysis: 'jump_of', + category: 'power', + color: [], + data: [ + { + day: 10, + jumpVariable: 1, + }, + { + day: 20, + jumpVariable: 30, + }, + ], + label: 'Jump', + range: [], + stat: [ + { + max: 30, + mean: 15.5, + min: 1, + }, + ], + variable: 'jumpVariable', + }, + { + analysis: 'size_of', + category: 'sizeing', + color: [], + data: [ + { + day: 1, + sizeVariable: 30, + }, + { + day: 45, + sizeVariable: 2, + }, + ], + label: 'Size', + range: [], + stat: [ + { + max: 30, + mean: 16, + min: 2, + }, + ], + variable: 'sizeVariable', + }, + ], + }, + subject: { + project: 'YA', + sid: 'YA01', + }, + }, + }) + }) + }) + describe('When unsuccessful', () => { + it('returns a status of 500 and an error', async () => { + const study = 'studyA' + const subject = 'subjectA' + const params = { + study, + subject, + } + const request = createRequestWithUser({ params }) + const response = createResponse() + + request.app.locals.appDb.findOne.mockImplementation(() => { + throw new Error('some error') + }) + + await DashboardsController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(500) + expect(response.json).toHaveBeenCalledWith({ message: 'some error' }) + }) + }) + }) +}) diff --git a/server/controllers/dashboardController/index.js b/server/controllers/dashboardController/index.js new file mode 100644 index 00000000..8dcdc02c --- /dev/null +++ b/server/controllers/dashboardController/index.js @@ -0,0 +1,44 @@ +import { ObjectId } from 'mongodb' + +import ConfigModel from '../../models/ConfigModel' +import UserModel from '../../models/UserModel' +import DashboardService from '../../services/DashboardService' + +const DashboardsController = { + show: async (req, res) => { + try { + const { appDb } = req.app.locals + const { study, subject } = req.params + const user = await UserModel.findOne(appDb, { uid: req.user.uid }) + const userConfigurationQuery = { + _id: new ObjectId(user.preferences.config), + } + const config = await ConfigModel.findOne(appDb, userConfigurationQuery) + const flatConfig = Object.values(config.config).flat() + + const { createMatrix, consentDate } = new DashboardService( + appDb, + study, + subject, + flatConfig + ) + const participantConsentDate = await consentDate() + const matrixData = await createMatrix() + + return res.status(200).json({ + data: { + subject: { sid: subject, project: study }, + graph: { + matrixData, + configurations: flatConfig, + consentDate: participantConsentDate, + }, + }, + }) + } catch (err) { + return res.status(500).json({ message: err.message }) + } + }, +} + +export default DashboardsController diff --git a/server/controllers/participantsController/index.js b/server/controllers/participantsController/index.js new file mode 100644 index 00000000..8118cce8 --- /dev/null +++ b/server/controllers/participantsController/index.js @@ -0,0 +1,26 @@ +import { DEFAULT_PARTICIPANTS_SORT } from '../../constants' +import ParticipantsModel from '../../models/ParticipantsModel' +import UserModel from '../../models/UserModel' + +const ParticipantsController = { + index: async (req, res) => { + try { + const { appDb } = req.app.locals + const parsedQueryParams = Object.keys(req.query).length + ? req.query + : DEFAULT_PARTICIPANTS_SORT + const user = await UserModel.findOne(appDb, { uid: req.user.uid }) + const participants = await ParticipantsModel.index( + appDb, + user, + parsedQueryParams + ) + + return res.status(200).json({ data: participants }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, +} + +export default ParticipantsController diff --git a/server/controllers/participantsController/participantsController.test.js b/server/controllers/participantsController/participantsController.test.js new file mode 100644 index 00000000..f059a133 --- /dev/null +++ b/server/controllers/participantsController/participantsController.test.js @@ -0,0 +1,385 @@ +import ParticipantsController from './' +import { + createRequestWithUser, + createResponse, + createUser, + createMetadataParticipant, + createAssessmentDayData, +} from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +describe('ParticipantsController', () => { + describe(ParticipantsController.index, () => { + describe('When successful', () => { + let appDb + + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db('participants') + }) + beforeEach(async () => { + await appDb.createCollection(collections.metadata) + await appDb.createCollection(collections.users) + await appDb.createCollection(collections.assessmentDayData) + }) + + afterEach(async () => { + await appDb.collection(collections.users).drop() + await appDb.collection(collections.metadata).drop() + await appDb.collection(collections.assessmentDayData).drop() + }) + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('returns a status of 200 and a list of participants that are sorted by users favorites then participant in ascending order ', async () => { + const user = createUser({ + uid: 'owl', + name: 'Eaurasian Eagle Owl', + access: ['CA', 'YA'], + preferences: { + star: { YA: ['YA00037', 'YA0015'] }, + complete: { CA: ['CA00063'] }, + }, + }) + + await appDb.collection(collections.users).insertOne(user) + await appDb.collection(collections.metadata).insertMany([ + { + study: 'CA', + participants: [ + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'CA00063', + synced: new Date('07/28/2022'), + study: 'CA', + daysInStudy: 49, + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'CA00064', + synced: new Date('2022-06-24'), + study: 'CA', + daysInStudy: 15, + }), + ], + }, + { + study: 'YA', + participants: [ + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA00037', + synced: new Date('07/28/2022'), + study: 'YA', + daysInStudy: 49, + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA29023', + synced: new Date('07/28/2022'), + study: 'YA', + daysInStudy: 49, + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA00015', + synced: new Date('07/28/2022'), + study: 'YA', + daysInStudy: 49, + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA01508', + synced: new Date('07/28/2022'), + study: 'YA', + daysInStudy: 49, + }), + ], + }, + ]) + await appDb.collection(collections.assessmentDayData).insertMany([ + createAssessmentDayData({ + study: 'CA', + participant: 'CA00063', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'CA', + participant: 'CA00064', + dayData: [ + { + day: 15, + }, + ], + }), + createAssessmentDayData({ + study: 'YA', + participant: 'YA00037', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'YA', + participant: 'YA29023', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'YA', + participant: 'YA00015', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'YA', + participant: 'YA01508', + dayData: [ + { + day: 49, + }, + ], + }), + ]) + + const request = createRequestWithUser( + { + app: { locals: { appDb } }, + }, + user + ) + const response = createResponse() + + const result = [ + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA00037', + synced: new Date('07/28/2022'), + study: 'YA', + complete: false, + daysInStudy: 49, + star: true, + }), + createMetadataParticipant({ + participant: 'CA00063', + synced: new Date('07/28/2022'), + study: 'CA', + star: false, + Consent: new Date('2022-06-09'), + complete: true, + daysInStudy: 49, + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'CA00064', + synced: new Date('2022-06-24'), + study: 'CA', + complete: false, + daysInStudy: 15, + star: false, + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA00015', + synced: new Date('07/28/2022'), + study: 'YA', + complete: false, + daysInStudy: 49, + star: false, + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA01508', + synced: new Date('07/28/2022'), + study: 'YA', + complete: false, + daysInStudy: 49, + star: false, + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA29023', + synced: new Date('07/28/2022'), + study: 'YA', + complete: false, + daysInStudy: 49, + star: false, + }), + ] + + await ParticipantsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ data: result }) + }) + + it('returns a status of 200 and a list of participants by search query', async () => { + const user = createUser({ + uid: 'owl', + name: 'Eaurasian Eagle Owl', + access: ['CA', 'YA'], + preferences: { + star: { YA: ['YA00037', 'YA0015'] }, + complete: { CA: ['CA00063'] }, + }, + }) + const result = createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA29023', + synced: new Date('07/28/2022'), + study: 'YA', + daysInStudy: 49, + }) + + await appDb.collection(collections.users).insertOne(user) + await appDb.collection(collections.metadata).insertMany([ + { + study: 'CA', + participants: [ + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'CA00063', + synced: new Date('07/28/2022'), + study: 'CA', + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'CA00064', + synced: new Date('2022-06-24'), + study: 'CA', + }), + ], + }, + { + study: 'YA', + participants: [ + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA00037', + synced: new Date('07/28/2022'), + study: 'YA', + }), + + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA00015', + synced: new Date('07/28/2022'), + study: 'YA', + }), + createMetadataParticipant({ + Consent: new Date('2022-06-09'), + participant: 'YA01508', + synced: new Date('07/28/2022'), + study: 'YA', + }), + result, + ], + }, + ]) + await appDb.collection(collections.assessmentDayData).insertMany([ + createAssessmentDayData({ + study: 'CA', + participant: 'CA00063', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'CA', + participant: 'CA00064', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'YA', + participant: 'YA00037', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'YA', + participant: 'YA29023', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'YA', + participant: 'YA00015', + dayData: [ + { + day: 49, + }, + ], + }), + createAssessmentDayData({ + study: 'YA', + participant: 'YA01508', + dayData: [ + { + day: 49, + }, + ], + }), + ]) + const request = createRequestWithUser( + { + app: { locals: { appDb } }, + query: { + searchParticipants: ['YA29023'], + }, + }, + user + ) + const response = createResponse() + + await ParticipantsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: [{ ...result, complete: false, daysInStudy: 49, star: false }], + }) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const request = createRequestWithUser() + const response = createResponse() + + request.app.locals.appDb.findOne.mockImplementation(() => { + throw new Error('some error') + }) + + await ParticipantsController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + }) +}) diff --git a/server/controllers/studiesController/index.js b/server/controllers/studiesController/index.js new file mode 100644 index 00000000..cb4b463d --- /dev/null +++ b/server/controllers/studiesController/index.js @@ -0,0 +1,16 @@ +import StudiesModel from '../../models/StudiesModel' + +const studiesController = { + index: async (req, res) => { + try { + const { appDb } = req.app.locals + const studies = await StudiesModel.all(appDb) + + return res.status(200).json({ data: studies }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, +} + +export default studiesController diff --git a/server/controllers/studiesController/studiesController.test.js b/server/controllers/studiesController/studiesController.test.js new file mode 100644 index 00000000..da878fd0 --- /dev/null +++ b/server/controllers/studiesController/studiesController.test.js @@ -0,0 +1,40 @@ +import studiesController from '.' +import { createRequest, createResponse } from '../../../test/fixtures' + +describe('studiesController', () => { + describe(studiesController.index, () => { + describe('When successful', () => { + it('returns a status of 200 with a list of distinct studies', async () => { + const request = createRequest() + const response = createResponse() + const listOfStudies = ['YA', 'CA', 'LA'] + + request.app.locals.appDb.distinct.mockResolvedValueOnce(listOfStudies) + + await studiesController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: ['YA', 'CA', 'LA'], + }) + }) + }) + describe('When unsuccessful', () => { + it('returns a status of 400 with an error message', async () => { + const request = createRequest() + const response = createResponse() + + request.app.locals.appDb.distinct.mockRejectedValueOnce( + new Error('some error') + ) + + await studiesController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + }) +}) diff --git a/server/controllers/userStudiesController/index.js b/server/controllers/userStudiesController/index.js new file mode 100644 index 00000000..2e8def5b --- /dev/null +++ b/server/controllers/userStudiesController/index.js @@ -0,0 +1,31 @@ +import UserModel from '../../models/UserModel' +import UserStudiesModel from '../../models/UserStudiesModel' + +const userStudiesController = { + index: async (req, res) => { + try { + const { appDb } = req.app.locals + const isSortRequested = Object.hasOwn(req.query, 'sort') + const parsedSortParams = + isSortRequested && Object.keys(req.query.sort).length + ? req.query.sort + : { sortBy: 'study', sortDirection: 'ASC' } + const userAccess = await UserModel.findOne( + appDb, + { uid: req.user.uid }, + { access: 1 } + ) + const userStudies = await UserStudiesModel.all( + appDb, + userAccess.access, + parsedSortParams + ) + + return res.status(200).json({ data: userStudies }) + } catch (error) { + return res.status(400).json({ message: error.message }) + } + }, +} + +export default userStudiesController diff --git a/server/controllers/userStudiesController/userStudiesController.test.js b/server/controllers/userStudiesController/userStudiesController.test.js new file mode 100644 index 00000000..3206c4b8 --- /dev/null +++ b/server/controllers/userStudiesController/userStudiesController.test.js @@ -0,0 +1,126 @@ +import userStudiesController from '.' +import { + createResponse, + createRequestWithUser, + createUser, + createStudyTableRowData, +} from '../../../test/fixtures' +import { createStudies } from '../../../test/testUtils' +import { collections } from '../../utils/mongoCollections' + +describe('userStudiesController', () => { + describe(userStudiesController.index, () => { + describe('When successful', () => { + let appDb + let user + + beforeAll(async () => { + user = createUser({ + uid: 'owl', + preferences: {}, + access: ['YA', 'LA', 'MA'], + }) + + appDb = await global.MONGO_INSTANCE.db('studies') + + await appDb.collection(collections.users).insertOne(user) + await appDb.collection(collections.metadata).insertMany(createStudies()) + }) + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('returns a list of studies with the column properties to be displayed', async () => { + const response = createResponse() + const request = createRequestWithUser( + { + query: { sort: {} }, + app: { locals: { appDb } }, + }, + user + ) + const data = [ + createStudyTableRowData({ + daysInStudy: 655, + numOfParticipants: 2, + study: 'LA', + updatedAt: new Date('01-05-2024'), + }), + createStudyTableRowData({ + daysInStudy: 1005, + numOfParticipants: 2, + study: 'MA', + updatedAt: new Date('01-05-2024'), + }), + createStudyTableRowData({ + daysInStudy: 105, + numOfParticipants: 2, + study: 'YA', + updatedAt: new Date('01-05-2024'), + }), + ] + await userStudiesController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data, + }) + }) + + it('returns a list using default sort properties if sort property is missing', async () => { + const response = createResponse() + const request = createRequestWithUser( + { + query: {}, + app: { locals: { appDb } }, + }, + user + ) + const data = [ + createStudyTableRowData({ + daysInStudy: 655, + numOfParticipants: 2, + study: 'LA', + updatedAt: new Date('01-05-2024'), + }), + createStudyTableRowData({ + daysInStudy: 1005, + numOfParticipants: 2, + study: 'MA', + updatedAt: new Date('01-05-2024'), + }), + createStudyTableRowData({ + daysInStudy: 105, + numOfParticipants: 2, + study: 'YA', + updatedAt: new Date('01-05-2024'), + }), + ] + + await userStudiesController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data, + }) + }) + }) + describe('When unsuccessful', () => { + it('returns a status of 400 and an error', async () => { + const request = createRequestWithUser({ query: { sort: {} } }) + const response = createResponse() + + request.app.locals.appDb.findOne.mockRejectedValueOnce( + new Error('some error') + ) + + await userStudiesController.index(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + message: 'some error', + }) + }) + }) + }) +}) diff --git a/server/controllers/usersController/index.js b/server/controllers/usersController/index.js new file mode 100644 index 00000000..5f03bf83 --- /dev/null +++ b/server/controllers/usersController/index.js @@ -0,0 +1,30 @@ +import UserModel from '../../models/UserModel' + +const UsersController = { + edit: async (req, res) => { + try { + const { appDb } = req.app.locals + const { uid } = req.params + const updatedUser = await UserModel.update(appDb, uid, req.body) + + return res.status(200).json({ data: updatedUser }) + } catch (error) { + return res.status(400).json({ error: error.message }) + } + }, + show: async (req, res) => { + try { + const { appDb } = req.app.locals + const { uid } = req.params + const user = await UserModel.findOne(appDb, { uid }) + + return res.status(200).json({ data: user }) + } catch (error) { + return res.status(400).json({ + error: error.message, + }) + } + }, +} + +export default UsersController diff --git a/server/controllers/usersController/usersController.test.js b/server/controllers/usersController/usersController.test.js new file mode 100644 index 00000000..d83c99d1 --- /dev/null +++ b/server/controllers/usersController/usersController.test.js @@ -0,0 +1,105 @@ +import UsersController from '.' +import { + createRequestWithUser, + createResponse, + createUser, +} from '../../../test/fixtures' + +describe('UsersController', () => { + const params = { uid: 'owl' } + + describe(UsersController.show, () => { + describe('When successful', () => { + it('returns a status of 200 and a user object', async () => { + const request = createRequestWithUser({ params }) + const response = createResponse() + + request.app.locals.appDb.findOne.mockResolvedValue( + createUser({ + uid: 'owl', + name: 'Eaurasian Eagle Owl', + }) + ) + + await UsersController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: { + uid: 'owl', + name: 'Eaurasian Eagle Owl', + display_name: 'Display Name', + icon: 'icon', + }, + }) + }) + }) + + describe('When unsuccessful', () => { + it('returns a status of 400 and an error message', async () => { + const request = createRequestWithUser({ params }) + const response = createResponse() + + request.app.locals.appDb.findOne.mockImplementation(() => { + throw new Error('some error') + }) + + await UsersController.show(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'some error', + }) + }) + }) + }) + + describe(UsersController.edit, () => { + const body = { name: 'Eaurasian Eagle Owl' } + + describe('When successful', () => { + it('sends a status of 200 with a data result', async () => { + const request = createRequestWithUser({ params, body }) + const response = createResponse() + + request.app.locals.appDb.findOneAndUpdate.mockResolvedValueOnce( + createUser({ + name: 'Eaurasian Eagle Owl', + owner: 'owl', + }) + ) + + await UsersController.edit(request, response) + + expect(response.status).toHaveBeenCalledWith(200) + expect(response.json).toHaveBeenCalledWith({ + data: { + display_name: 'Display Name', + icon: 'icon', + name: 'Eaurasian Eagle Owl', + owner: 'owl', + uid: 'user-uid', + }, + }) + }) + }) + + describe('when unsuccessful', () => { + it('returns a 400 error with the error message', async () => { + const request = createRequestWithUser({ params, body }) + const response = createResponse() + + request.app.locals.appDb.findOneAndUpdate.mockRejectedValueOnce( + new Error('User could not be updated') + ) + + await UsersController.edit(request, response) + + expect(response.status).toHaveBeenCalledWith(400) + expect(response.json).toHaveBeenCalledWith({ + error: 'User could not be updated', + }) + }) + }) + }) +}) diff --git a/server/data_processors/BarChartDataProcessor/BarChartDataProcessor.test.js b/server/data_processors/BarChartDataProcessor/BarChartDataProcessor.test.js new file mode 100644 index 00000000..33709431 --- /dev/null +++ b/server/data_processors/BarChartDataProcessor/BarChartDataProcessor.test.js @@ -0,0 +1,164 @@ +import BarChartDataProcessor from '.' +import { createChart, createFieldLabelValue } from '../../../test/fixtures' +import { dayDataAssessments } from '../../../test/testUtils' +import { TOTALS_STUDY } from '../../constants' + +describe(BarChartDataProcessor, () => { + const chart = createChart( + { + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + const initialStudyTotals = { + [TOTALS_STUDY]: { count: 0, targetTotal: 0 }, + 'Site 1': { count: 0, targetTotal: undefined }, + 'Site 2': { count: 0, targetTotal: undefined }, + } + const participants = dayDataAssessments + + describe('.processData', () => { + it('returns processed data', async () => { + const service = new BarChartDataProcessor(chart, initialStudyTotals) + participants.forEach((doc) => service.processDocument(doc)) + + const processedData = service.processData() + const expectedLabelMap = { + Bar: { + color: 'red', + name: 'Bar', + }, + Foo: { + color: '#e2860a', + name: 'Foo', + }, + } + const expectedDataMap = { + 'Madrid-Bar-MA-2': 0, + 'Madrid-Foo-MA-3': 4, + 'Totals-Bar': 2, + 'Totals-Foo': 10, + 'UCLA-Bar-LA-2': 0, + 'UCLA-Foo-LA-3': 4, + 'Yale-Bar-YA-1': 2, + 'Yale-Foo-YA-3': 2, + } + const expectedProcessedDataBySite = { + Madrid: { + counts: { + Bar: 0, + Foo: 4, + 'N/A': 0, + }, + siteCode: 'MA', + name: 'Madrid', + percentages: { + Bar: 0, + Foo: 100, + 'N/A': 0, + }, + targets: { + Bar: 2, + Foo: 3, + }, + totalsForStudy: { + count: 4, + targetValue: '3', + }, + }, + Totals: { + counts: { + Bar: 2, + Foo: 10, + 'N/A': 0, + }, + siteCode: 'Totals', + name: 'Totals', + percentages: { + Bar: 16.666666666666664, + Foo: 83.33333333333334, + 'N/A': 0, + }, + targets: { + Bar: 5, + Foo: 9, + }, + totalsForStudy: { + count: 12, + targetTotal: 0, + }, + }, + UCLA: { + counts: { + Bar: 0, + Foo: 4, + 'N/A': 0, + }, + siteCode: 'LA', + name: 'UCLA', + percentages: { + Bar: 0, + Foo: 100, + 'N/A': 0, + }, + targets: { + Bar: 2, + Foo: 3, + }, + totalsForStudy: { + count: 4, + targetValue: '3', + }, + }, + Yale: { + counts: { + Bar: 2, + Foo: 2, + 'N/A': 0, + }, + siteCode: 'YA', + name: 'Yale', + percentages: { + Bar: 50, + Foo: 50, + 'N/A': 0, + }, + targets: { + Bar: 1, + Foo: 3, + }, + totalsForStudy: { + count: 4, + targetValue: '3', + }, + }, + } + + expect(processedData.processedDataBySite).toEqual( + new Map(Object.entries(expectedProcessedDataBySite)) + ) + expect(processedData.dataMap).toEqual( + new Map(Object.entries(expectedDataMap)) + ) + expect(processedData.labelMap).toEqual( + new Map(Object.entries(expectedLabelMap)) + ) + }) + }) +}) diff --git a/server/data_processors/BarChartDataProcessor/index.js b/server/data_processors/BarChartDataProcessor/index.js new file mode 100644 index 00000000..da48b10b --- /dev/null +++ b/server/data_processors/BarChartDataProcessor/index.js @@ -0,0 +1,257 @@ +import { EMPTY_VALUE, N_A, TOTALS_STUDY } from '../../constants' +import { SITE_NAMES } from '../../utils/siteNames' + +const studyCountsToPercentage = (studyCount, targetTotal) => { + if (!targetTotal || Number.isNaN(+studyCount) || Number.isNaN(+targetTotal)) + return 0 + + return (+studyCount / +targetTotal) * 100 +} + +const calculateTotalsTargetValue = (currentTargetCount, nextTargetCount) => + currentTargetCount ? +currentTargetCount + +nextTargetCount : +nextTargetCount + +const calculateStudySectionTargetValue = ( + studySectionTotalTarget, + studySectionTotalCount +) => { + if ( + !!studySectionTotalTarget && + studySectionTotalTarget > studySectionTotalCount + ) { + return +studySectionTotalTarget + } + + return +studySectionTotalCount || 0 +} + +class BarChartDataProcessor { + constructor(chart, studyTotals) { + this.chart = chart + this.studyTotals = studyTotals + this.labelMap = new Map() + this.dataMap = new Map() + } + + processDocument = (document) => { + this.chart.fieldLabelValueMap.forEach((fieldLabelValueMap) => { + this._processFieldLabelValueMap( + fieldLabelValueMap, + document.study, + document.dayData + ) + }) + } + + processData = () => { + this._postProcessData() + + if (this._isAnyTargetIncluded()) { + this.labelMap.set(N_A, { name: N_A, color: '#808080' }) + } + + return this + } + + _processFieldLabelValueMap = ( + fieldLabelValueMap, + study, + participantDayData + ) => { + const { color, label, value, targetValues } = fieldLabelValueMap + const targetValue = targetValues[study] + const siteName = SITE_NAMES[study] || study + const dataKey = `${siteName}-${label}-${study}-${targetValue}` + const totalsDataKey = `${TOTALS_STUDY}-${label}` + const isVariableValueEmpty = value === EMPTY_VALUE + const shouldCountParticipant = isVariableValueEmpty + ? participantDayData.every((day) => day[this.chart.variable] === value) + : participantDayData.some( + (dayData) => String(dayData[this.chart.variable]) === String(value) + ) + const participantVariableDayCount = + isVariableValueEmpty && shouldCountParticipant + ? 1 + : this.#calculateParticipantVariableDayCount(participantDayData, value) + + this.labelMap.set(label, { name: label, color }) + this._processData({ + shouldCountParticipant, + dataKey, + totalsDataKey, + variableCount: participantVariableDayCount, + }) + this._processTotals({ + shouldCountParticipant, + siteName, + targetValue, + variableCount: participantVariableDayCount, + }) + } + + #calculateParticipantVariableDayCount = ( + participantAssessmentDayData, + chartValue + ) => { + const isChartVariableNaN = isNaN(chartValue) + const variableValue = isChartVariableNaN ? chartValue : +chartValue + const participantsDayDataAndVariable = participantAssessmentDayData.filter( + (dayData) => dayData[this.chart.variable] === variableValue + ) + + return participantsDayDataAndVariable.length + } + + _processData = ({ + shouldCountParticipant, + dataKey, + totalsDataKey, + variableCount, + }) => { + if (shouldCountParticipant) { + const existingData = this.dataMap.get(dataKey) + const existingTotalsData = this.dataMap.get(totalsDataKey) + + if (existingData) { + this.dataMap.set(dataKey, existingData + variableCount) + } else { + this.dataMap.set(dataKey, variableCount) + } + + if (existingTotalsData) { + this.dataMap.set(totalsDataKey, existingTotalsData + variableCount) + } else { + this.dataMap.set(totalsDataKey, variableCount) + } + } else { + if (!this.dataMap.get(dataKey)) this.dataMap.set(dataKey, 0) + } + } + + _processTotals = ({ + shouldCountParticipant, + siteName, + targetValue, + variableCount, + }) => { + if (shouldCountParticipant) { + if (this.studyTotals[siteName]) { + this.studyTotals[siteName].count += variableCount + } else { + this.studyTotals[siteName] = { + count: variableCount, + targetValue, + } + } + this.studyTotals[TOTALS_STUDY].count += variableCount + } + } + + _postProcessData = () => { + const processedDataBySite = new Map() + const totalsValueTargets = {} + + for (const [key, count] of this.dataMap) { + const [siteName, valueLabel, study, targetValue] = key.split('-') + const totalsForStudy = this.studyTotals[siteName] + const totals = totalsForStudy.targetTotal || totalsForStudy.count + const percent = studyCountsToPercentage(count, totals) + const existingEntriesForStudy = processedDataBySite.get(siteName) + const targetValueAsNumber = +targetValue + const targetValueIsNaN = Number.isNaN(targetValueAsNumber) + const hasTargetValue = + !!targetValue && !targetValueIsNaN && siteName !== TOTALS_STUDY + const isTargetValueMissing = !targetValue && siteName !== TOTALS_STUDY + + if (hasTargetValue) { + totalsValueTargets[valueLabel] = calculateTotalsTargetValue( + totalsValueTargets[valueLabel], + targetValue + ) + } + + if (isTargetValueMissing) { + totalsValueTargets[valueLabel] = calculateTotalsTargetValue( + totalsValueTargets[valueLabel], + totalsForStudy.count + ) + } + + if (existingEntriesForStudy) { + processedDataBySite.set(siteName, { + ...existingEntriesForStudy, + counts: { + ...existingEntriesForStudy.counts, + [valueLabel]: count, + }, + percentages: { + ...existingEntriesForStudy.percentages, + [valueLabel]: percent, + }, + targets: { + ...existingEntriesForStudy.targets, + [valueLabel]: targetValueIsNaN ? undefined : +targetValueAsNumber, + }, + }) + } else { + processedDataBySite.set(siteName, { + name: siteName, + siteCode: study, + counts: { + [valueLabel]: count, + }, + totalsForStudy, + percentages: { + [valueLabel]: percent, + }, + targets: { + [valueLabel]: targetValueIsNaN ? undefined : +targetValueAsNumber, + }, + }) + } + } + + for (const [study, values] of processedDataBySite) { + const { targetTotal, count: currentSiteCount } = this.studyTotals[study] + const isTargetGreaterThanCount = + targetTotal && targetTotal > currentSiteCount + const count = isTargetGreaterThanCount + ? targetTotal - currentSiteCount + : 0 + const studySectionTargetValue = calculateStudySectionTargetValue( + targetTotal, + currentSiteCount + ) + const percent = studyCountsToPercentage(count, studySectionTargetValue) + + processedDataBySite.set(study, { + ...values, + counts: { + ...values.counts, + [N_A]: count, + }, + percentages: { + ...values.percentages, + [N_A]: percent, + }, + }) + } + + const processedTotals = processedDataBySite.get(TOTALS_STUDY) + processedDataBySite.set(TOTALS_STUDY, { + ...processedTotals, + targets: totalsValueTargets, + siteCode: TOTALS_STUDY, + }) + + this.processedDataBySite = processedDataBySite + } + + _isAnyTargetIncluded = () => { + return Object.keys(this.studyTotals) + .filter((site) => site !== TOTALS_STUDY) + .some((site) => this.studyTotals[site]?.targetTotal !== undefined) + } +} + +export default BarChartDataProcessor diff --git a/server/data_processors/DashboardDataProcessor/DashboardDataProcessor.test.js b/server/data_processors/DashboardDataProcessor/DashboardDataProcessor.test.js new file mode 100644 index 00000000..2c9759a6 --- /dev/null +++ b/server/data_processors/DashboardDataProcessor/DashboardDataProcessor.test.js @@ -0,0 +1,144 @@ +import DashboardDataProcessor from '.' +import { + createAnalysisConfig, + createParticipantDayData, + createMatrixData, +} from '../../../test/fixtures' + +describe('Data Processors - Dashboard', () => { + describe(DashboardDataProcessor.calculateDashboardData, () => { + const jumpVariableData = { + assessment: 'jump_of', + dayData: [ + createParticipantDayData({ + day: 10, + jumpVariable: 1, + }), + createParticipantDayData({ + day: 20, + jumpVariable: 30, + }), + ], + } + const sizeVariableData = { + assessment: 'size_of', + dayData: [ + createParticipantDayData({ + day: 1, + sizeVariable: 30, + }), + createParticipantDayData({ + day: 45, + sizeVariable: 2, + }), + ], + } + const participantDataMap = new Map() + participantDataMap.set( + sizeVariableData.assessment, + sizeVariableData.dayData + ) + participantDataMap.set( + jumpVariableData.assessment, + jumpVariableData.dayData + ) + + const config = [ + createAnalysisConfig({ + label: 'Size', + analysis: 'size_of', + color: ['red', 'blue', 'white'], + range: [1, 2], + variable: 'sizeVariable', + category: 'measurements', + }), + createAnalysisConfig({ + label: 'Jump', + analysis: 'jump_of', + color: ['red', 'blue', 'white'], + range: [1, 2], + variable: 'jumpVariable', + category: 'power', + }), + createAnalysisConfig({ + label: 'Read', + analysis: 'read_of', + color: ['red', 'blue', 'white'], + range: [1, 2], + variable: 'readVariable', + category: 'reading', + }), + ] + + it('calculates the min, max and mean of the data and appends it to the matrix result array', () => { + const dashboardProcessor = new DashboardDataProcessor( + config, + participantDataMap + ) + const matrixData = dashboardProcessor.calculateDashboardData() + + expect(matrixData).toEqual([ + createMatrixData({ + analysis: 'size_of', + category: 'measurements', + color: ['red', 'blue', 'white'], + data: [ + { + day: 1, + sizeVariable: 30, + }, + { + day: 45, + sizeVariable: 2, + }, + ], + label: 'Size', + range: [1, 2], + stat: [ + { + max: 30, + mean: 16, + min: 2, + }, + ], + variable: 'sizeVariable', + }), + createMatrixData({ + analysis: 'jump_of', + category: 'power', + color: ['red', 'blue', 'white'], + data: [ + { + day: 10, + jumpVariable: 1, + }, + { + day: 20, + jumpVariable: 30, + }, + ], + label: 'Jump', + range: [1, 2], + stat: [ + { + max: 30, + mean: 15.5, + min: 1, + }, + ], + variable: 'jumpVariable', + }), + createMatrixData({ + analysis: 'read_of', + category: 'reading', + color: ['red', 'blue', 'white'], + data: [], + label: 'Read', + range: [1, 2], + stat: [], + variable: 'readVariable', + }), + ]) + }) + }) +}) diff --git a/server/data_processors/DashboardDataProcessor/index.js b/server/data_processors/DashboardDataProcessor/index.js new file mode 100644 index 00000000..53a53076 --- /dev/null +++ b/server/data_processors/DashboardDataProcessor/index.js @@ -0,0 +1,55 @@ +class DashboardDataProcessor { + matrixData = [] + + constructor(configuration, participantDataMap) { + this.configuration = configuration + this.participantDataMap = participantDataMap + } + + calculateDashboardData = () => { + this.configuration.forEach(({ analysis, variable, label, ...rest }) => { + const assessmentData = this.participantDataMap.get(analysis) + if (!assessmentData) + this.matrixData.push({ + analysis, + data: [], + label, + variable, + stat: [], + ...rest, + }) + else { + const variableData = assessmentData.reduce( + (variableDataArray, dayData) => { + if (Object.hasOwn(dayData, variable)) + variableDataArray.push({ + day: dayData.day, + [variable]: dayData[variable], + }) + + return variableDataArray + }, + [] + ) + const max = Math.max(...variableData.map((data) => data[variable])) + const min = Math.min(...variableData.map((data) => data[variable])) + const sum = variableData.reduce((prev, acc) => prev + acc[variable], 0) + const mean = sum / variableData.length + const stat = [{ max, min, mean }] + + this.matrixData.push({ + analysis, + data: variableData, + label, + variable, + stat: variableData.length ? stat : [], + ...rest, + }) + } + }) + + return this.matrixData + } +} + +export default DashboardDataProcessor diff --git a/server/mailer/AdminAccountPasswordMailer.js b/server/mailer/AdminAccountPasswordMailer.js new file mode 100644 index 00000000..6b52f372 --- /dev/null +++ b/server/mailer/AdminAccountPasswordMailer.js @@ -0,0 +1,13 @@ +import BaseMailer from './BaseMailer' + +export default class AdminAccountPasswordMailer extends BaseMailer { + constructor(resetKey) { + super({ to: [process.env.ADMIN_EMAIL], from: process.env.EMAIL_SENDER }) + this.subject = 'Admin Account Created' + this.resetKey = resetKey + } + + async body() { + return `You've installed DPdash! Your username is "admin". Your password reset token is ${this.resetKey}` + } +} diff --git a/server/mailer/BaseMailer.js b/server/mailer/BaseMailer.js new file mode 100644 index 00000000..df856c6e --- /dev/null +++ b/server/mailer/BaseMailer.js @@ -0,0 +1,64 @@ +import { SES } from '@aws-sdk/client-ses' +import { createTransport } from 'nodemailer' + +export default class BaseMailer { + constructor({ to, from }) { + this.to = to + this.from = from + } + + async sendMail() { + return this.mailService.sendEmail(await this.emailParams()) + } + + get mailService() { + if (process.env.SMTP_HOST) { + return { + sendEmail: async (params) => { + const transporter = createTransport({ + host: process.env.SMTP_HOST, + port: process.env.SMTP_PORT, + auth: { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASS, + }, + tls: { + // to not fail on invalid certs: + // set SMTP_REJECT_UNAUTHORIZED=false in .env file + rejectUnauthorized: process.env.SMTP_REJECT_UNAUTHORIZED == 'true', + }, + }) + + return await transporter.sendMail({ + from: params.Source, + to: params.Destination.ToAddresses, + subject: params.Message.Subject.Data, + html: params.Message.Body.Html.Data, + }) + }, + } + } + return new SES({ apiVersion: '2010-12-01', region: 'us-east-1' }) + } + + async emailParams() { + return { + Destination: { + ToAddresses: this.to, + }, + Source: this.from, + Message: { + Body: { + Html: { + Charset: 'UTF-8', + Data: await this.body(), + }, + }, + Subject: { + Charset: 'UTF-8', + Data: this.subject, + }, + }, + } + } +} diff --git a/server/mailer/RegistrationMailer.js b/server/mailer/RegistrationMailer.js new file mode 100644 index 00000000..b448cf2f --- /dev/null +++ b/server/mailer/RegistrationMailer.js @@ -0,0 +1,27 @@ +import path from 'path' + +import { renderFile } from 'ejs' + +import BaseMailer from './BaseMailer' + +export default class RegistrationMailer extends BaseMailer { + constructor(user) { + super({ to: [process.env.ADMIN_EMAIL], from: process.env.EMAIL_SENDER }) + this.subject = 'New Registered User' + this.user = user + this.redirectUrl = process.env.HOME_URL + } + + async body() { + const registrationEmailTemplate = path.join( + __dirname, + 'templates', + 'registrationTemplate.ejs' + ) + + return await renderFile(registrationEmailTemplate, { + ...this.user, + redirect: this.redirectUrl, + }) + } +} diff --git a/server/mailer/templates/registrationTemplate.ejs b/server/mailer/templates/registrationTemplate.ejs new file mode 100644 index 00000000..b4b98eb9 --- /dev/null +++ b/server/mailer/templates/registrationTemplate.ejs @@ -0,0 +1,25 @@ + + + + + + + +
+
+

<%= display_name %> using <%= mail %>

+

is requesting access to dpdash

+ Grant Access to Dpdash +
+
+ + diff --git a/server/middleware/validateRequest.js b/server/middleware/validateRequest.js new file mode 100644 index 00000000..6080bd45 --- /dev/null +++ b/server/middleware/validateRequest.js @@ -0,0 +1,31 @@ +import * as yup from 'yup' + +export const baseSchema = (overrides = {}) => + yup.object({ + body: yup.object(), + params: yup.object(), + query: yup.object(), + ...overrides, + }) + +async function validateRequest(schema, requestFields) { + return await schema.validate(requestFields, { + abortEarly: true, + }) +} + +const validateMiddleware = (schema) => async (req, res, next) => { + try { + await validateRequest(schema, { + body: req.body, + params: req.params, + query: req.query, + }) + + next() + } catch (error) { + return res.status(400).json({ error: error.message }) + } +} + +export default validateMiddleware diff --git a/server/middleware/validateRequest.test.js b/server/middleware/validateRequest.test.js new file mode 100644 index 00000000..fc41da10 --- /dev/null +++ b/server/middleware/validateRequest.test.js @@ -0,0 +1,49 @@ +import * as yup from 'yup' + +import validateMiddleware, { baseSchema } from './validateRequest' +import { createRequest, createResponse } from '../../test/fixtures' + +describe(validateMiddleware, () => { + it('returns an error message when inputs are nonvalid', async () => { + const req = createRequest({ + body: { nonexistant: 1 }, + params: { uid: 'some-id' }, + query: {}, + }) + const res = createResponse() + const next = jest.fn() + const schema = baseSchema({ + body: yup.object({ + exists: yup.string().required(), + }), + params: yup.object({ uid: yup.string().required() }), + }) + + await validateMiddleware(schema)(req, res, next) + + expect(res.status).toHaveBeenCalledWith(400) + expect(res.json).toHaveBeenCalledWith({ + error: 'body.exists is a required field', + }) + }) + + it('continues with logic if no errors', async () => { + const req = createRequest({ + body: { exists: 'string' }, + params: { uid: 'some-id' }, + query: {}, + }) + const res = createResponse() + const next = jest.fn() + const schema = baseSchema({ + body: yup.object({ + exists: yup.string().required(), + }), + params: yup.object({ uid: yup.string().required() }), + }) + + await validateMiddleware(schema)(req, res, next) + + expect(next).toHaveBeenCalled() + }) +}) diff --git a/server/models/AssessmentDayDataModel/index.js b/server/models/AssessmentDayDataModel/index.js new file mode 100644 index 00000000..3f2747da --- /dev/null +++ b/server/models/AssessmentDayDataModel/index.js @@ -0,0 +1,31 @@ +import { collections } from '../../utils/mongoCollections' + +const AssessmentDayDataModel = { + all: async (db, query) => + await db + .collection(collections.assessmentDayData) + .find(query, { projection: { participant: 1, _id: 0 } }) + .toArray(), + findOne: async (db, query) => + await db.collection(collections.assessmentDayData).findOne(query), + upsert: async (db, query, updatedAttributes) => + await db.collection(collections.assessmentDayData).findOneAndUpdate( + query, + { $set: updatedAttributes }, + { + upsert: true, + returnDocument: 'after', + } + ), + createMany: async (db, assessmentDayData) => + await db + .collection(collections.assessmentDayData) + .insertMany(assessmentDayData), + index: async (db, query) => + await db + .collection(collections.assessmentDayData) + .aggregate(query) + .toArray(), +} + +export default AssessmentDayDataModel diff --git a/server/models/AssessmentModel/index.js b/server/models/AssessmentModel/index.js new file mode 100644 index 00000000..242e0f24 --- /dev/null +++ b/server/models/AssessmentModel/index.js @@ -0,0 +1,23 @@ +import { collections } from '../../utils/mongoCollections' + +const AssessmentModel = { + all: async (db, query) => + await db.collection(collections.assessments).find(query).toArray(), + upsert: async (db, query, updatedAttributes) => + await db.collection(collections.assessments).findOneAndUpdate( + query, + { $set: updatedAttributes }, + { + upsert: true, + returnDocument: 'after', + } + ), + withDefaults: (overrides = {}) => ({ + name: '', + updatedAt: new Date(), + createdAt: new Date(), + ...overrides, + }), +} + +export default AssessmentModel diff --git a/server/models/AssessmentVariablesModel/assessmentVariablesModel.test.js b/server/models/AssessmentVariablesModel/assessmentVariablesModel.test.js new file mode 100644 index 00000000..3b950037 --- /dev/null +++ b/server/models/AssessmentVariablesModel/assessmentVariablesModel.test.js @@ -0,0 +1,186 @@ +import AssessmentVariablesModel from '.' +import { createAsessmentVariable } from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +describe('AssessmentVariablesModel', () => { + let appDb + + const initialAssessmentVariables = [ + createAsessmentVariable({ + name: 'var1', + }), + createAsessmentVariable({ + name: 'var2', + }), + createAsessmentVariable({ + name: 'var3', + }), + createAsessmentVariable({ + name: 'var4', + }), + createAsessmentVariable({ + name: 'var6', + }), + createAsessmentVariable({ + name: 'var7', + }), + ] + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db('assessment_vars') + }) + beforeEach(async () => { + await appDb.createCollection(collections.assessmentVariables) + }) + + afterEach(async () => { + await appDb.collection(collections.assessmentVariables).drop() + }) + afterAll(async () => { + await appDb.dropDatabase() + }) + + it('creates new assessment variables', async () => { + const newAssessment = 'new_assess_id' + const newVariables = initialAssessmentVariables.map(({ name }) => ({ + name, + assessment_id: newAssessment, + })) + await Promise.all( + newVariables.map( + async (variableMetadata) => + await AssessmentVariablesModel.upsert( + appDb, + variableMetadata, + variableMetadata + ) + ) + ) + + const insertedVariables = await appDb + .collection(collections.assessmentVariables) + .find({ assessment_id: newAssessment }) + .project({ _id: 0 }) + .sort({ name: 1 }) + .toArray() + + expect(insertedVariables).toEqual(newVariables) + }) + + it('will add only new variables to the database, and will not duplicate any variables', async () => { + const importedAssessment = 'already_imported' + await Promise.all( + initialAssessmentVariables.map( + async ({ name }) => + await AssessmentVariablesModel.upsert( + appDb, + { + name, + assessment_id: importedAssessment, + }, + { + name, + assessment_id: importedAssessment, + } + ) + ) + ) + const mixedPayload = [ + createAsessmentVariable({ + name: 'var1', + assessment_id: importedAssessment, + }), + createAsessmentVariable({ + name: 'var2', + assessment_id: importedAssessment, + }), + createAsessmentVariable({ + name: 'var3', + assessment_id: importedAssessment, + }), + createAsessmentVariable({ + name: 'var4', + assessment_id: importedAssessment, + }), + createAsessmentVariable({ + name: 'var6', + assessment_id: importedAssessment, + }), + createAsessmentVariable({ + name: 'var7', + assessment_id: importedAssessment, + }), + createAsessmentVariable({ + name: 'var5', + assessment_id: importedAssessment, + }), + createAsessmentVariable({ + name: 'new-var1', + assessment_id: importedAssessment, + }), + createAsessmentVariable({ + name: 'newvar2', + assessment_id: importedAssessment, + }), + ] + await Promise.all( + mixedPayload.map( + async (variableMetadata) => + await AssessmentVariablesModel.upsert( + appDb, + variableMetadata, + variableMetadata + ) + ) + ) + const insertedData = await appDb + .collection(collections.assessmentVariables) + .find({ assessment_id: importedAssessment }, { projection: { _id: 0 } }) + .toArray() + + expect(insertedData.length).toEqual(mixedPayload.length) + expect(insertedData.map(({ name }) => name).sort()).toEqual( + mixedPayload.map(({ name }) => name).sort() + ) + }) + + it('will not duplicate any data already present in the db', async () => { + const oldAssessment = 'old-assessment' + const varsToInsert = initialAssessmentVariables.map(async ({ name }) => ({ + name, + assessment_id: oldAssessment, + })) + + await Promise.all( + varsToInsert.map( + async (variableMetadata) => + await AssessmentVariablesModel.upsert( + appDb, + variableMetadata, + variableMetadata + ) + ) + ) + const alreadyInserted = await appDb + .collection(collections.assessmentVariables) + .find({ assessment_id: oldAssessment }) + .toArray() + + await Promise.all( + varsToInsert.map( + async (variableMetadata) => + await AssessmentVariablesModel.upsert( + appDb, + variableMetadata, + variableMetadata + ) + ) + ) + + const reImportedData = await appDb + .collection(collections.assessmentVariables) + .find({ assessment_id: oldAssessment }) + .toArray() + + expect(alreadyInserted).toEqual(reImportedData) + }) +}) diff --git a/server/models/AssessmentVariablesModel/index.js b/server/models/AssessmentVariablesModel/index.js new file mode 100644 index 00000000..ae684c7a --- /dev/null +++ b/server/models/AssessmentVariablesModel/index.js @@ -0,0 +1,15 @@ +import { collections } from '../../utils/mongoCollections' + +const AssessmentVariablesModel = { + upsert: async (db, query, assessmentVariableAttributes) => + await db.collection(collections.assessmentVariables).findOneAndUpdate( + query, + { $set: assessmentVariableAttributes }, + { + upsert: true, + returnDocument: 'after', + } + ), +} + +export default AssessmentVariablesModel diff --git a/server/models/ChartsModel/ChartsModel.test.js b/server/models/ChartsModel/ChartsModel.test.js new file mode 100644 index 00000000..e3808be5 --- /dev/null +++ b/server/models/ChartsModel/ChartsModel.test.js @@ -0,0 +1,47 @@ +import { chartsListQuery } from '.' +import { createUser } from '../../../test/fixtures' + +describe(chartsListQuery, () => { + it('returns a mongodb charts query', () => { + const user = createUser({ favoriteCharts: ['1', '2'] }) + const queryParams = { sortBy: 'title', sortDirection: 'ASC' } + + expect(chartsListQuery(user, queryParams)).toEqual([ + { + $match: { + $or: [ + { + owner: 'user-uid', + }, + { + sharedWith: 'user-uid', + }, + { + public: true, + }, + ], + }, + }, + { + $addFields: { + chart_id: { + $toString: '$_id', + }, + }, + }, + { + $addFields: { + favorite: { + $in: ['$chart_id', ['1', '2']], + }, + }, + }, + { + $sort: { + favorite: -1, + title: 1, + }, + }, + ]) + }) +}) diff --git a/server/models/ChartsModel/index.js b/server/models/ChartsModel/index.js new file mode 100644 index 00000000..b92afda6 --- /dev/null +++ b/server/models/ChartsModel/index.js @@ -0,0 +1,82 @@ +import { ObjectId } from 'mongodb' + +import { ASC } from '../../constants' +import { collections } from '../../utils/mongoCollections' + +const id = '$_id' +const idKey = '$chart_id' +const updatedAt = 'updatedAt' +const $updatedAt = '$updatedAt' +const today = () => new Date() + +const ChartsModel = { + create: async (db, chartAttributes) => + await db.collection(collections.charts).insertOne({ + ...chartAttributes, + updatedAt: today(), + createdAt: today(), + }), + all: async (db, user, queryParams) => + await db + .collection(collections.charts) + .aggregate(chartsListQuery(user, queryParams)), + destroy: async (db, chart_id) => { + const { deletedCount } = await db + .collection(collections.charts) + .deleteOne({ _id: new ObjectId(chart_id) }) + + if (deletedCount !== 1) { + throw new Error('Unable to delete chart') + } + }, + show: async (db, query) => + await db.collection(collections.charts).findOne(query), + update: async (db, query, chartAttributes) => + await db + .collection(collections.charts) + .findOneAndUpdate( + query, + { $set: { ...chartAttributes, updatedAt: today() } }, + { returnOriginal: false, upsert: true, returnDocument: 'after' } + ), +} + +export const chartsListQuery = (user, queryParams) => { + const { uid, favoriteCharts } = user + const { sortBy, sortDirection } = queryParams + const direction = sortDirection === ASC ? 1 : -1 + const sort = + sortBy === updatedAt + ? [ + { + $addFields: { + date: { $dateFromString: { dateString: $updatedAt } }, + }, + }, + { $sort: { favorite: -1, date: direction } }, + ] + : [{ $sort: { favorite: -1, [sortBy]: direction } }] + const searchQuery = queryParams?.search + ? { + title: { $regex: queryParams.search, $options: 'i' }, + $or: [{ owner: uid }, { sharedWith: uid }, { public: true }], + } + : { + $or: [{ owner: uid }, { sharedWith: uid }, { public: true }], + } + + return [ + { + $match: searchQuery, + }, + { $addFields: { chart_id: { $toString: id } } }, + { + $addFields: { + favorite: { $in: [idKey, favoriteCharts || []] }, + }, + }, + ...sort, + ] +} + +export default ChartsModel diff --git a/server/models/ConfigModel/index.js b/server/models/ConfigModel/index.js new file mode 100644 index 00000000..a8e11216 --- /dev/null +++ b/server/models/ConfigModel/index.js @@ -0,0 +1,71 @@ +import { ObjectId } from 'mongodb' + +import defaultUserConfig from '../../constants/defaultUserConfig' +import { collections } from '../../utils/mongoCollections' + +const ConfigModel = { + active: async (db, userId) => + await db + .collection(collections.configs) + .aggregate([ + { + $match: { + $or: [{ readers: userId }, { public: true }, { owner: userId }], + }, + }, + { + $match: { $or: [{ status: { $exists: false } }, { status: 1 }] }, + }, + ]) + .stream(), + all: async (db, userId) => + await db + .collection(collections.configs) + .find({ + $or: [{ readers: userId }, { public: true }, { owner: userId }], + }) + .stream(), + destroy: async (db, configId) => { + const { deletedCount } = await db + .collection(collections.configs) + .deleteOne({ _id: new ObjectId(configId) }) + + if (deletedCount !== 1) { + throw new Error('Unable to delete configuration') + } + }, + update: async (db, configId, configAttributes) => { + const value = await db + .collection(collections.configs) + .findOneAndUpdate( + { _id: new ObjectId(configId) }, + { $set: configAttributes }, + { returnOriginal: false, upsert: true, returnDocument: 'after' } + ) + + if (!value) { + throw new Error('Could not update configuration') + } + + return value + }, + + create: async (db, configAttributes) => { + const { insertedId } = await db + .collection(collections.configs) + .insertOne(configAttributes) + + return await ConfigModel.findOne(db, { _id: insertedId }) + }, + findOne: async (db, configQuery) => + await db.collection(collections.configs).findOne(configQuery), + withDefaults: (overrides = {}) => ({ + config: defaultUserConfig, + name: 'default', + type: 'matrix', + created: new Date().toUTCString(), + ...overrides, + }), +} + +export default ConfigModel diff --git a/server/models/ParticipantsModel/ParticipantsModel.test.js b/server/models/ParticipantsModel/ParticipantsModel.test.js new file mode 100644 index 00000000..3abed930 --- /dev/null +++ b/server/models/ParticipantsModel/ParticipantsModel.test.js @@ -0,0 +1,27 @@ +import ParticipantsModel from '.' + +describe('ParticipantsModel', () => { + describe(ParticipantsModel.intersectParticipants, () => { + it('intersects participants that appear in multiple partcipant lists', () => { + const groupA = ['A1', 'T1', 'A2', 'T3', 'A4', 'A5', 'A6'] + const groupB = ['T1', 'T3', 'T6'] + const groupC = ['B1', 'T3', 'B2', 'T1', 'B3', 'B4', 'B5'] + const groupedParticipants = [groupA, groupB, groupC] + + expect( + ParticipantsModel.intersectParticipants(groupedParticipants) + ).toEqual(['T1', 'T3']) + }) + + it('returns empty if no matching participants', () => { + const groupA = ['A1', 'A2', 'A4', 'A5', 'A6'] + const groupB = ['T1', 'T3', 'T6'] + const groupC = ['B1', 'B2', 'B3', 'B4', 'B5'] + const groupedParticipants = [groupA, groupB, groupC] + + expect( + ParticipantsModel.intersectParticipants(groupedParticipants) + ).toEqual([]) + }) + }) +}) diff --git a/server/models/ParticipantsModel/index.js b/server/models/ParticipantsModel/index.js new file mode 100644 index 00000000..f8af851b --- /dev/null +++ b/server/models/ParticipantsModel/index.js @@ -0,0 +1,170 @@ +import { + ASC, + ALL_SUBJECTS_MONGO_PROJECTION, + STUDIES_TO_OMIT, +} from '../../constants' +import { collections } from '../../utils/mongoCollections' + +const participant = 'participant' +const $participants = '$participants' + +const ParticipantsModel = { + index: async (db, user, queryParams) => + await db + .collection(collections.metadata) + .aggregate(allParticipantsQuery(user, queryParams)) + .toArray(), + allForAssessment: async (db, chart, filtersService) => { + const { filterQueries } = filtersService + const query = { + assessment: chart.assessment, + study: { $in: filtersService.requestedSites, $nin: STUDIES_TO_OMIT }, + } + if (filtersService.allFiltersInactive()) { + return await db + .collection(collections.assessmentDayData) + .find(query, { projection: ALL_SUBJECTS_MONGO_PROJECTION }) + .stream() + } + + const groupedParticipants = await Promise.all( + filterQueries.map((query) => { + return db + .collection(collections.assessmentDayData) + .distinct('participant', query) + }) + ) + + return await db + .collection(collections.assessmentDayData) + .find({ + ...query, + participant: { + $in: + groupedParticipants.length > 1 + ? ParticipantsModel.intersectParticipants(groupedParticipants) + : groupedParticipants.flat(), + }, + }) + .stream() + }, + intersectParticipants: (groupedParticipants) => { + const sortedGroupParticipants = groupedParticipants.sort( + (groupA, groupB) => { + if (groupA.length === groupB.length) return 0 + if (groupB.length > groupA.length) return 1 + if (groupA.length < groupB.length) return -1 + } + ) + + return sortedGroupParticipants.reduce( + (participantGroupA, participantGroupB) => + participantGroupA.filter((participant) => + participantGroupB.includes(participant) + ) + ) + }, +} + +const allParticipantsQuery = (user, queryParams) => { + const { star, complete } = user.preferences + const starred = star ? Object.values(star).flat() : [] + const completed = complete ? Object.values(complete).flat() : [] + const { status, sortBy, sortDirection, searchParticipants, studies } = + queryParams + const direction = sortDirection === ASC ? 1 : -1 + const sortByParams = { [sortBy]: direction } + const baseSort = { star: -1 } + const sort = sortBy + ? { $sort: { ...baseSort, ...sortByParams } } + : { $sort: baseSort } + const studiesSet = new Set(studies?.length ? studies : user.access) + + searchParticipants?.forEach((participant) => + studiesSet.add(`${participant[0]}${participant[1]}`) + ) + const studiesQuery = Array.from(studiesSet) + + const query = [ + { + $match: { + $or: [ + { + study: { + $in: studiesQuery, + }, + }, + ], + }, + }, + + { $unwind: $participants }, + { + $project: { + _id: 0, + Active: '$participants.Active', + Consent: '$participants.Consent', + complete: { $in: ['$participants.participant', completed] }, + days: 1, + star: { $in: ['$participants.participant', starred] }, + study: 1, + participant: '$participants.participant', + synced: '$participants.synced', + daysInStudy: '$participants.daysInStudy', + }, + }, + ] + + if (searchParticipants?.length) { + if (studies?.length) { + query.push({ + $match: { + $or: [ + { + study: { + $in: studies, + }, + }, + { + participant: { + $in: searchParticipants, + }, + }, + ], + }, + }) + } else { + query.push({ + $match: { + $or: [ + { + participant: { + $in: searchParticipants, + }, + }, + ], + }, + }) + } + } + + if (status) { + query.splice(1, 0, { + $project: { + participants: { + $filter: { + input: $participants, + as: participant, + cond: { $eq: ['$$participant.Active', +status] }, + }, + }, + }, + }) + } + + query.push(sort) + + return query +} + +export default ParticipantsModel diff --git a/server/models/SiteMetadataModel/index.js b/server/models/SiteMetadataModel/index.js new file mode 100644 index 00000000..e4cd8afb --- /dev/null +++ b/server/models/SiteMetadataModel/index.js @@ -0,0 +1,28 @@ +import { collections } from '../../utils/mongoCollections' + +const queryOptions = { + upsert: true, + returnDocument: 'after', +} +const SiteMetadataModel = { + findOne: async (db, query) => + await db.collection(collections.metadata).findOne(query), + upsert$Set: async (db, query, setAttributes) => + await db.collection(collections.metadata).findOneAndUpdate( + query, + { + $set: setAttributes, + }, + queryOptions + ), + upsert$addToSet: async (db, query, addToSetAttributes) => + await db.collection(collections.metadata).findOneAndUpdate( + query, + { + $addToSet: addToSetAttributes, + }, + queryOptions + ), +} + +export default SiteMetadataModel diff --git a/server/models/StudiesModel/index.js b/server/models/StudiesModel/index.js new file mode 100644 index 00000000..0fdf2b87 --- /dev/null +++ b/server/models/StudiesModel/index.js @@ -0,0 +1,15 @@ +import { STUDIES_TO_OMIT } from '../../constants' +import { collections } from '../../utils/mongoCollections' + +const study = 'study' + +const StudiesModel = { + all: async (db) => await db.collection(collections.metadata).distinct(study), + sanitizeAndSort: (studies) => { + return studies + .filter((study) => !STUDIES_TO_OMIT.includes(study)) + .sort((prevStudy, nextStudy) => (prevStudy < nextStudy ? -1 : 1)) + }, +} + +export default StudiesModel diff --git a/server/models/UserModel/index.js b/server/models/UserModel/index.js new file mode 100644 index 00000000..5ada2fd8 --- /dev/null +++ b/server/models/UserModel/index.js @@ -0,0 +1,172 @@ +import crypto from 'crypto' + +import AdminAccountPasswordMailer from '../../mailer/AdminAccountPasswordMailer' +import { collections } from '../../utils/mongoCollections' +import ConfigModel from '../ConfigModel' +import StudiesModel from '../StudiesModel' + +export const userMongoProjection = { + _id: 0, + password: 0, + bad_pwd_count: 0, + lockout_time: 0, + last_logoff: 0, + last_logon: 0, + force_reset_pw: 0, +} + +const admin = 'admin' + +const UserModel = { + all: async (db) => + await db + .collection(collections.users) + .find({}, { projection: userMongoProjection }) + .toArray(), + destroy: async (db, uid) => { + const { deletedCount } = await db + .collection(collections.users) + .deleteOne({ uid }) + + if (deletedCount !== 1) throw new Error('Unable to delete user') + }, + create: async (db, userAttributes) => { + const newUser = UserModel.withDefaults(userAttributes) + const { insertedId } = await db + .collection(collections.users) + .insertOne(newUser) + + return await db.collection(collections.users).findOne({ _id: insertedId }) + }, + findOne: async (db, userAttributes, includeFields = {}) => { + const includeOrExcludeFields = Object.keys(includeFields)?.length + ? includeFields + : userMongoProjection + + return await db.collection(collections.users).findOne(userAttributes, { + projection: includeOrExcludeFields, + }) + }, + update: async (db, uid, userUpdates) => { + const user = await UserModel.findOne(db, { uid }) + const updatedUser = { preferences: {}, ...user, ...userUpdates } + + if (updatedUser.role === admin) + updatedUser.access = await StudiesModel.all(db) + + const value = await db.collection(collections.users).findOneAndUpdate( + { uid }, + { + $set: updatedUser, + }, + { + projection: userMongoProjection, + returnOriginal: false, + upsert: true, + returnDocument: 'after', + } + ) + if (!value) throw new Error('Could not update user.') + + return value + }, + hasAdmin: async (db) => { + const pseudoAdmins = await db + .collection(collections.users) + .aggregate([ + { $match: { uid: { $in: [admin, null] } } }, + { $sort: { uid: -1 } }, + { $project: { _id: 1 } }, + ]) + .toArray() + + if (pseudoAdmins.length > 1) { + const [_first, ...rest] = pseudoAdmins.map((el) => el._id) + + await db.collection(collections.users).deleteMany({ _id: { $in: rest } }) + } + + const userCt = await db + .collection(collections.users) + .countDocuments({ role: admin, password: { $ne: null } }) + + return userCt > 0 + }, + adminPasswordIsNotReset: async (db) => { + const adminUser = await db + .collection(collections.users) + .findOne({ uid: admin }) + + return adminUser.password === adminUser.reset_key + }, + createFirstAdmin: async (db) => { + if (await UserModel.hasAdmin(db)) { + if (await UserModel.adminPasswordIsNotReset(db)) { + const adminUser = await UserModel.findOne(db, { uid: admin }) + await UserModel.sendResetPasswordKey(adminUser.reset_key) + } + return + } + + const reset_key = crypto.randomBytes(32).toString('hex') + const configuration = await ConfigModel.findOne(db, { owner: admin }) + const preferences = {} + + if (configuration) { + preferences.config = configuration._id.toString() + } else { + const configAttributes = ConfigModel.withDefaults({ + owner: admin, + readers: [admin], + }) + const newConfiguration = await ConfigModel.create(db, configAttributes) + preferences.config = newConfiguration._id.toString() + } + + await UserModel.create(db, { + uid: admin, + password: reset_key, + role: admin, + mail: process.env.ADMIN_EMAIL, + preferences, + force_reset_pw: true, + reset_key, + }) + + await UserModel.sendResetPasswordKey(reset_key) + }, + sendResetPasswordKey: async (reset_key) => { + if (process.env.NODE_ENV === 'development') + console.log(`RESET KEY: ${reset_key}`) + else { + const adminMailer = new AdminAccountPasswordMailer(reset_key) + await adminMailer.sendMail() + } + }, + withDefaults: (overrides = {}) => ({ + access: [], + account_expires: null, + bad_pwd_count: 0, + blocked: false, + company: '', + display_name: '', + title: '', + department: '', + favoriteCharts: [], + force_reset_pw: false, + icon: '', + iconFileName: '', + last_logoff: Date.now(), + last_logon: Date.now(), + ldap: false, + lockout_time: 0, + mail: '', + member_of: '', + password: '', + realms: [''], + role: 'member', + ...overrides, + }), +} + +export default UserModel diff --git a/server/models/UserStudiesModel/index.js b/server/models/UserStudiesModel/index.js new file mode 100644 index 00000000..4c0c3ff1 --- /dev/null +++ b/server/models/UserStudiesModel/index.js @@ -0,0 +1,37 @@ +import { ASC, STUDIES_TO_OMIT } from '../../constants' +import { collections } from '../../utils/mongoCollections' + +const UserStudiesModel = { + all: async (db, studiesList, sortDirective) => + await db + .collection(collections.metadata) + .aggregate(userStudiesQuery(studiesList, sortDirective)) + .toArray(), +} + +const userStudiesQuery = (studiesList, sortDirective) => { + const sortDirection = sortDirective.sortDirection === ASC ? 1 : -1 + const sort = { [sortDirective.sortBy]: sortDirection } + + return [ + { $match: { study: { $in: studiesList, $nin: STUDIES_TO_OMIT } } }, + { + $project: { + _id: 0, + study: 1, + numOfParticipants: { + $cond: { + if: { $isArray: '$participants' }, + then: { $size: '$participants' }, + else: 0, + }, + }, + daysInStudy: { $max: '$participants.daysInStudy' }, + updatedAt: 1, + }, + }, + { $sort: sort }, + ] +} + +export default UserStudiesModel diff --git a/server/routes/admin.js b/server/routes/admin.js new file mode 100644 index 00000000..58cbd0ef --- /dev/null +++ b/server/routes/admin.js @@ -0,0 +1,45 @@ +import { Router } from 'express' +import * as yup from 'yup' + +import AdminUsersController from '../controllers/adminController' +import studiesController from '../controllers/studiesController' +import validateRequest, { baseSchema } from '../middleware/validateRequest' +import ensureAdmin from '../utils/passport/ensure-admin' +import { v1Routes } from '../utils/routes' + +const router = Router() +const uid = yup.string().required() +const body = yup.object({ + access: yup.array().of(yup.string()), + blocked: yup.boolean(), + account_expires: yup.string(), + uid: yup.string(), + company: yup.string(), + department: yup.string(), + display_name: yup.string(), + icon: yup.string(), + mail: yup.string(), + role: yup.string(), + title: yup.string(), + reset_key: yup.string(), + preferences: yup.object(), +}) + +const patchSchema = baseSchema({ + params: yup.object({ uid }), + body, +}) +const params = baseSchema({ + params: yup.object({ uid }), +}) + +router + .route(v1Routes.admin.users.show) + .patch(validateRequest(patchSchema), ensureAdmin, AdminUsersController.update) + .delete(validateRequest(params), ensureAdmin, AdminUsersController.destroy) + +router + .route(v1Routes.admin.studies.index) + .get(ensureAdmin, studiesController.index) + +export default router diff --git a/server/routes/assessmentData.js b/server/routes/assessmentData.js new file mode 100644 index 00000000..ef4a3e31 --- /dev/null +++ b/server/routes/assessmentData.js @@ -0,0 +1,14 @@ +import { Router } from 'express' + +import AssessmentDayDataController from '../controllers/api/assessmentDayDataController' +import { ensureApiAuthenticated } from '../utils/passport/ensure-api-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() + +router + .route(v1Routes.assessmentData.index) + .post(ensureApiAuthenticated, AssessmentDayDataController.create) + .delete(ensureApiAuthenticated, AssessmentDayDataController.destroy) + +export default router diff --git a/server/routes/assessments.js b/server/routes/assessments.js new file mode 100644 index 00000000..a8219755 --- /dev/null +++ b/server/routes/assessments.js @@ -0,0 +1,23 @@ +import { Router } from 'express' +import * as yup from 'yup' + +import assessmentsController from '../controllers/assessmentsController' +import validateRequest, { baseSchema } from '../middleware/validateRequest' +import ensureAuthenticated from '../utils/passport/ensure-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() + +const assessmentIndexSchema = baseSchema({ + query: yup.object({ search: yup.string() }), +}) + +router + .route(v1Routes.assessments.index) + .get( + validateRequest(assessmentIndexSchema), + ensureAuthenticated, + assessmentsController.index + ) + +export default router diff --git a/server/routes/auth.js b/server/routes/auth.js new file mode 100644 index 00000000..e62c6d38 --- /dev/null +++ b/server/routes/auth.js @@ -0,0 +1,46 @@ +import { Router } from 'express' +import * as yup from 'yup' + +import AuthController from '../controllers/authController' +import validateRequest, { baseSchema } from '../middleware/validateRequest' +import ensureAuthenticated from '../utils/passport/ensure-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() + +const signUpSchema = baseSchema({ + body: yup.object({ + username: yup.string().required(), + password: yup.string().min(8).required(), + confirmPassword: yup + .string() + .oneOf([yup.ref('password'), null], 'passwords do not match'), + fullName: yup.string().required(), + mail: yup.string().email().required(), + }), +}) + +const signInSchema = baseSchema({ + body: yup.object({ + username: yup.string().required(), + password: yup.string().min(8).required(), + }), +}) + +router + .route(v1Routes.auth.login) + .post(validateRequest(signInSchema), AuthController.authenticate) + +router + .route(v1Routes.auth.signup) + .post(validateRequest(signUpSchema), AuthController.create) + +router + .route(v1Routes.auth.logout) + .get(ensureAuthenticated, AuthController.destroy) + +router.route(v1Routes.auth.me).get(ensureAuthenticated, AuthController.show) + +router.route(v1Routes.auth.resetpw).post(AuthController.update) + +export default router diff --git a/server/routes/charts.js b/server/routes/charts.js new file mode 100644 index 00000000..85ac5747 --- /dev/null +++ b/server/routes/charts.js @@ -0,0 +1,128 @@ +import { Router } from 'express' +import * as yup from 'yup' + +import chartsController from '../controllers/chartsController' +import chartsDataController from '../controllers/chartsDataController' +import chartsDuplicateController from '../controllers/chartsDuplicateController' +import chartsShareController from '../controllers/chartsShareController' +import validateRequest, { baseSchema } from '../middleware/validateRequest' +import ensureAuthenticated from '../utils/passport/ensure-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() +const chartsIndexSchema = baseSchema({ + query: yup.object({ + search: yup.string(), + sortBy: yup.string(), + sortDirection: yup.string(), + }), +}) +const chartSchema = baseSchema({ + body: yup.object({ + title: yup.string().required(), + description: yup.string().required(), + assessment: yup.string().required(), + variable: yup.string().required(), + public: yup.boolean(), + fieldLabelValueMap: yup.array().of( + yup.object({ + value: yup.string(), + label: yup.string(), + color: yup.string(), + targetValues: yup.object(), + }) + ), + }), +}) +const destroyChartSchema = baseSchema({ + params: yup.object({ + chart_id: yup.string().required(), + }), +}) +const duplicateChartSchema = baseSchema({ + body: yup.object({ + chart_id: yup.string().required(), + }), +}) +const shareChartSchema = baseSchema({ + body: yup.object({ + sharedWith: yup.array().of(yup.string()).required(), + }), + params: yup.object({ + chart_id: yup.string().required(), + }), +}) +const editChartSchema = baseSchema({ + params: yup.object({ + chart_id: yup.string().required(), + }), +}) +const nameValueSchema = yup.object({ name: yup.string(), value: yup.string() }) +const viewChartSchema = baseSchema({ + params: yup.object({ + chart_id: yup.string().required(), + }), + query: yup.object({ + chrcrit_part: yup.array().of(nameValueSchema), + included_excluded: yup.array().of(nameValueSchema), + sex_at_birth: yup.array().of(nameValueSchema), + sites: yup.array().of(yup.string()), + }), +}) + +router + .route(v1Routes.chartsData.show) + .get( + validateRequest(viewChartSchema), + ensureAuthenticated, + chartsDataController.show + ) + +router + .route(v1Routes.charts.index) + .post( + validateRequest(chartSchema), + ensureAuthenticated, + chartsController.create + ) + .get( + validateRequest(chartsIndexSchema), + ensureAuthenticated, + chartsController.index + ) + +router + .route(v1Routes.charts.show) + .delete( + validateRequest(destroyChartSchema), + ensureAuthenticated, + chartsController.destroy + ) + .get( + validateRequest(editChartSchema), + ensureAuthenticated, + chartsController.show + ) + .patch( + validateRequest(chartSchema), + ensureAuthenticated, + chartsController.update + ) + +router + .route(v1Routes.chartsDuplicate.index) + .post( + validateRequest(duplicateChartSchema), + ensureAuthenticated, + chartsDuplicateController.create + ) + +router + .route(v1Routes.chartsShare.index) + .post( + validateRequest(shareChartSchema), + ensureAuthenticated, + chartsShareController.create + ) + +export default router diff --git a/server/routes/configurations.js b/server/routes/configurations.js new file mode 100644 index 00000000..1cd1e3cb --- /dev/null +++ b/server/routes/configurations.js @@ -0,0 +1,77 @@ +import { Router } from 'express' +import * as yup from 'yup' + +import ConfigurationsController from '../controllers/configurationsController' +import validateRequest, { baseSchema } from '../middleware/validateRequest' +import ensureUser from '../utils/passport/ensure-user' +import { v1Routes } from '../utils/routes' + +const router = Router() + +const body = yup.object({ + name: yup.string().required(), + type: yup.string().required(), + readers: yup.array().of(yup.string()), + public: yup.boolean(), + owner: yup.string().required(), + config: yup.object({ + 0: yup.array().of( + yup.object({ + category: yup.string(), + analysis: yup.string(), + variable: yup.string(), + label: yup.string(), + color: yup.array().of(yup.string()), + range: yup.array().of(yup.string()), + text: yup.boolean(), + }) + ), + }), + status: yup.number(), +}) +const params = yup.object({ + config_id: yup.string().required(), +}) +const allSchema = baseSchema({ + params: yup.object({ + uid: yup.string().required(), + }), + query: yup.object({ + status: yup.string(), + }), +}) +const configurationSchema = baseSchema({ body }) +const paramsSchema = baseSchema({ params }) +const updateSchema = baseSchema({ + params, + body, +}) + +router + .route(v1Routes.config.index) + .get(validateRequest(allSchema), ensureUser, ConfigurationsController.index) + .post( + validateRequest(configurationSchema), + ensureUser, + ConfigurationsController.create + ) + +router + .route(v1Routes.config.show) + .get( + validateRequest(paramsSchema), + ensureUser, + ConfigurationsController.findOne + ) + .delete( + validateRequest(paramsSchema), + ensureUser, + ConfigurationsController.destroy + ) + .patch( + validateRequest(updateSchema), + ensureUser, + ConfigurationsController.update + ) + +export default router diff --git a/server/routes/counts.js b/server/routes/counts.js new file mode 100644 index 00000000..62bdf431 --- /dev/null +++ b/server/routes/counts.js @@ -0,0 +1,13 @@ +import { Router } from 'express' + +import CountsController from '../controllers/countsController' +import ensureAuthenticated from '../utils/passport/ensure-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() + +router + .route(v1Routes.counts.index) + .get(ensureAuthenticated, CountsController.index) + +export default router diff --git a/server/routes/dashboards.js b/server/routes/dashboards.js new file mode 100644 index 00000000..d3c62c3e --- /dev/null +++ b/server/routes/dashboards.js @@ -0,0 +1,13 @@ +import { Router } from 'express' + +import DashboardsController from '../controllers/dashboardController' +import ensureStudyPermission from '../utils/passport/ensureStudyPermission' +import { v1Routes } from '../utils/routes' + +const router = Router() + +router + .route(v1Routes.dashboards.show) + .get(ensureStudyPermission, DashboardsController.show) + +export default router diff --git a/server/routes/index.js b/server/routes/index.js new file mode 100644 index 00000000..174ebc05 --- /dev/null +++ b/server/routes/index.js @@ -0,0 +1,11 @@ +import { Router } from 'express' + +import ApiUsersController from '../controllers/apiUsersController' +import ensureAuthenticated from '../utils/passport/ensure-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() + +router.get(v1Routes.users.index, ensureAuthenticated, ApiUsersController.index) + +export default router diff --git a/server/routes/participants.js b/server/routes/participants.js new file mode 100644 index 00000000..3efdc22e --- /dev/null +++ b/server/routes/participants.js @@ -0,0 +1,29 @@ +import { Router } from 'express' +import * as yup from 'yup' + +import ParticipantsController from '../controllers/participantsController' +import validateRequest, { baseSchema } from '../middleware/validateRequest' +import ensureAuthenticated from '../utils/passport/ensure-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() + +const schema = baseSchema({ + query: yup.object({ + status: yup.string(), + sortBy: yup.string(), + sortDirection: yup.string(), + searchSubjects: yup.array().optional(), + studies: yup.array().optional(), + }), +}) + +router + .route(v1Routes.participants.index) + .get( + validateRequest(schema), + ensureAuthenticated, + ParticipantsController.index + ) + +export default router diff --git a/server/routes/siteMetadata.js b/server/routes/siteMetadata.js new file mode 100644 index 00000000..7eff41c5 --- /dev/null +++ b/server/routes/siteMetadata.js @@ -0,0 +1,14 @@ +import { Router } from 'express' + +import SiteMetadataController from '../controllers/api/siteMetadataController' +import { ensureApiAuthenticated } from '../utils/passport/ensure-api-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() + +router + .route(v1Routes.siteMetadata.index) + .post(ensureApiAuthenticated, SiteMetadataController.create) + .delete(ensureApiAuthenticated, SiteMetadataController.destroy) + +export default router diff --git a/server/routes/userStudies.js b/server/routes/userStudies.js new file mode 100644 index 00000000..7db07859 --- /dev/null +++ b/server/routes/userStudies.js @@ -0,0 +1,13 @@ +import { Router } from 'express' + +import userStudiesController from '../controllers/userStudiesController' +import ensureAuthenticated from '../utils/passport/ensure-authenticated' +import { v1Routes } from '../utils/routes' + +const router = Router() + +router + .route(v1Routes.userStudies.index) + .get(ensureAuthenticated, userStudiesController.index) + +export default router diff --git a/server/routes/users.js b/server/routes/users.js new file mode 100644 index 00000000..d0f6a15d --- /dev/null +++ b/server/routes/users.js @@ -0,0 +1,41 @@ +import { Router } from 'express' +import * as yup from 'yup' + +import UsersController from '../controllers/usersController' +import validateRequest, { baseSchema } from '../middleware/validateRequest' +import ensureUser from '../utils/passport/ensure-user' +import { v1Routes } from '../utils/routes' + +const router = Router() +const patchSchema = baseSchema({ + params: yup.object({ + uid: yup.string(), + }), + body: yup.object({ + company: yup.string(), + department: yup.string(), + display_name: yup.string(), + favoriteCharts: yup.array().of(yup.string()), + icon: yup.string(), + iconFileName: yup.string(), + mail: yup.string(), + preferences: yup.object({ + config: yup.string(), + star: yup.object(), + complete: yup.object(), + }), + title: yup.string(), + }), +}) +const getUserSchema = baseSchema({ + params: yup.object({ + uid: yup.string(), + }), +}) + +router + .route(v1Routes.users.show) + .get(validateRequest(getUserSchema), ensureUser, UsersController.show) + .patch(validateRequest(patchSchema), ensureUser, UsersController.edit) + +export default router diff --git a/server/services/BarChartService/BarChartService.test.js b/server/services/BarChartService/BarChartService.test.js new file mode 100644 index 00000000..942395f9 --- /dev/null +++ b/server/services/BarChartService/BarChartService.test.js @@ -0,0 +1,202 @@ +import { ObjectId } from 'mongodb' + +import BarChartService from '.' +import { createChart, createFieldLabelValue } from '../../../test/fixtures' +import { dayDataAssessments } from '../../../test/testUtils' +import { collections } from '../../utils/mongoCollections' +import FiltersService, { DEFAULT_FILTERS } from '../FiltersService' + +describe(BarChartService, () => { + describe('methods', () => { + describe('createChart', () => { + let appDb + const chart = createChart( + { + _id: new ObjectId(), + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db('barService') + + await appDb + .collection(collections.assessmentDayData) + .insertMany(dayDataAssessments) + }) + + afterAll(async () => { + await appDb.dropDatabase() + }) + it('returns data, labels, and study totals', async () => { + const filters = { + ...DEFAULT_FILTERS, + recruitment_status: { + Recruited: { label: 'Recruited', value: 0 }, + 'Not recruited': { label: 'Not Recruited', value: 0 }, + }, + sites: { + YA: { label: 'YA', value: 1 }, + LA: { label: 'LA', value: 1 }, + MA: { label: 'MA', value: 1 }, + }, + } + const filterService = new FiltersService(filters, ['YA', 'LA', 'MA']) + const chartService = new BarChartService(appDb, chart, filterService) + const chartData = await chartService.createChart() + expect(chartData).toEqual({ + labelMap: new Map() + .set('Foo', { + color: '#e2860a', + name: 'Foo', + }) + .set('Bar', { + color: 'red', + name: 'Bar', + }) + .set('N/A', { + color: '#808080', + name: 'N/A', + }), + + processedDataBySite: new Map() + .set('Yale', { + counts: { + Bar: 2, + Foo: 2, + 'N/A': 0, + }, + siteCode: 'YA', + name: 'Yale', + percentages: { + Bar: 50, + Foo: 50, + 'N/A': 0, + }, + targets: { + Bar: 1, + Foo: 3, + }, + totalsForStudy: { + count: 4, + targetTotal: 4, + }, + }) + .set('Totals', { + counts: { + Bar: 2, + Foo: 6, + 'N/A': 6, + }, + siteCode: 'Totals', + name: 'Totals', + percentages: { + Bar: 14.285714285714285, + Foo: 42.857142857142854, + 'N/A': 42.857142857142854, + }, + targets: { + Bar: 3, + Foo: 6, + }, + totalsForStudy: { + count: 8, + targetTotal: 14, + }, + }) + .set('Madrid', { + counts: { + Bar: 0, + Foo: 4, + 'N/A': 1, + }, + siteCode: 'MA', + name: 'Madrid', + percentages: { + Bar: 0, + Foo: 80, + 'N/A': 20, + }, + targets: { + Bar: 2, + Foo: 3, + }, + totalsForStudy: { + count: 4, + targetTotal: 5, + }, + }), + studyTotals: { + Madrid: { + count: 4, + targetTotal: 5, + }, + Totals: { + count: 8, + targetTotal: 14, + }, + UCLA: { + count: 0, + targetTotal: 5, + }, + Yale: { + count: 4, + targetTotal: 4, + }, + }, + }) + }) + }) + }) + describe('.legend', () => { + const chart = createChart( + { + _id: new ObjectId(), + title: 'Eeg Measurements', + description: 'Participant EEG Measurements', + assessment: 'eeg', + variable: 'eeg', + public: false, + owner: 'owl', + }, + [ + createFieldLabelValue({ + value: 'bar', + label: 'Bar', + color: 'red', + targetValues: { + LA: '2', + YA: '1', + MA: '2', + }, + }), + ] + ) + + it('returns a legend object', () => { + const service = new BarChartService({}, chart, {}) + + expect(service.legend()).toEqual([ + { name: 'Foo', symbol: { fill: '#e2860a', type: 'rect' } }, + { name: 'Bar', symbol: { fill: 'red', type: 'rect' } }, + ]) + }) + }) +}) diff --git a/server/services/BarChartService/index.js b/server/services/BarChartService/index.js new file mode 100644 index 00000000..0988afce --- /dev/null +++ b/server/services/BarChartService/index.js @@ -0,0 +1,120 @@ +import { STUDIES_TO_OMIT, TOTALS_STUDY } from '../../constants' +import BarChartDataProcessor from '../../data_processors/BarChartDataProcessor' +import ParticipantsModel from '../../models/ParticipantsModel' +import { SITE_NAMES } from '../../utils/siteNames' + +class BarChartService { + constructor(appDb, chart, filtersService) { + this.chart = chart + this.appDb = appDb + this.filtersService = filtersService + } + + legend = () => { + return this.chart.fieldLabelValueMap.map(({ label, color }) => ({ + name: label, + symbol: { + type: 'rect', + fill: color, + }, + })) + } + + generateStudyTargetTotals = (userAccess) => { + const allowedStudies = userAccess.filter( + (study) => !STUDIES_TO_OMIT.includes(study) + ) + + const studyTotals = { + [TOTALS_STUDY]: { + count: 0, + targetTotal: 0, + }, + } + this.chart.fieldLabelValueMap.forEach((fieldValue) => { + const { targetValues } = fieldValue + + allowedStudies.forEach((study) => { + const siteName = SITE_NAMES[study] || study + const rawNewTargetValue = targetValues[study] + const newTargetValue = rawNewTargetValue + ? +rawNewTargetValue + : undefined + + studyTotals[siteName] = this._studyTargetTotal( + studyTotals[siteName], + newTargetValue + ) + + if (Object.prototype.hasOwnProperty.call(targetValues, study)) { + studyTotals[TOTALS_STUDY].targetTotal = this._totalStudyTargetValue( + studyTotals[TOTALS_STUDY].targetTotal, + newTargetValue + ) + } + }) + }) + + return studyTotals + } + + _studyTargetTotal = (studyTotals, newTargetValue) => { + if (studyTotals) { + if (studyTotals.targetTotal === undefined) { + return studyTotals + } + + return { + ...studyTotals, + targetTotal: newTargetValue + ? studyTotals.targetTotal + newTargetValue + : undefined, + } + } else { + return { + count: 0, + targetTotal: newTargetValue, + } + } + } + + _totalStudyTargetValue = (totalsStudyTargetTotal, siteTargetValue) => { + if (totalsStudyTargetTotal === undefined) { + return totalsStudyTargetTotal + } + + return siteTargetValue + ? totalsStudyTargetTotal + siteTargetValue + : undefined + } + + createChart = async () => { + const { requestedSites } = this.filtersService + const chartProcessor = new BarChartDataProcessor( + this.chart, + this.generateStudyTargetTotals(requestedSites) + ) + const dataStream = await ParticipantsModel.allForAssessment( + this.appDb, + this.chart, + this.filtersService + ) + + dataStream.on('data', (doc) => chartProcessor.processDocument(doc)) + await new Promise((resolve, reject) => { + dataStream.on('end', () => resolve()) + + dataStream.on('error', (err) => reject(err)) + }) + + const { processedDataBySite, studyTotals, labelMap, dataMap } = + chartProcessor.processData() + + if (dataMap.size === 0) + return { processedDataBySite: new Map(), studyTotals, labelMap } + + return { processedDataBySite, studyTotals, labelMap } + } +} + +export default BarChartService diff --git a/server/services/BarChartTableService/BarChartTableService.test.js b/server/services/BarChartTableService/BarChartTableService.test.js new file mode 100644 index 00000000..6d81260f --- /dev/null +++ b/server/services/BarChartTableService/BarChartTableService.test.js @@ -0,0 +1,115 @@ +import BarChartTableService from '.' +import { createLabel, createSiteData } from '../../../test/fixtures' +import { SITE_NAME, TOTAL_LABEL, SITE_CODE } from '../../constants' + +const dataBySite = [ + createSiteData({ + name: 'Site 1', + siteCode: 'S1', + counts: { + Good: 1, + Bad: 2, + Total: 3, + }, + totalsForStudy: { + count: 3, + }, + percentages: { + Good: 33.33, + Bad: 66.66, + }, + targets: { + Good: 0, + Bad: 0, + }, + }), + createSiteData({ + name: 'Site 2', + siteCode: 'S2', + counts: { + Good: 4, + Bad: 6, + Total: 10, + }, + totalsForStudy: { + count: 10, + }, + percentages: { + Good: 40, + Bad: 60, + }, + targets: { + Good: 4, + Bad: 6, + }, + }), +] +const labels = [ + createLabel({ name: 'Good', color: 'good-color' }), + createLabel({ name: 'Bad', color: 'bad-color' }), +] + +describe(BarChartTableService, () => { + describe('.websiteTableData', () => { + it('returns columns and rows', () => { + const service = new BarChartTableService(dataBySite, labels) + + expect(service.websiteTableData()).toEqual({ + tableColumns: [ + { + dataProperty: 'site', + label: SITE_NAME, + sortable: true, + }, + { + dataProperty: 'siteCode', + label: SITE_CODE, + sortable: false, + }, + { + dataProperty: 'Good', + label: 'Good', + sortable: false, + }, + { + dataProperty: 'Bad', + label: 'Bad', + sortable: false, + }, + { + dataProperty: 'Total', + label: 'Total', + sortable: false, + }, + ], + tableRows: [ + { Bad: '2', Good: '1', Total: '3', site: 'Site 1', siteCode: 'S1' }, + { + Bad: '6 / 6 (100%)', + Good: '4 / 4 (100%)', + Total: '10', + site: 'Site 2', + siteCode: 'S2', + }, + ], + }) + }) + }) + + describe('.csvTableData', () => { + it('returns columns and rows', () => { + const service = new BarChartTableService(dataBySite, labels) + + // website table data needs to be run first to build the data needed for csv + service.websiteTableData() + + expect(service.csvTableData()).toEqual({ + tableColumns: [SITE_NAME, SITE_CODE, 'Good', 'Bad', TOTAL_LABEL], + tableRows: [ + ['Site 1', 'S1', '1', '2', '3'], + ['Site 2', 'S2', '4 / 4 (100%)', '6 / 6 (100%)', '10'], + ], + }) + }) + }) +}) diff --git a/server/services/BarChartTableService/index.js b/server/services/BarChartTableService/index.js new file mode 100644 index 00000000..08c1e138 --- /dev/null +++ b/server/services/BarChartTableService/index.js @@ -0,0 +1,117 @@ +import { + SITE_NAME, + N_A, + TOTALS_STUDY, + TOTAL_LABEL, + SITE_CODE, +} from '../../constants' + +const formatAsPercentage = (value = 0) => value.toFixed(0) + '%' + +const studyCountsToPercentage = (studyCount, targetTotal) => { + if (!targetTotal || Number.isNaN(+studyCount) || Number.isNaN(+targetTotal)) { + return 0 + } + + return (+studyCount / +targetTotal) * 100 +} + +class BarChartTableService { + constructor(dataBySite, labels) { + this.dataBySite = dataBySite + this.labels = labels + this.websiteColumns = [] + this.websiteRows = [] + } + + websiteTableData = () => { + this.websiteColumns = this._graphTableColumns() + this.websiteRows = this._graphTableRowData(this._sortedTableRowDataBySite()) + + return { + tableColumns: this.websiteColumns, + tableRows: this.websiteRows, + } + } + + csvTableData = () => { + const tableColumns = this.websiteColumns.map(({ label }) => label) + const tableRows = this.websiteRows.map((siteData) => + this.websiteColumns.map(({ dataProperty }) => siteData[dataProperty]) + ) + + return { + tableColumns, + tableRows, + } + } + + _graphTableColumns = () => [ + { + dataProperty: 'site', + label: SITE_NAME, + sortable: true, + }, + { + dataProperty: 'siteCode', + label: SITE_CODE, + sortable: false, + }, + ...this.labels + .filter((column) => column.name !== N_A) + .concat({ name: TOTAL_LABEL }) + .map(({ name }) => ({ + dataProperty: name, + label: name, + sortable: false, + })), + ] + + _graphTableRowData = (sortedGraphTableData) => { + return sortedGraphTableData.map((siteData) => { + return { + site: siteData.name, + siteCode: siteData.siteCode, + ...Object.keys(siteData.counts).reduce((varData, nextVar) => { + varData[nextVar] = this._formatGraphTableCellData( + siteData.targets?.[nextVar], + siteData.counts[nextVar] + ) + + return varData + }, {}), + } + }) + } + + _formatGraphTableCellData = (siteTarget, studyCounts = 0) => { + if (!siteTarget) return `${studyCounts}` + + const percent = studyCountsToPercentage(studyCounts, siteTarget) + + return `${studyCounts} / ${siteTarget} (${formatAsPercentage(percent)})` + } + + _sortedTableRowDataBySite = () => { + return this.dataBySite + .map((site) => { + const { count, targetTotal } = site.totalsForStudy + site.counts[TOTAL_LABEL] = count + site.targets[TOTAL_LABEL] = targetTotal + + return site + }) + .sort(this._sortSitesByNameAndTotalsAtBottom) + } + + _sortSitesByNameAndTotalsAtBottom = (siteA, siteB) => { + if (siteA.name === TOTALS_STUDY) return 1 + if (siteB.name === TOTALS_STUDY) return -1 + if (siteA.name < siteB.name) return -1 + if (siteA.name > siteB.name) return 1 + + return 0 + } +} + +export default BarChartTableService diff --git a/server/services/CSVService.js b/server/services/CSVService.js new file mode 100644 index 00000000..c0a95be5 --- /dev/null +++ b/server/services/CSVService.js @@ -0,0 +1,25 @@ +import { stringify } from 'csv-stringify' + +class CsvService { + constructor(csvData) { + const { tableColumns, tableRows } = csvData + + if (!tableColumns || !tableRows) { + throw new Error( + 'CSV data must have tableColumns and tableRows attributes' + ) + } + + this.columns = tableColumns + this.rows = tableRows + } + + toReadableStream = () => { + return stringify(this.rows, { + header: true, + columns: this.columns, + }) + } +} + +export default CsvService diff --git a/server/services/DashboardService/DashboardService.test.js b/server/services/DashboardService/DashboardService.test.js new file mode 100644 index 00000000..1d641696 --- /dev/null +++ b/server/services/DashboardService/DashboardService.test.js @@ -0,0 +1,138 @@ +import DashboardService from '.' +import { + createAnalysisConfig, + createParticipantDayData, +} from '../../../test/fixtures' +import { collections } from '../../utils/mongoCollections' + +describe(DashboardService, () => { + describe('methods', () => { + describe('createMatrix', () => { + let appDb + + const configAnalysisData = [ + createAnalysisConfig({ + label: 'Jump', + analysis: 'jump_of', + variable: 'jumpVariable', + category: 'power', + }), + createAnalysisConfig({ + label: 'Size', + analysis: 'size_of', + variable: 'sizeVariable', + category: 'sizeing', + }), + ] + + const dataOne = { + study: 'YA', + assessment: 'jump_of', + participant: 'YA01', + dayData: [ + createParticipantDayData({ + day: 10, + jumpVariable: 1, + }), + createParticipantDayData({ + day: 20, + jumpVariable: 30, + }), + ], + } + const dataTwo = { + study: 'YA', + participant: 'YA01', + assessment: 'size_of', + dayData: [ + createParticipantDayData({ + day: 1, + sizeVariable: 30, + }), + createParticipantDayData({ + day: 45, + sizeVariable: 2, + }), + ], + } + + beforeAll(async () => { + appDb = await global.MONGO_INSTANCE.db('dashService') + + await appDb + .collection(collections.assessmentDayData) + .insertMany([dataOne, dataTwo]) + await appDb.collection(collections.metadata).insertOne({ + study: 'YA', + participants: [ + { participant: 'YA01', Consent: new Date('2022-02-26') }, + ], + }) + }) + afterAll(async () => await appDb.dropDatabase()) + + it('returns a list of prepared matrix data', async () => { + const dashboardService = new DashboardService( + appDb, + 'YA', + 'YA01', + configAnalysisData + ) + const matrixData = await dashboardService.createMatrix() + + expect(matrixData).toEqual([ + { + analysis: 'jump_of', + category: 'power', + color: [], + data: [ + { + day: 10, + jumpVariable: 1, + }, + { + day: 20, + jumpVariable: 30, + }, + ], + label: 'Jump', + range: [], + stat: [ + { + max: 30, + mean: 15.5, + min: 1, + }, + ], + variable: 'jumpVariable', + }, + { + analysis: 'size_of', + category: 'sizeing', + color: [], + data: [ + { + day: 1, + sizeVariable: 30, + }, + { + day: 45, + sizeVariable: 2, + }, + ], + label: 'Size', + range: [], + stat: [ + { + max: 30, + mean: 16, + min: 2, + }, + ], + variable: 'sizeVariable', + }, + ]) + }) + }) + }) +}) diff --git a/server/services/DashboardService/index.js b/server/services/DashboardService/index.js new file mode 100644 index 00000000..b75504ab --- /dev/null +++ b/server/services/DashboardService/index.js @@ -0,0 +1,75 @@ +import DashboardDataProcessor from '../../data_processors/DashboardDataProcessor' +import SiteMetadataModel from '../../models/SiteMetadataModel' +import { collections } from '../../utils/mongoCollections' + +class DashboardService { + constructor(appDb, study, participant, configuration) { + this.configuration = configuration + this.db = appDb + this.study = study + this.participant = participant + } + + get assessmentsFromConfig() { + const assessments = new Map() + + this.configuration.forEach((configuration) => { + const key = this.study + this.participant + configuration.analysis + + if (!assessments.has(key)) assessments.set(key, configuration.analysis) + }) + + return [...assessments.values()] + } + + consentDate = async () => { + const query = { + study: this.study, + } + + const studyMetadata = await SiteMetadataModel.findOne(this.db, query) + + return studyMetadata.participants.filter( + ({ participant }) => participant === this.participant + )[0].Consent + } + + dashboardDataCursor = async () => + await this.db + .collection(collections.assessmentDayData) + .find( + { + participant: this.participant, + study: this.study, + assessment: { $in: this.assessmentsFromConfig }, + }, + { projection: { dayData: 1, assessment: 1 } } + ) + .stream() + + createMatrix = async () => { + const dataStream = await this.dashboardDataCursor() + const participantDataMap = new Map() + + dataStream.on('data', (doc) => { + const dayData = doc?.dayData.length ? doc.dayData : [] + + participantDataMap.set(doc.assessment, dayData) + }) + + await new Promise((resolve, reject) => { + dataStream.on('end', () => resolve()) + + dataStream.on('error', (err) => reject(err)) + }) + + const dashboardProcessor = new DashboardDataProcessor( + this.configuration, + participantDataMap + ) + + return dashboardProcessor.calculateDashboardData() + } +} + +export default DashboardService diff --git a/server/services/FiltersService/FiltersService.test.js b/server/services/FiltersService/FiltersService.test.js new file mode 100644 index 00000000..431f598f --- /dev/null +++ b/server/services/FiltersService/FiltersService.test.js @@ -0,0 +1,149 @@ +import FiltersService, { DEFAULT_FILTERS } from '.' + +describe(FiltersService, () => { + describe('#filters', () => { + const initialFilters = { + chrcrit_part: { + HC: { label: 'HC', value: 1 }, + CHR: { label: 'CHR', value: 0 }, + Missing: { label: 'Missing', value: 0 }, + }, + recruitment_status: { + Recruited: { label: 'Recruited', value: 0 }, + 'Not recruited': { label: 'Not Recruited', value: 0 }, + }, + sex_at_birth: { + Male: { label: 'Male', value: 0 }, + Female: { label: 'Female', value: 1 }, + Missing: { label: 'Missing', value: 1 }, + }, + sites: {}, + networks: { + PRESCIENT: { label: 'PRESCIENT', value: 0 }, + ProNET: { label: 'ProNET', value: 0 }, + }, + } + const initialSites = ['one', 'two', 'three'] + + describe('when there are filters with empty sites', () => { + it('sanitizes the filters and sites', () => { + const service = new FiltersService(initialFilters, initialSites) + + expect(service.filters).toEqual({ + ...initialFilters, + sites: { + one: { + label: 'one', + value: 0, + }, + three: { + label: 'three', + value: 0, + }, + two: { + label: 'two', + value: 0, + }, + }, + }) + }) + }) + + describe('when there are filters with existing sites', () => { + it('sanitizes the filters and sites', () => { + const service = new FiltersService( + { + ...initialFilters, + sites: { + one: { + label: 'one', + value: 1, + }, + three: { + label: 'three', + value: 1, + }, + two: { + label: 'two', + value: 1, + }, + }, + }, + initialSites + ) + + expect(service.filters).toEqual({ + ...initialFilters, + sites: { + one: { + label: 'one', + value: 1, + }, + three: { + label: 'three', + value: 1, + }, + two: { + label: 'two', + value: 1, + }, + }, + }) + }) + }) + + describe('when there are no initial filters', () => { + it('sanitizes the filters and sites', () => { + const service = new FiltersService(undefined, initialSites) + + expect(service.filters).toEqual({ + ...DEFAULT_FILTERS, + sites: { + one: { + label: 'one', + value: 1, + }, + three: { + label: 'three', + value: 1, + }, + two: { + label: 'two', + value: 1, + }, + }, + }) + }) + }) + }) + + describe('#allFiltersInactive', () => { + it('return true when the filters have falsey values', () => { + const service = new FiltersService( + { + chrcrit_part: { + HC: { label: 'HC', value: 0 }, + }, + sites: {}, + }, + [] + ) + + expect(service.allFiltersInactive()).toBe(true) + }) + + it('return false if any category filter is true', () => { + const service = new FiltersService( + { + chrcrit_part: { + CHR: { name: 'CHR', value: 1 }, + Missing: { name: 'Missing', value: 0 }, + }, + sites: {}, + }, + [] + ) + expect(service.allFiltersInactive()).toBe(false) + }) + }) +}) diff --git a/server/services/FiltersService/index.js b/server/services/FiltersService/index.js new file mode 100644 index 00000000..dd8eb500 --- /dev/null +++ b/server/services/FiltersService/index.js @@ -0,0 +1,190 @@ +import { + FILTERS_FORM, + INCLUSION_EXCLUSION_CRITERIA_FORM, + SOCIODEMOGRAPHICS_FORM, +} from '../../constants' + +export const FILTER_TO_MONGO_VALUE_MAP = { + HC: 2, + CHR: 1, + Missing: null, + Recruited: 'recruited', + 'Not recruited': 'not recruited', + Male: 1, + Female: 2, +} + +export const INDIVIDUAL_FILTERS_MONGO_PROJECTION = { + study: 1, + collection: 1, + _id: 0, + subject: 1, +} + +export const DEFAULT_FILTERS = { + chrcrit_part: { + HC: { label: 'HC', value: 1 }, + CHR: { label: 'CHR', value: 1 }, + Missing: { label: 'Missing', value: 1 }, + }, + recruitment_status: { + Recruited: { label: 'Recruited', value: 1 }, + 'Not recruited': { label: 'Not Recruited', value: 0 }, + }, + sex_at_birth: { + Male: { label: 'Male', value: 1 }, + Female: { label: 'Female', value: 1 }, + Missing: { label: 'Missing', value: 1 }, + }, + sites: {}, + networks: { + PRESCIENT: { label: 'PRESCIENT', value: 0 }, + ProNET: { label: 'ProNET', value: 0 }, + }, +} + +const CHRCRIT_KEY = 'chrcrit_part' +const DAY_DATA_KEY = 'dayData' +const SEX_AT_BIRTH_FILTER_KEY = 'sex_at_birth' +const SEX_AT_BIRTH_DOCUMENT_KEY = 'chrdemo_sexassigned' +const RECRUITMENT_STATUS_KEY = 'recruitment_status' + +const filterToMongoValues = (filter) => { + return Object.values(filter) + .filter(({ value }) => value === 1) + .map(({ label }) => FILTER_TO_MONGO_VALUE_MAP[label]) +} + +class FiltersService { + constructor(filters, allSites) { + this._filters = filters + this.allSites = allSites + } + + allFiltersInactive = () => { + const { sites: _sites, networks: _networks, ...filters } = this.filters + return Object.keys(filters).every((category) => { + const filterCategory = filters[category] + + return Object.keys(filterCategory).every( + (filterKey) => filterCategory[filterKey].value === 0 + ) + }) + } + + get filters() { + return this._filters + ? this.#requestedFilters() + : { + ...DEFAULT_FILTERS, + sites: this.allSites.reduce((sitesObj, site) => { + sitesObj[site] = { label: site, value: 1 } + + return sitesObj + }, {}), + } + } + + get filterQueries() { + const chrChritQuery = (includedValues) => ({ + [`${DAY_DATA_KEY}.${CHRCRIT_KEY}`]: { $in: includedValues }, + }) + const recruitmentQuery = (includedValues) => { + const includeAllCategories = includedValues.length > 1 + + if (includeAllCategories) { + return { + [`${DAY_DATA_KEY}.${RECRUITMENT_STATUS_KEY}`]: { $exists: true }, + } + } else { + const isRecruited = includedValues.includes( + FILTER_TO_MONGO_VALUE_MAP.Recruited + ) + + if (!isRecruited) + return { + [`${DAY_DATA_KEY}.${RECRUITMENT_STATUS_KEY}`]: { + $ne: FILTER_TO_MONGO_VALUE_MAP.Recruited, + }, + } + + return { + [`${DAY_DATA_KEY}.${RECRUITMENT_STATUS_KEY}`]: + FILTER_TO_MONGO_VALUE_MAP.Recruited, + } + } + } + const sexAtBirthQuery = (includedValues) => ({ + [`${DAY_DATA_KEY}.${SEX_AT_BIRTH_DOCUMENT_KEY}`]: { $in: includedValues }, + }) + const filterQueries = [] + const filterNames = new Set( + Object.keys(this.filters).filter( + (catKey) => + Object.values(this.filters[catKey]) + .map((filter) => filter.value) + .indexOf(1) > -1 + ) + ) + + if (filterNames.has(CHRCRIT_KEY)) { + filterQueries.push({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + ...chrChritQuery(filterToMongoValues(this.filters[CHRCRIT_KEY])), + }) + } + + if (filterNames.has(SEX_AT_BIRTH_FILTER_KEY)) { + filterQueries.push({ + assessment: SOCIODEMOGRAPHICS_FORM, + ...sexAtBirthQuery( + filterToMongoValues(this.filters[SEX_AT_BIRTH_FILTER_KEY]) + ), + }) + } + + if (filterNames.has(RECRUITMENT_STATUS_KEY)) + filterQueries.push({ + assessment: FILTERS_FORM, + ...recruitmentQuery( + filterToMongoValues(this.filters[RECRUITMENT_STATUS_KEY]) + ), + }) + + return filterQueries + } + #requestedFilters = () => { + const allFilters = { + ...DEFAULT_FILTERS, + sites: this.allSites.reduce((acc, site) => { + acc[site] = { label: site, value: 0 } + return acc + }, {}), + } + return Object.keys(allFilters).reduce((sanitizedFilters, key) => { + sanitizedFilters[key] = Object.keys(allFilters[key]).reduce( + (sanitizedFilters, reqFilter) => { + if (this._filters[key] && this._filters[key][reqFilter]) { + const { label, value } = this._filters[key][reqFilter] + sanitizedFilters[reqFilter] = { label, value: Number(value) } + } else { + sanitizedFilters[reqFilter] = { + label: allFilters[key][reqFilter].label, + value: 0, + } + } + return sanitizedFilters + }, + {} + ) + return sanitizedFilters + }, {}) + } + get requestedSites() { + const { sites } = this.filters + + return Object.keys(sites).filter((key) => sites[key].value === 1) + } +} + +export default FiltersService diff --git a/server/utils/browserUtil.js b/server/utils/browserUtil.js new file mode 100644 index 00000000..8645f033 --- /dev/null +++ b/server/utils/browserUtil.js @@ -0,0 +1,3 @@ +const isBrowser = () => typeof window !== 'undefined' + +export { isBrowser } diff --git a/server/utils/crypto/hash.js b/server/utils/crypto/hash.js new file mode 100755 index 00000000..327be266 --- /dev/null +++ b/server/utils/crypto/hash.js @@ -0,0 +1,43 @@ +import { + randomBytes, + createCipheriv, + createDecipheriv, + pbkdf2Sync, +} from 'crypto' + +// Provided for key-based encryption. Don't use encrypt and decrypt for passwords! +const encrypt = (text, algorithm, secret) => { + const iv = randomBytes(16) + const secret32 = Buffer.concat([Buffer.from(secret), Buffer.alloc(32)], 32) + const cipher = createCipheriv(algorithm, secret32, iv) + let crypted = cipher.update(text) + crypted = Buffer.concat([crypted, cipher.final()]) + return iv.toString('hex') + ':' + crypted.toString('hex') +} + +const decrypt = (text, algorithm, secret) => { + const splitText = text.split(':') + const iv = Buffer.from(splitText.shift(), 'hex') + const encryptedText = Buffer.from(splitText.join(':'), 'hex') + const secret32 = Buffer.concat([Buffer.from(secret), Buffer.alloc(32)], 32) + const decipher = createDecipheriv(algorithm, secret32, iv) + let decrypted = decipher.update(encryptedText) + decrypted = Buffer.concat([decrypted, decipher.final()]) + return decrypted.toString() +} + +// Use these for passwords. +const hash = (text) => { + const salt = randomBytes(16).toString('hex') + const hash = pbkdf2Sync(text, salt, 2048, 32, 'sha512').toString('hex') + return [salt, hash].join('$') +} + +const verifyHash = (text, original) => { + const originalHash = original.split('$')[1] + const salt = original.split('$')[0] + const hash = pbkdf2Sync(text, salt, 2048, 32, 'sha512').toString('hex') + return hash === originalHash +} + +export { encrypt, decrypt, hash, verifyHash } diff --git a/server/utils/dateConverter.js b/server/utils/dateConverter.js new file mode 100644 index 00000000..29af3feb --- /dev/null +++ b/server/utils/dateConverter.js @@ -0,0 +1,20 @@ +const stringToDate = (_date, _format, _delimiter) => { + const formatLowerCase = _format.toLowerCase() + const formatItems = formatLowerCase.split(_delimiter) + const dateItems = _date.split(_delimiter) + const monthIndex = formatItems.indexOf('mm') + const dayIndex = formatItems.indexOf('dd') + const yearIndex = formatItems.indexOf('yyyy') + let month = parseInt(dateItems[monthIndex], 10) + const year = + dateItems[yearIndex].length === 2 + ? '20' + dateItems[yearIndex] + : dateItems[yearIndex] + return new Date(year, --month, dateItems[dayIndex]) +} +const diffDates = (date1, date2) => { + const millisecondsPerDay = 24 * 60 * 60 * 1000 + return Math.round((date2 - date1) / millisecondsPerDay) +} + +export { diffDates, stringToDate } diff --git a/server/utils/defaultTargetValueMap.js b/server/utils/defaultTargetValueMap.js new file mode 100644 index 00000000..a7d03e15 --- /dev/null +++ b/server/utils/defaultTargetValueMap.js @@ -0,0 +1,8 @@ +const DISALLOWED_STUDIES = ['combined', 'files'] +const allowedStudies = (study) => !DISALLOWED_STUDIES.includes(study) + +export const defaultTargetValueMap = (studyList) => + studyList.filter(allowedStudies).reduce((targets, study) => { + targets[study] = '' + return targets + }, {}) diff --git a/server/utils/inputHandlers.js b/server/utils/inputHandlers.js new file mode 100644 index 00000000..9d87599e --- /dev/null +++ b/server/utils/inputHandlers.js @@ -0,0 +1,4 @@ +export const handleNumberStringInput = (input) => { + const regex = new RegExp(/^[0-9]+$/) + return regex.test(input) ? parseFloat(input) : input +} diff --git a/server/utils/invertColor.js b/server/utils/invertColor.js new file mode 100644 index 00000000..c94b00c4 --- /dev/null +++ b/server/utils/invertColor.js @@ -0,0 +1,28 @@ +/* http://stackoverflow.com/a/35970186 */ +const padZero = (str, len) => { + len = len || 2 + const zeros = new Array(len).join('0') + + return (zeros + str).slice(-len) +} +const getColor = (hex, bw) => { + if (hex.indexOf('#') === 0) { + hex = hex.slice(1) + } + + let r = parseInt(hex.slice(0, 2), 16) + let g = parseInt(hex.slice(2, 4), 16) + let b = parseInt(hex.slice(4, 6), 16) + + if (bw) { + return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF' + } + + r = (255 - r).toString(16) + g = (255 - g).toString(16) + b = (255 - b).toString(16) + + return '#' + padZero(r) + padZero(g) + padZero(b) +} + +export { getColor } diff --git a/server/utils/mongoCollections.js b/server/utils/mongoCollections.js new file mode 100644 index 00000000..ba4d42a4 --- /dev/null +++ b/server/utils/mongoCollections.js @@ -0,0 +1,10 @@ +export const collections = { + charts: 'charts', + configs: 'configs', + metadata: 'metadata', + toc: 'toc', + users: 'users', + assessmentDayData: 'assessmentDayData', + assessments: 'assessments', + assessmentVariables: 'assessmentVariables', +} diff --git a/server/utils/passport/ensure-admin.js b/server/utils/passport/ensure-admin.js new file mode 100644 index 00000000..b3ea432f --- /dev/null +++ b/server/utils/passport/ensure-admin.js @@ -0,0 +1,18 @@ +import UserModel from '../../models/UserModel' + +export default async function ensureAdmin(req, res, next) { + try { + if (!req.isAuthenticated()) + return res.status(401).json({ error: 'Please login' }) + + const { appDb } = req.app.locals + req.user = await UserModel.findOne(appDb, { uid: req.user.uid }) + + if (req.user.role !== 'admin') + return res.status(401).json({ error: 'Incorrect access level.' }) + + return next() + } catch (error) { + return res.status(401).json({ error: error.message }) + } +} diff --git a/server/utils/passport/ensure-api-authenticated.js b/server/utils/passport/ensure-api-authenticated.js new file mode 100644 index 00000000..650900bd --- /dev/null +++ b/server/utils/passport/ensure-api-authenticated.js @@ -0,0 +1,36 @@ +import { timingSafeEqual } from 'crypto' + +export function ensureApiAuthenticated(req, res, next) { + const apiUsers = process.env.IMPORT_API_USERS.split(',') + const apiKeys = process.env.IMPORT_API_KEYS.split(',') + + const userHeader = req.headers['x-api-user'] + const keyHeader = req.headers['x-api-key'] + + if (!userHeader || !keyHeader) { + return res.status(401).send({ error: 'Unauthorized' }) + } + + let isAuthenticated = false + apiUsers.forEach((apiUser, index) => { + const apiUserBuffer = Buffer.from(apiUser, 'utf8') + const userHeaderBuffer = Buffer.from(userHeader, 'utf8') + if (apiUserBuffer.length === userHeaderBuffer.length) { + if (timingSafeEqual(apiUserBuffer, userHeaderBuffer)) { + const apiKeyBuffer = Buffer.from(apiKeys[index], 'utf8') + const keyHeaderBuffer = Buffer.from(keyHeader, 'utf8') + if (apiKeyBuffer.length === keyHeaderBuffer.length) { + if (timingSafeEqual(apiKeyBuffer, keyHeaderBuffer)) { + isAuthenticated = true + } + } + } + } + }) + + if (!isAuthenticated) { + return res.status(401).send({ error: 'Unauthorized' }) + } + + return next() +} diff --git a/server/utils/passport/ensure-authenticated.js b/server/utils/passport/ensure-authenticated.js new file mode 100644 index 00000000..9d39a147 --- /dev/null +++ b/server/utils/passport/ensure-authenticated.js @@ -0,0 +1,29 @@ +import { isAccountExpired } from './helpers' +import { logout } from './logout' +import UserModel from '../../models/UserModel' + +export default async function ensureAuthenticated(req, res, next) { + if (!req.isAuthenticated()) + return res.status(401).json({ error: 'Please login' }) + + const { appDb } = req.app.locals + req.user = await UserModel.findOne(appDb, { uid: req.user.uid }) + + const { account_expires, blocked, access, role } = req.user + + switch (true) { + case isAccountExpired(account_expires, role): + logout(req, res, next) + + return res.status(401).json({ error: 'Account is expired' }) + + case !!blocked: + return res + .status(403) + .json({ error: 'Account is blocked, please contact your admin' }) + case access.length === 0: + return res.status(403).json({ error: 'Forbidden.' }) + default: + return next() + } +} diff --git a/server/utils/passport/ensure-user.js b/server/utils/passport/ensure-user.js new file mode 100644 index 00000000..8e4f360e --- /dev/null +++ b/server/utils/passport/ensure-user.js @@ -0,0 +1,16 @@ +import UserModel from '../../models/UserModel' + +export default async function ensureUser(req, res, next) { + if (!req.isAuthenticated()) { + return res.status(401).json({ error: 'Unathorized' }) + } + + const { appDb } = req.app.locals + req.user = await UserModel.findOne(appDb, { uid: req.user.uid }) + + if (req.params.uid !== req.user.uid) { + return res.status(400).json({ error: 'Bad Request' }) + } else { + return next() + } +} diff --git a/server/utils/passport/ensureStudyPermission.js b/server/utils/passport/ensureStudyPermission.js new file mode 100644 index 00000000..f24bfa89 --- /dev/null +++ b/server/utils/passport/ensureStudyPermission.js @@ -0,0 +1,22 @@ +import UserModel from '../../models/UserModel' + +export default async function ensureStudyPermission(req, res, next) { + if (!req.isAuthenticated()) + return res.status(401).json({ error: 'Unauthorized' }) + + try { + const { appDb } = req.app.locals + const { study } = req.params + req.user = await UserModel.findOne(appDb, { uid: req.user.uid }) + const { blocked, access } = req.user + const isStudyInAccess = access.includes(study) + + if (!isStudyInAccess) return res.status(401).json({ error: 'Unauthorized' }) + + if (blocked) return res.status(403).json({ error: 'Forbidden' }) + + return next() + } catch (error) { + return res.status(400).json({ error: error.message }) + } +} diff --git a/server/utils/passport/helpers.js b/server/utils/passport/helpers.js new file mode 100644 index 00000000..ac11e29b --- /dev/null +++ b/server/utils/passport/helpers.js @@ -0,0 +1,13 @@ +import dayjs from 'dayjs' + +import { ADMIN_ROLE } from '../../constants' + +export const isAccountExpired = (accountExpires, role) => { + if (role === ADMIN_ROLE) return false + if (accountExpires === null) return true + + const today = dayjs() + const accountExpirationTodayjs = dayjs(accountExpires) + + return accountExpirationTodayjs.isBefore(today) +} diff --git a/server/utils/passport/helpers.test.js b/server/utils/passport/helpers.test.js new file mode 100644 index 00000000..35dd2fc0 --- /dev/null +++ b/server/utils/passport/helpers.test.js @@ -0,0 +1,21 @@ +import * as helpers from './helpers' + +describe('helpers', () => { + describe(helpers.isAccountExpired, () => { + it('returns false if user role is admin', () => { + expect(helpers.isAccountExpired(null, 'admin')).toEqual(false) + }) + + it('returns false when user is not an admin and account is current', () => { + expect(helpers.isAccountExpired('2122-08-21', 'member')).toEqual(false) + }) + + it('returns true if user role is not admin and account is expired', () => { + expect(helpers.isAccountExpired('2022-08-21', 'member')).toEqual(true) + }) + + it('returns true if user account is expired is not set', () => { + expect(helpers.isAccountExpired(null, 'member')).toEqual(true) + }) + }) +}) diff --git a/server/utils/passport/logout.js b/server/utils/passport/logout.js new file mode 100644 index 00000000..7b50c8a6 --- /dev/null +++ b/server/utils/passport/logout.js @@ -0,0 +1,11 @@ +export const logout = (req, res, next) => { + res.clearCookie('connect.sid') + + req.logout(function (err) { + if (err) return next(err) + + req.session.destroy(function (sessionError) { + if (sessionError) return next(sessionError) + }) + }) +} diff --git a/server/utils/routes.js b/server/utils/routes.js new file mode 100644 index 00000000..8fcaa28f --- /dev/null +++ b/server/utils/routes.js @@ -0,0 +1,69 @@ +const v1Root = `/api/v1` +const userRoot = `${v1Root}/users/:uid` + +export const routes = { + root: `/`, + chart: '/charts/:chart_id', + charts: '/charts', + editChart: '/charts/:chart_id/edit', + login: `/login`, + signup: `/signup`, + logout: `/logout`, +} + +export const v1Routes = { + assessments: { + index: `${v1Root}/assessments`, + }, + assessmentData: { + index: `${v1Root}/import/data/day`, + }, + auth: { + me: `${v1Root}/me`, + login: `${v1Root}/login`, + logout: `${v1Root}/logout`, + signup: `${v1Root}/signup`, + resetpw: `${v1Root}/resetpw`, + }, + chartsData: { + show: `${v1Root}/charts/:chart_id/data`, + }, + charts: { + show: `${v1Root}/charts/:chart_id`, + index: `${v1Root}/charts`, + }, + chartsDuplicate: { + index: `${v1Root}/charts/duplicate`, + }, + chartsShare: { + index: `${v1Root}/charts/:chart_id/share`, + }, + config: { + index: `${userRoot}/configs`, + show: `${userRoot}/configs/:config_id`, + }, + admin: { + users: { + show: `${v1Root}/admin/users/:uid`, + }, + studies: { + index: `${v1Root}/admin/search/studies`, + }, + }, + dashboards: { + show: `${v1Root}/dashboards/:study/:subject`, + }, + participants: { + index: `${v1Root}/participants`, + }, + siteMetadata: { + index: `${v1Root}/import/data/metadata`, + }, + userStudies: { + index: `${v1Root}/user-studies`, + }, + users: { + index: `${v1Root}/users`, + show: userRoot, + }, +} diff --git a/server/utils/siteNames.js b/server/utils/siteNames.js new file mode 100644 index 00000000..b99a7bcf --- /dev/null +++ b/server/utils/siteNames.js @@ -0,0 +1,42 @@ +export const SITE_NAMES = { + ME: 'Melbourne', + AD: 'Adelaide', + PE: 'Perth', + JE: 'Jena', + CP: 'Copenhagen', + BM: 'Birmingham', + AM: 'Amsterdam', + LS: 'Lausanne', + GW: 'Gwangju', + SG: 'Singapore', + HK: 'Hong Kong', + CG: 'Cologne', + ST: 'Santiago', + LA: 'UCLA', + OR: 'Oregon', + BI: 'BIDMC', + NL: 'Northwell', + NC: 'UNC', + SD: 'UCSD', + CA: 'Calgary', + YA: 'Yale', + SF: 'UCSF', + PA: 'Penn', + SI: 'Mt. Sinai', + PI: 'Pittsburgh', + NN: 'Northwestern', + IR: 'UC Irvine', + TE: 'Temple', + GA: 'Georgia', + WU: 'WashU', + HA: 'Hartford', + MT: 'Montreal', + KC: "King's College London", + PV: 'Pavia', + MA: 'Madrid', + CM: 'Cambridge UK', + MU: 'Munich', + SH: 'Shanghai', + SL: 'Seoul', + Totals: 'Totals', +} diff --git a/server/utils/userUpdatedSiteList.js b/server/utils/userUpdatedSiteList.js new file mode 100644 index 00000000..2a0d056a --- /dev/null +++ b/server/utils/userUpdatedSiteList.js @@ -0,0 +1,8 @@ +const DISALLOWED_STUDIES = ['combined', 'files', 'ProNet'] +const allowedStudies = (study) => !DISALLOWED_STUDIES.includes(study) + +export const recentStudyList = (studyList) => + studyList.filter(allowedStudies).reduce((targets, study) => { + targets[study] = '' + return targets + }, {}) diff --git a/singularity/Singularity b/singularity/Singularity deleted file mode 100644 index 6303b70d..00000000 --- a/singularity/Singularity +++ /dev/null @@ -1,82 +0,0 @@ -Bootstrap:docker -From:centos:7.4.1708 - -%environment -export PATH=/sw/apps/miniconda/bin:$PATH - -%labels -AUTHOR jisoolily_jeong@harvard.edu -AUTHOR timothy_okeefe@harvard.edu -AUTHOR hhoke@fas.harvard.edu - -%post -## Set data path -mkdir -p /data/dpdash - -## set web proxies if necessary -#export http_proxy="" -#export https_proxy="" -#export no_proxy="localhost" - -## update yum and install some useful things -yum -y update -yum clean all -yum -y groupinstall "Development tools" -yum -y install net-tools telnet wget git tar which whereis bzip2 p7zip vim vi vixie-cron cronie sudo - -## install the RabbitMQ message queue -wget https://github.com/rabbitmq/erlang-rpm/releases/download/v19.3.6.13/erlang-19.3.6.13-1.el7.centos.x86_64.rpm -yum -y install erlang-19.3.6.13-1.el7.centos.x86_64.rpm -wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-3.6.9-1.el6.noarch.rpm -rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc -yum -y install rabbitmq-server-3.6.9-1.el6.noarch.rpm - -## install the Miniconda Python distribution -curl https://repo.continuum.io/miniconda/Miniconda2-4.3.21-Linux-x86_64.sh -o /tmp/conda.sh -bash /tmp/conda.sh -p /sw/apps/miniconda -b && rm /tmp/conda.sh -export PATH=/sw/apps/miniconda/bin:$PATH - -## install the Node.js run-time -curl --silent --location https://rpm.nodesource.com/setup_9.x | bash - -yum -y install nodejs - -# set npm proxy if necessary -#npm config set proxy "" -#npm config set https-proxy "" - -## set npm version -npm cache clean -f -npm install -g n -n 9.11.2 - -## install the MongoDB document database -mkdir -p /etc/yum.repos.d -cat >> /etc/yum.repos.d/mongodb-org-3.4.repo <<- 'EOF' -[mongodb-org-3.4] -name=MongoDB Repository -baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/ -gpgcheck=1 -enabled=1 -gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc -EOF -yum install -y mongodb-org - -## install the Celery asyncronous task queue -pip install celery - -## install the DPdash digital phenotyping dashboard -mkdir -p /sw/apps/dpdash && cd /sw/apps/dpdash -git clone https://ncfcode.rc.fas.harvard.edu/dpdash/dpdash.git . -rm -rf ./node_modules -npm install --save . -npm run build -rm -rf ./.git - -## install the DPPY DPdash file scanner/importer -mkdir -p /sw/apps/dppy && cd /sw/apps/dppy -git clone https://ncfcode.rc.fas.harvard.edu/dpdash/dppy.git . -pip install -r requirements.txt -rm -rf ./.git - -## install Supervisord process control system -easy_install supervisor diff --git a/singularity/configs/config.schema b/singularity/configs/config.schema deleted file mode 100755 index 62135e1e..00000000 --- a/singularity/configs/config.schema +++ /dev/null @@ -1,45 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Configuration", - "description": "DPdash configuration file", - "type": "array", - "items": { - "title": "row", - "description": "Configuration file row", - "type": "object", - "properties": { - "data_type": { - "description": "Data type name", - "type": "string", - "pattern": "^[a-zA-Z]+$" - }, - "assessment": { - "description": "Assessment name", - "type": "string", - "pattern": "^[a-zA-Z_]+$" - }, - "variable": { - "description": "Variable description", - "type": "string", - "pattern": "^[a-zA-Z_]+$" - }, - "alias": { - "description": "Alias", - "type": "string" - }, - "range": { - "description": "Tick marks", - "type": "array", - "uniqueItems": true, - "items": { - "type": "number" - } - }, - "colorbar": { - "description": "Color bar", - "enum": ["YlGn", "RdYlBu", "RdBu"] - } - }, - "required": ["data_type", "assessment", "variable", "alias", "range"] - } -} diff --git a/singularity/configs/defaultStudyConfig.js b/singularity/configs/defaultStudyConfig.js deleted file mode 100644 index cf1f44a1..00000000 --- a/singularity/configs/defaultStudyConfig.js +++ /dev/null @@ -1,76 +0,0 @@ -var configs = {}; -configs.colormap = [ - { - category : "daily_survey", - analysis : "timestamp", - variable : "daily_surveyAnswers_hours_since_1", - label : "daily_survey", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "daily_survey", - analysis : "questionnaireStat", - variable : "DAILY_1_NUM_UNANSWERED", - label : "unanswered_num", - range : [0, 10], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "voice", - analysis : "timestamp", - variable : "daily_voiceRecording_hours_since_1", - label : "daily_voice", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "weekly_survey", - analysis : "timestamp", - variable : "weekly_surveyAnswers_hours_since_1", - label : "weekly_survey", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "weekly_survey", - analysis : "questionnaireStat", - variable : "WEEKLY_1_NUM_UNANSWERED", - label : "unanswered_num", - range : [0, 10], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "actigraphy", - analysis : "Geneactivwrist", - variable : "button", - label : "button", - range : [10, 50], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text: true - }, - { - category : "balancesheet", - analysis : "balancesheetGps", - variable : "gps_count", - label : "gps_file_count", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text : true - }, - { - category : "balancesheet", - analysis : "balancesheetAccel", - variable : "accel_count", - label : "accel_file_count", - range : [0, 24], - color : ["#ffffd9", "#edf8b1", "#c7e9b4", "#7fcdbb", "#41b6c4", "#1d91c0", "#225ea8", "#253494", "#081d58"], - text : true - } - ]; -module.exports = configs; diff --git a/singularity/configs/defaultUserConfig.js b/singularity/configs/defaultUserConfig.js deleted file mode 100644 index ee65b447..00000000 --- a/singularity/configs/defaultUserConfig.js +++ /dev/null @@ -1,1949 +0,0 @@ -var userConfig = {}; -userConfig.colormap =[ - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_00_filesize", - label : "callLog_00HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_01_filesize", - label : "callLog_01HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_02_filesize", - label : "callLog_02HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_03_filesize", - label : "callLog_03HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_04_filesize", - label : "callLog_04HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_05_filesize", - label : "callLog_05HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_06_filesize", - label : "callLog_06HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_07_filesize", - label : "callLog_07HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_08_filesize", - label : "callLog_08HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_09_filesize", - label : "callLog_09HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_10_filesize", - label : "callLog_10HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_11_filesize", - label : "callLog_11HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_12_filesize", - label : "callLog_12HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_13_filesize", - label : "callLog_13HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_14_filesize", - label : "callLog_14HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_15_filesize", - label : "callLog_15HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_16_filesize", - label : "callLog_16HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_17_filesize", - label : "callLog_17HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_18_filesize", - label : "callLog_18HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_19_filesize", - label : "callLog_19HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_20_filesize", - label : "callLog_20HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_21_filesize", - label : "callLog_21HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_22_filesize", - label : "callLog_22HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "callLog", - analysis : "balancesheetCalllog", - variable : "callLog_hour_23_filesize", - label : "callLog_23HR", - range : [165, 565], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_00_filesize", - label : "textsLog_00HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_01_filesize", - label : "textsLog_01HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_02_filesize", - label : "textsLog_02HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_03_filesize", - label : "textsLog_03HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_04_filesize", - label : "textsLog_04HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_05_filesize", - label : "textsLog_05HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_06_filesize", - label : "textsLog_06HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_07_filesize", - label : "textsLog_07HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_08_filesize", - label : "textsLog_08HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_09_filesize", - label : "textsLog_09HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_10_filesize", - label : "textsLog_10HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_11_filesize", - label : "textsLog_11HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_12_filesize", - label : "textsLog_12HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_13_filesize", - label : "textsLog_13HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_14_filesize", - label : "textsLog_14HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_15_filesize", - label : "textsLog_15HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_16_filesize", - label : "textsLog_16HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_17_filesize", - label : "textsLog_17HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_18_filesize", - label : "textsLog_18HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_19_filesize", - label : "textsLog_19HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_20_filesize", - label : "textsLog_20HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_21_filesize", - label : "textsLog_21HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_22_filesize", - label : "textsLog_22HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "textsLog", - analysis : "balancesheetTextslog", - variable : "textsLog_hour_23_filesize", - label : "textsLog_23HR", - range : [174, 2524], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_00_filesize", - label : "surveyAnswers_00HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_01_filesize", - label : "surveyAnswers_01HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_02_filesize", - label : "surveyAnswers_02HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_03_filesize", - label : "surveyAnswers_03HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_04_filesize", - label : "surveyAnswers_04HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_05_filesize", - label : "surveyAnswers_05HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_06_filesize", - label : "surveyAnswers_06HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_07_filesize", - label : "surveyAnswers_07HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_08_filesize", - label : "surveyAnswers_08HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_09_filesize", - label : "surveyAnswers_09HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_10_filesize", - label : "surveyAnswers_10HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_11_filesize", - label : "surveyAnswers_11HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_12_filesize", - label : "surveyAnswers_12HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_13_filesize", - label : "surveyAnswers_13HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_14_filesize", - label : "surveyAnswers_14HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_15_filesize", - label : "surveyAnswers_15HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_16_filesize", - label : "surveyAnswers_16HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_17_filesize", - label : "surveyAnswers_17HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_18_filesize", - label : "surveyAnswers_18HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_19_filesize", - label : "surveyAnswers_19HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_20_filesize", - label : "surveyAnswers_20HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_21_filesize", - label : "surveyAnswers_21HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_22_filesize", - label : "surveyAnswers_22HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "surveyAnswers", - analysis : "balancesheetSurveyanswers", - variable : "surveyAnswers_hour_23_filesize", - label : "surveyAnswers_23HR", - range : [7400, 13300], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_00_filesize", - label : "voiceRecording_00HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_01_filesize", - label : "voiceRecording_01HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_02_filesize", - label : "voiceRecording_02HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_03_filesize", - label : "voiceRecording_03HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_04_filesize", - label : "voiceRecording_04HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_05_filesize", - label : "voiceRecording_05HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_06_filesize", - label : "voiceRecording_06HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_07_filesize", - label : "voiceRecording_07HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_08_filesize", - label : "voiceRecording_08HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_09_filesize", - label : "voiceRecording_09HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_10_filesize", - label : "voiceRecording_10HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_11_filesize", - label : "voiceRecording_11HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_12_filesize", - label : "voiceRecording_12HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_13_filesize", - label : "voiceRecording_13HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_14_filesize", - label : "voiceRecording_14HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_15_filesize", - label : "voiceRecording_15HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_16_filesize", - label : "voiceRecording_16HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_17_filesize", - label : "voiceRecording_17HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_18_filesize", - label : "voiceRecording_18HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_19_filesize", - label : "voiceRecording_19HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_20_filesize", - label : "voiceRecording_20HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_21_filesize", - label : "voiceRecording_21HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_22_filesize", - label : "voiceRecording_22HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "voiceRecording", - analysis : "balancesheetVoicerecording", - variable : "voiceRecording_hour_23_filesize", - label : "voiceRecording_23HR", - range : [249566, 648577], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_00_filesize", - label : "powerState_00HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_01_filesize", - label : "powerState_01HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_02_filesize", - label : "powerState_02HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_03_filesize", - label : "powerState_03HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_04_filesize", - label : "powerState_04HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_05_filesize", - label : "powerState_05HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_06_filesize", - label : "powerState_06HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_07_filesize", - label : "powerState_07HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_08_filesize", - label : "powerState_08HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_09_filesize", - label : "powerState_09HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_10_filesize", - label : "powerState_10HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_11_filesize", - label : "powerState_11HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_12_filesize", - label : "powerState_12HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_13_filesize", - label : "powerState_13HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_14_filesize", - label : "powerState_14HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_15_filesize", - label : "powerState_15HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_16_filesize", - label : "powerState_16HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_17_filesize", - label : "powerState_17HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_18_filesize", - label : "powerState_18HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_19_filesize", - label : "powerState_19HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_20_filesize", - label : "powerState_20HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_21_filesize", - label : "powerState_21HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_22_filesize", - label : "powerState_22HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "powerState", - analysis : "balancesheetPowerstate", - variable : "powerState_hour_23_filesize", - label : "powerState_23HR", - range : [77, 2680], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_00_filesize", - label : "gps_00HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_01_filesize", - label : "gps_01HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_02_filesize", - label : "gps_02HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_03_filesize", - label : "gps_03HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_04_filesize", - label : "gps_04HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_05_filesize", - label : "gps_05HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_06_filesize", - label : "gps_06HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_07_filesize", - label : "gps_07HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_08_filesize", - label : "gps_08HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_09_filesize", - label : "gps_09HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_10_filesize", - label : "gps_10HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_11_filesize", - label : "gps_11HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_12_filesize", - label : "gps_12HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_13_filesize", - label : "gps_13HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_14_filesize", - label : "gps_14HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_15_filesize", - label : "gps_15HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_16_filesize", - label : "gps_16HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_17_filesize", - label : "gps_17HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_18_filesize", - label : "gps_18HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_19_filesize", - label : "gps_19HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_20_filesize", - label : "gps_20HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_21_filesize", - label : "gps_21HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_22_filesize", - label : "gps_22HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "gps", - analysis : "balancesheetGps", - variable : "gps_hour_23_filesize", - label : "gps_23HR", - range : [37500, 60000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_00_filesize", - label : "accel_00HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_01_filesize", - label : "accel_01HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_02_filesize", - label : "accel_02HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_03_filesize", - label : "accel_03HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_04_filesize", - label : "accel_04HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_05_filesize", - label : "accel_05HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_06_filesize", - label : "accel_06HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_07_filesize", - label : "accel_07HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_08_filesize", - label : "accel_08HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_09_filesize", - label : "accel_09HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_10_filesize", - label : "accel_10HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_11_filesize", - label : "accel_11HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_12_filesize", - label : "accel_12HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_13_filesize", - label : "accel_13HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_14_filesize", - label : "accel_14HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_15_filesize", - label : "accel_15HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_16_filesize", - label : "accel_16HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_17_filesize", - label : "accel_17HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_18_filesize", - label : "accel_18HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_19_filesize", - label : "accel_19HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_20_filesize", - label : "accel_20HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_21_filesize", - label : "accel_21HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_22_filesize", - label : "accel_22HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "accel", - analysis : "balancesheetAccel", - variable : "accel_hour_23_filesize", - label : "accel_23HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_00_filesize", - label : "wifiLog_00HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_01_filesize", - label : "wifiLog_01HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_02_filesize", - label : "wifiLog_02HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_03_filesize", - label : "wifiLog_03HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_04_filesize", - label : "wifiLog_04HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_05_filesize", - label : "wifiLog_05HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_06_filesize", - label : "wifiLog_06HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_07_filesize", - label : "wifiLog_07HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_08_filesize", - label : "wifiLog_08HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_09_filesize", - label : "wifiLog_09HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_10_filesize", - label : "wifiLog_10HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_11_filesize", - label : "wifiLog_11HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_12_filesize", - label : "wifiLog_12HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_13_filesize", - label : "wifiLog_13HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_14_filesize", - label : "wifiLog_14HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_15_filesize", - label : "wifiLog_15HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_16_filesize", - label : "wifiLog_16HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_17_filesize", - label : "wifiLog_17HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_18_filesize", - label : "wifiLog_18HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_19_filesize", - label : "wifiLog_19HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_20_filesize", - label : "wifiLog_20HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_21_filesize", - label : "wifiLog_21HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_22_filesize", - label : "wifiLog_22HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "wifiLog", - analysis : "balancesheetWifilog", - variable : "wifiLog_hour_23_filesize", - label : "wifiLog_23HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_00_filesize", - label : "bluetoothLog_00HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_01_filesize", - label : "bluetoothLog_01HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_02_filesize", - label : "bluetoothLog_02HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_03_filesize", - label : "bluetoothLog_03HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_04_filesize", - label : "bluetoothLog_04HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_05_filesize", - label : "bluetoothLog_05HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_06_filesize", - label : "bluetoothLog_06HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_07_filesize", - label : "bluetoothLog_07HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_08_filesize", - label : "bluetoothLog_08HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_09_filesize", - label : "bluetoothLog_09HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_10_filesize", - label : "bluetoothLog_10HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_11_filesize", - label : "bluetoothLog_11HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_12_filesize", - label : "bluetoothLog_12HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_13_filesize", - label : "bluetoothLog_13HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_14_filesize", - label : "bluetoothLog_14HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_15_filesize", - label : "bluetoothLog_15HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_16_filesize", - label : "bluetoothLog_16HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_17_filesize", - label : "bluetoothLog_17HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_18_filesize", - label : "bluetoothLog_18HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_19_filesize", - label : "bluetoothLog_19HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_20_filesize", - label : "bluetoothLog_20HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_21_filesize", - label : "bluetoothLog_21HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_22_filesize", - label : "bluetoothLog_22HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - }, - { - category : "bluetoothLog", - analysis : "balancesheetBluetoothlog", - variable : "bluetoothLog_hour_23_filesize", - label : "bluetoothLog_23HR", - range : [1711938, 2000000], - color : ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"], - text : false - } -]; -module.exports = userConfig; - diff --git a/singularity/configure.py b/singularity/configure.py deleted file mode 100755 index 083be34b..00000000 --- a/singularity/configure.py +++ /dev/null @@ -1,229 +0,0 @@ -#!/usr/b n/env python - -import argparse as ap -import os -import logging - -logger = logging.getLogger(os.path.basename(__file__)) -logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') - -def main(): - parser = ap.ArgumentParser('DPdash Configuration') - - parser.add_argument('--data-dir', help='Path to the root directory for GENERAL and PROTECTED folders') - parser.add_argument('--config-dir', help='Path to the directory for all configuration files') - parser.add_argument('--mongo-pw', help='MongoDB password for username dpdash') - parser.add_argument('--rabbit-username', help='RabbitMQ username') - parser.add_argument('--rabbit-pw', help='RabbitMQ password') - parser.add_argument('--ssl-ca', help='Path to the ssl CA in PEM') - parser.add_argument('--ssl-client-cert', help='Path to the client ssl certificate') - parser.add_argument('--ssl-client-key', help='Path to the client ssl key') - parser.add_argument('--ssl-server-cert', help='Path to the server ssl certificate') - parser.add_argument('--ssl-server-key', help='Path to the server ssl key') - parser.add_argument('--mongo-server-cert', help='Path to the MongoDB certificate') - parser.add_argument('--mongo-path', help='Path to the MongoDB bind path') - parser.add_argument('--celery-path', help='Path to the Celery bind path') - parser.add_argument('--dpdash-path', help='Path to the DPdash bind path') - - parser.add_argument('--rabbit-host', help='Rabbitmq host address') - parser.add_argument('--mongo-host', help='MongoDB host address') - parser.add_argument('--rabbit-port', help='Rabbitmq port number', default=5671) - parser.add_argument('--mongo-port', help='MongoDB port number', default=27017) - parser.add_argument('--dpdash-port', help='DPdash port number', default=8000) - - parser.add_argument('--dpdash-secret', help='DPdash session secret') - parser.add_argument('--app-secret', help='App secret') - - args = parser.parse_args() - - configure_rabbit(args.rabbit_port, args.ssl_ca, args.ssl_server_cert, args.ssl_server_key, args.config_dir) - configure_mongo(args.mongo_port, args.mongo_path, args.ssl_ca, args.mongo_server_cert, args.config_dir) - configure_dppy(args.rabbit_port, args.celery_path, args.ssl_client_key, args.ssl_client_cert, args.ssl_ca, args.config_dir, args.rabbit_pw, args.rabbit_host) - configure_dpdash(args.ssl_ca, args.ssl_client_key, args.ssl_client_cert, args.dpdash_port, args.mongo_port, args.rabbit_port, args.mongo_pw, args.rabbit_pw, args.dpdash_secret, args.config_dir, args.data_dir, args.dpdash_path, args.rabbit_host, args.mongo_host, args.app_secret) - -def export_file(file_path, content): - try: - with open(file_path, 'w') as writeable: - logger.info('Writing {FILE}'.format(FILE=file_path)) - writeable.write(content) - except Exception as e: - logger.error(e) - - return - -def configure_rabbit(rabbit_port, ca_path, cert_path, key_path, config_path): - configuration = '''[ - {ssl, [{versions, ['tlsv1.2', 'tlsv1.1']}]}, - {rabbit, [ - {ssl_listeners, [%(rabbit_port)s]}, - {ssl_options, [{cacertfile, "%(ca_path)s"}, - {certfile, "%(cert_path)s"}, - {keyfile, "%(key_path)s"}, - {versions, ['tlsv1.2','tlsv1.1']}, - {verify, verify_peer}, - {fail_if_no_peer_cert, true}]} - ]} -].''' % { 'rabbit_port' : rabbit_port, 'ca_path' : ca_path, 'cert_path' : cert_path, 'key_path' : key_path } - - return export_file(os.path.join(config_path,'rabbitmq.config'), configuration) - -def configure_mongo(mongo_port, mongo_path, ca_path, mongocert_path, config_path): - configuration = '''auth = true -fork = false -port = %(mongo_port)s -dbpath = %(mongo_path)s/dbs/ -logappend = true -logpath = %(mongo_path)s/logs/mongodb.log -sslMode = requireSSL -sslPEMKeyFile = %(mongocert_path)s -sslCAFile = %(ca_path)s''' % { 'mongo_port' : mongo_port, 'mongo_path' : mongo_path, 'mongocert_path' : mongocert_path, 'ca_path' : ca_path } - - return export_file(os.path.join(config_path, 'mongodb.conf'), configuration) - -def configure_dppy(rabbit_port, celery_path, key_path, cert_path, ca_path, config_path, rabbit_pw, rabbit_host): - configuration = '''{ - "celery" : { - "queue" : "dpdash", - "broker" : "amqp://dpdash:%(rabbit_pw)s@%(rabbit_host)s:%(rabbit_port)s//", - "backend" : "amqp://dpdash:%(rabbit_pw)s@%(rabbit_host)s:%(rabbit_port)s//", - "CELERY_RESULT_BACKEND" : "rpc", - "CELERY_RESULT_PERSISTENT" : true, - "CELERY_TASK_SERIALIZER" : "json", - "CELERY_RESULT_SERIALIZER" : "json", - "CELERY_IGNORE_RESULT" : false, - "CELERY_ACCEPT_CONTENT" : ["json"], - "CELERYD_STATE_DB" : "%(celery_path)s", - "BROKER_USE_SSL" : { - "keyfile": "%(key_path)s", - "certfile" : "%(cert_path)s", - "ca_certs" : "%(ca_path)s" - }, - "BROKER_TRANSPORT_OPTIONS" : { - "confirm_publish" : true - } - }, - "mongodb" : { - "ssl" : { - "ssl_certfile" : "%(cert_path)s", - "ssl_keyfile" : "%(key_path)s", - "ca_certs" : "%(ca_path)s" - } - } -}''' % { - 'rabbit_host' : rabbit_host, - 'rabbit_port' : rabbit_port, - 'celery_path' : celery_path, - 'key_path': key_path, - 'cert_path' : cert_path, - 'ca_path' : ca_path, - 'rabbit_pw':rabbit_pw - } - - return export_file(os.path.join(config_path, 'dppy.conf'), configuration) - -def configure_dpdash(ca_path, key_path, cert_path, dpdash_port, mongo_port, rabbit_port, mongo_password, rabbit_password, session_secret, config_path, data_repo, dpdash_path, rabbit_host, mongo_host, secret): - configuration = '''var fs = require("fs"); -var cert = fs.readFileSync("%(cert_path)s"); -var key = fs.readFileSync("%(key_path)s"); -var ca = [fs.readFileSync("%(ca_path)s")]; - -var config = {}; - -config.app = {}; -config.app.debug = false; -config.app.address = "0.0.0.0"; -config.app.port = %(dpdash_port)s; -config.app.logfile = "%(dpdash_log)s"; -config.app.archive = "data"; -config.app.secret = "%(secret)s"; -config.app.sslKey = "%(key_path)s"; -config.app.sslCertificate = "%(cert_path)s"; -config.app.realms = [ "" ]; -config.app.rootDir = "%(data_repo)s"; - -config.database = {}; -config.database.mongo = {}; -config.database.mongo.host = "%(mongo_host)s"; -config.database.mongo.port = %(mongo_port)s; -config.database.mongo.appDB = "dpdmongo"; -config.database.mongo.dataDB = "dpdata"; -config.database.mongo.authSource = "admin"; -config.database.mongo.username = "dpdash"; -config.database.mongo.password = "%(mongo_password)s"; - -config.database.mongo.server = {}; -config.database.mongo.server.ssl = true; -config.database.mongo.server.sslCA = ca; -config.database.mongo.server.sslCert = cert; -config.database.mongo.server.sslKey = key; -config.database.mongo.server.sslValidate = false; -config.database.mongo.server.reconnectTries = 1; -config.database.mongo.server.useNewUrlParser = true; - -config.database.acl = {}; -config.database.acl.json = "%(acl_path)s"; - -config.rabbitmq = {}; - -config.rabbitmq.host = "%(rabbit_host)s"; -config.rabbitmq.port = "%(rabbit_port)s"; -config.rabbitmq.vhost = "/"; -config.rabbitmq.username = "dpdash"; -config.rabbitmq.password = "%(rabbit_password)s"; -config.rabbitmq.publisherQueue = "dpdash"; -config.rabbitmq.consumerQueue = "dpdashResponse"; - -config.rabbitmq.opts = {}; -config.rabbitmq.opts.ca = ca; -config.rabbitmq.opts.cert = cert; -config.rabbitmq.opts.key = key; - -config.rabbitmq.sync = {}; -config.rabbitmq.sync.hours = [1]; - -config.session = {}; - -config.session.secret = "%(session_secret)s"; -config.session.saveUninitialized = false; -config.session.resave = true; - -config.session.cookie = {}; -config.session.cookie.secure = true; -config.session.cookie.maxAge = 24*60*60*1000; - -config.auth = {}; -config.auth.table = "users"; -config.auth.usernameField = "username"; -config.auth.passwordField = "password"; -config.auth.useLDAP = false; - -config.auth.ldap = {}; -config.auth.ldap.url = "ldap://0.0.0.0:000"; -config.auth.ldap.bindDn = "cn=,ou=,dc="; -config.auth.ldap.bindCredentials = "PASSWORD"; -config.auth.ldap.searchBase = "ou=,dc=,dc="; -config.auth.ldap.searchFilter = "(uid={{username}})"; -config.auth.ldap.searchAttributes = ["cn", "mail", "memberOf", "uid", "title", "department", "company", "telephoneNumber", "badPwdCount", "badPasswordTime", "lockoutTime", "whenCreated", "whenChanged", "lastLogoff", "lastLogon", "accountExpires"]; - -module.exports = config;''' % { - 'secret' : secret, - 'rabbit_host': rabbit_host, - 'mongo_host': mongo_host, - 'rabbit_port' : rabbit_port, - 'mongo_port' : mongo_port, - 'dpdash_port' : dpdash_port, - 'key_path' : key_path, - 'cert_path' : cert_path, - 'ca_path' : ca_path, - 'mongo_password' : mongo_password, - 'rabbit_password' : rabbit_password, - 'session_secret' : session_secret, - 'data_repo' : data_repo, - 'acl_path': os.path.join(dpdash_path, 'acl.json'), - 'dpdash_log': os.path.join(dpdash_path, 'dpdash.log') - } - - return export_file(os.path.join(config_path, 'dpdash.js'), configuration) - -if __name__ == '__main__': - main() diff --git a/singularity/configure.sh b/singularity/configure.sh deleted file mode 100755 index bd6745ff..00000000 --- a/singularity/configure.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# strict mode so script quits immediately upon failure -set -eo pipefail - -sudo /sbin/sysctl -p /etc/sysctl.conf -sudo /sbin/sysctl -w fs.file-max=100000 -sudo /sbin/sysctl --system - -sudo bash -c "cat >> /etc/security/limits.conf <<- 'EOF' -* soft nproc 100000 -* hard nproc 100000 -* soft nofile 100000 -* hard nofile 100000 -root soft nproc 100000 -root hard nproc 100000 -root soft nofile 100000 -root hard nofile 100000 -EOF" diff --git a/singularity/import.sh b/singularity/import.sh deleted file mode 100755 index 153d28b9..00000000 --- a/singularity/import.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# strict mode so script quits immediately upon failure -set -eo pipefail - -dataDir=$1 ## Directory that contains GENERAL and PROTECTED folders -containerDataDir=$2 ## Directory that contains data generated by dpdash - -singularity exec -B ${containerDataDir}:/data -B ${dataDir}:${dataDir} dpdash2.img /data/scripts/push.sh diff --git a/singularity/init.sh b/singularity/init.sh deleted file mode 100755 index d15311f5..00000000 --- a/singularity/init.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash - -# strict mode so script quits immediately upon failure -set -eo pipefail - -dataDir=$1 ## Directory that contains GENERAL and PROTECTED folders -containerDataDir=$2 ## Directory to save data generated by dpdash -serviceHost=$3 ##Optional; all long host names (FQDNs) of rabbitmq and mongodb services. - -if [ -z "$serviceHost" ] -then - serviceHost=`hostname -f | xargs` -fi - -if [ -d "$containerDataDir" ] && [ "$(ls -A $containerDataDir)" ]; then - echo "$containerDataDir needs to both exist and be empty" - exit 1 -fi - -## Transport script files -mkdir -p ${containerDataDir}/scripts -find ./ -type f -maxdepth 1 ! -name dpdash2.img -exec cp -t ${containerDataDir}/scripts/ {} + - -## Get current working directory -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -## Generate SSL certificates -echo '***************Generating SSL Certificates***************' -mkdir -p ${containerDataDir}/ssl/ca ${containerDataDir}/ssl/server ${containerDataDir}/ssl/client -mkdir -p ${containerDataDir}/ssl/ca/certs ${containerDataDir}/ssl/ca/private -chmod 700 ${containerDataDir}/ssl/ca/private -cp ./openssl.cnf ${containerDataDir}/ssl/ca/openssl.cnf -cd ${containerDataDir}/ssl/ca -echo 01 > serial -touch index.txt - -echo 'Generating CAs' -cd ${containerDataDir}/ssl/ca -openssl req -x509 -config openssl.cnf -newkey rsa:4096 -days 365 \ - -out cacert.pem -outform PEM -subj /CN=DPdashCA/ -nodes -openssl x509 -in cacert.pem -out cacert.cer -outform DER - -echo 'Generating server keys' -cd ../server -openssl genrsa -out key.pem 4096 -openssl req -new -key key.pem -out req.pem -outform PEM \ - -subj "/CN=${serviceHost}/O=server/" -nodes - -cd ../ca -openssl ca -config openssl.cnf -in ../server/req.pem -out \ - ../server/cert.pem -notext -batch -extensions server_ca_extensions - -echo 'Generating client keys' -cd ../client -openssl genrsa -out key.pem 4096 -openssl req -new -key key.pem -out req.pem -outform PEM \ - -subj "/CN=${serviceHost}/O=client/" -nodes - -cd ../ca -openssl ca -config openssl.cnf -in ../client/req.pem -out \ - ../client/cert.pem -notext -batch -extensions client_ca_extensions - -echo 'Generating Mongodb keys' -cat ${containerDataDir}/ssl/server/key.pem ${containerDataDir}/ssl/server/cert.pem > ${containerDataDir}/ssl/mongo_server.pem -cat ${containerDataDir}/ssl/client/key.pem ${containerDataDir}/ssl/client/cert.pem > ${containerDataDir}/ssl/mongo_client.pem - -## Generate Configurations -echo '***************Generating Configs***************' -cd ${containerDataDir}/scripts -mkdir -p ${containerDataDir}/dpdash/configs -export mongopw=`openssl rand -base64 32 | tr -d "+=/"` -export rabbitpw=`openssl rand -base64 32| tr -d "+=/"` -export dpdashsecret=`openssl rand -base64 32` -export appsecret=`openssl rand -base64 32 | tr -d "+=/"` -python ./configure.py --data-dir ${dataDir} --config-dir ${containerDataDir}/dpdash/configs --mongo-pw $mongopw --rabbit-pw $rabbitpw --ssl-ca /data/ssl/ca/cacert.pem --ssl-server-cert /data/ssl/server/cert.pem --ssl-server-key /data/ssl/server/key.pem --ssl-client-cert /data/ssl/client/cert.pem --ssl-client-key /data/ssl/client/key.pem --mongo-server-cert /data/ssl/mongo_server.pem --mongo-path /data/dpdash/mongodb --celery-path /data/dpdash/celery/ --dpdash-secret $dpdashsecret --mongo-host ${serviceHost} --rabbit-host ${serviceHost} --dpdash-path /data/dpdash/ --app-secret $appsecret - -## Initializing supervisord Space -echo '***************Initializing supervisord logdir***************' -mkdir -p ${containerDataDir}/dpdash/supervisord/logs - -## Initializing MongoDB Space -echo '***************Initializing MONGOB Space***************' -mkdir -p ${containerDataDir}/dpdash/mongodb/logs && mkdir ${containerDataDir}/dpdash/mongodb/dbs - -## Initializing Rabbitmq Space -echo '***************Initializing RABBITMQ Space***************' -mkdir -p ${containerDataDir}/dpdash/rabbitmq && mkdir ${containerDataDir}/dpdash/celery - -## Initializing DPdash Upload Space -echo '***************Initializing DPdash Space*****************' -mkdir -p ${containerDataDir}/dpdash/uploads && mkdir -p ${containerDataDir}/dpdash/configs/dashboard -cd ${DIR} -cp -R ./configs/* ${containerDataDir}/dpdash/configs/dashboard/ -cp supervisord.conf ${containerDataDir}/dpdash/configs/ - -## Set-up the container -echo '***************Setting up DPdash*****************' -singularity exec -B ${containerDataDir}:/data dpdash2.img /data/scripts/setup.sh $mongopw $rabbitpw $appsecret diff --git a/singularity/openssl.cnf b/singularity/openssl.cnf deleted file mode 100644 index b246302a..00000000 --- a/singularity/openssl.cnf +++ /dev/null @@ -1,54 +0,0 @@ -[ ca ] -default_ca = dpdashca - -[ dpdashca ] -dir = . -certificate = $dir/cacert.pem -database = $dir/index.txt -new_certs_dir = $dir/certs -private_key = $dir/private/cakey.pem -serial = $dir/serial - -default_crl_days = 7 -default_days = 365 -default_md = sha256 - -policy = dpdashca_policy -x509_extensions = certificate_extensions - -[ dpdashca_policy ] -commonName = supplied -stateOrProvinceName = optional -countryName = optional -emailAddress = optional -organizationName = optional -organizationalUnitName = optional -domainComponent = optional - -[ certificate_extensions ] -basicConstraints = CA:false - -[ req ] -default_bits = 2048 -default_keyfile = ./private/cakey.pem -default_md = sha256 -prompt = yes -distinguished_name = root_ca_distinguished_name -x509_extensions = root_ca_extensions - -[ root_ca_distinguished_name ] -commonName = hostname - -[ root_ca_extensions ] -basicConstraints = CA:true -keyUsage = keyCertSign, cRLSign - -[ client_ca_extensions ] -basicConstraints = CA:false -keyUsage = digitalSignature,keyEncipherment -extendedKeyUsage = 1.3.6.1.5.5.7.3.2 - -[ server_ca_extensions ] -basicConstraints = CA:false -keyUsage = digitalSignature,keyEncipherment -extendedKeyUsage = 1.3.6.1.5.5.7.3.1 diff --git a/singularity/push.sh b/singularity/push.sh deleted file mode 100755 index c14ce710..00000000 --- a/singularity/push.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -# strict mode so script quits immediately upon failure -set -eo pipefail - -# Proxy settings -export http_proxy=${httpProxy} -export https_proxy=${httpsProxy} -export noProxy=${noProxy} - -# miniconda2 settings -export PATH=/sw/apps/miniconda/bin:$PATH - -# vars for rabbitmq-server -export RABBITMQ_CONFIG_FILE=/data/dpdash/configs/rabbitmq -export RABBITMQ_MNESIA_BASE=/data/dpdash/rabbitmq -export RABBITMQ_LOG_BASE=/data/dpdash/rabbitmq - -# vars for celery worker -export dppy_config=/data/dpdash/configs/dppy.conf - -# vars for DPdash node app -export DPDASH_CONFIG=/data/dpdash/configs/dpdash.js -export DPDASH_UPLOADS=/data/dpdash/uploads -export DPDASH_UPLOADS_CONFIG_SCHEMA=/data/dpdash/configs/dashboard/config.schema -export DPDASH_DASHBOARD_CONFIG_DEFAULT=/data/dpdash/configs/dashboard/defaultUserConfig.js -export DPDASH_DASHBOARD_CONFIG_DEFAULT_STUDY=/data/dpdash/configs/dashboard/defaultStudyConfig.js -cd /sw/apps/dpdash - -node ./utils/importer.js diff --git a/singularity/quit.sh b/singularity/quit.sh deleted file mode 100755 index fb4e78b9..00000000 --- a/singularity/quit.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# strict mode so script quits immediately upon failure -set -eo pipefail - -# stop npm -cd /sw/apps/dpdash -npm stop - -# todo: make this do a graceful exit - -# The commented line below is not working on Linux 7 -# ps auxww | grep 'pm2' | awk '{print $2}' | xargs kill -9 -pkill -f 'pm2' - -#todo: send SIGQUIT to supervisord - -# The commented line below is not working on Linux 7 -# ps auxww | grep 'supervisord' | awk '{print $2}' | xargs kill -15 -pkill -f 'supervisord' -pkill -f 'rabbitmq' -pkill -f 'erlang' -pkill -f 'celery' -pkill -f 'mongo' diff --git a/singularity/replaceCert-nginx.sh b/singularity/replaceCert-nginx.sh deleted file mode 100755 index 1b1fae61..00000000 --- a/singularity/replaceCert-nginx.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -## usage: sudo ./replaceCert-nginx.sh yourNewSiteName - -## Remove last line and include dpdash conf -sed -i '$ d' /etc/nginx/nginx.conf -echo ' include /etc/nginx/conf.d/*.conf;' >> /etc/nginx/nginx.conf -echo '}' >> /etc/nginx/nginx.conf - -sed -i 's:test2.neuroinfo.org:'${1}':' /etc/nginx/conf.d/dpdash.conf diff --git a/singularity/run.sh b/singularity/run.sh deleted file mode 100755 index db9ca445..00000000 --- a/singularity/run.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# strict mode so script quits immediately upon failure -set -eo pipefail - -httpProxy=$1 -httpsProxy=$2 -noProxy=$3 - -# Proxy settings -export http_proxy=${httpProxy} -export https_proxy=${httpsProxy} -export noProxy=${noProxy} - -# miniconda2 settings -export PATH=/sw/apps/miniconda/bin:$PATH - -# vars for rabbitmq-server -export RABBITMQ_CONFIG_FILE=/data/dpdash/configs/rabbitmq -export RABBITMQ_MNESIA_BASE=/data/dpdash/rabbitmq -export RABBITMQ_LOG_BASE=/data/dpdash/rabbitmq - -# vars for celery worker -export dppy_config=/data/dpdash/configs/dppy.conf - -# start mongodb, celery, and rabbit -/sw/apps/miniconda/bin/supervisord -c /data/dpdash/configs/supervisord.conf - -# sleep 100 seconds -sleep 100 - -# vars for DPdash node app -export DPDASH_CONFIG=/data/dpdash/configs/dpdash.js -export DPDASH_UPLOADS=/data/dpdash/uploads -export DPDASH_UPLOADS_CONFIG_SCHEMA=/data/dpdash/configs/dashboard/config.schema -export DPDASH_DASHBOARD_CONFIG_DEFAULT=/data/dpdash/configs/dashboard/defaultUserConfig.js -export DPDASH_DASHBOARD_CONFIG_DEFAULT_STUDY=/data/dpdash/configs/dashboard/defaultStudyConfig.js -cd /sw/apps/dpdash -npm start diff --git a/singularity/setup.sh b/singularity/setup.sh deleted file mode 100755 index 6328e907..00000000 --- a/singularity/setup.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# strict mode so script quits immediately upon failure -set -eo pipefail - -mongopw=$1 -rabbitpw=$2 -appsecret=$3 - -# Generate dpdash password -nodecmd='require("/sw/apps/dpdash/utils/crypto/hash.js")("dpdash","aes-256-ctr","encrypt","'$appsecret'")' -adminpw=`node -p $nodecmd` - -## Set up MongoDB Authentication & SSL -echo '***************Setting up MONGOB***************' -mongod --port 27017 --logpath /data/dpdash/mongodb/logs/mongod.log --dbpath /data/dpdash/mongodb/dbs --fork -mongo admin --eval "db.createUser({user: 'dpdash', pwd:'"$mongopw"', roles: [ { role: 'root', db: 'admin' } ] });" -mongo dpdmongo --eval "db.users.insertOne({uid : 'dpdash', password:'"$adminpw"', role: 'admin', ldap: false, display_name: 'dpdash'});" -mongod --shutdown --dbpath /data/dpdash/mongodb/dbs - -## Set up Rabbitmq Server -echo '***************Setting up RABBITMQ***************' -export RABBITMQ_CONFIG_FILE=/data/dpdash/configs/rabbitmq -export RABBITMQ_MNESIA_BASE=/data/dpdash/rabbitmq -export RABBITMQ_LOG_BASE=/data/dpdash/rabbitmq -/usr/lib/rabbitmq/bin/rabbitmq-server start -detached -sleep 10 && /usr/lib/rabbitmq/bin/rabbitmqctl add_user dpdash $rabbitpw -sleep 10 && /usr/lib/rabbitmq/bin/rabbitmqctl set_permissions -p / dpdash ".*" ".*" ".*" -sleep 10 && /usr/lib/rabbitmq/bin/rabbitmqctl delete_user guest -sleep 10 && /usr/lib/rabbitmq/bin/rabbitmqctl stop - -## Set up Celery Server -echo '***************Setting up CELERY***************' -export dppy_config=/data/dpdash/configs/dppy.conf - -echo '****************Set Up Complete****************' diff --git a/singularity/supervisord.conf b/singularity/supervisord.conf deleted file mode 100644 index c67c3969..00000000 --- a/singularity/supervisord.conf +++ /dev/null @@ -1,192 +0,0 @@ -; Sample supervisor config file. -; -; For more information on the config file, please see: -; http://supervisord.org/configuration.html -; -; Notes: -; - Shell expansion ("~" or "$HOME") is not supported. Environment -; variables can be expanded using this syntax: "%(ENV_HOME)s". -; - Quotes around values are not supported, except in the case of -; the environment= options as shown below. -; - Comments must have a leading space: "a=b ;comment" not "a=b;comment". -; - Command will be truncated if it looks like a config file comment, e.g. -; "command=bash -c 'foo ; bar'" will truncate to "command=bash -c 'foo ". - -[unix_http_server] -file=/tmp/supervisor.sock ; the path to the socket file -;chmod=0700 ; socket file mode (default 0700) -;chown=nobody:nogroup ; socket file uid:gid owner -;username=user ; default is no username (open server) -;password=123 ; default is no password (open server) - -;[inet_http_server] ; inet (TCP) server disabled by default -;port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface -;username=user ; default is no username (open server) -;password=123 ; default is no password (open server) - -[supervisord] -logfile=/data/dpdash/supervisord/logs/supervisord.log ; main log file; default $CWD/supervisord.log -logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB -logfile_backups=10 ; # of main logfile backups; 0 means none, default 10 -loglevel=info ; log level; default info; others: debug,warn,trace -pidfile=/data/dpdash/supervisord/supervisord.pid ; supervisord pidfile; default supervisord.pid -nodaemon=false ; start in foreground if true; default false -minfds=1024 ; min. avail startup file descriptors; default 1024 -minprocs=200 ; min. avail process descriptors;default 200 -;umask=022 ; process file creation umask; default 022 -;user=chrism ; default is current user, required if root -;identifier=supervisor ; supervisord identifier, default is 'supervisor' -;directory=/tmp ; default is not to cd during start -;nocleanup=true ; don't clean up tempfiles at start; default false -;childlogdir=/tmp ; 'AUTO' child log dir, default $TEMP -;environment=KEY="value" ; key value pairs to add to environment -;strip_ansi=false ; strip ansi escape codes in logs; def. false - -; The rpcinterface:supervisor section must remain in the config file for -; RPC (supervisorctl/web interface) to work. Additional interfaces may be -; added by defining them in separate [rpcinterface:x] sections. - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -; The supervisorctl section configures how supervisorctl will connect to -; supervisord. configure it match the settings in either the unix_http_server -; or inet_http_server section. - -[supervisorctl] -serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket -;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket -;username=chris ; should be same as in [*_http_server] if set -;password=123 ; should be same as in [*_http_server] if set -;prompt=mysupervisor ; cmd line prompt (default "supervisor") -;history_file=~/.sc_history ; use readline history if available - -[program:mongod] -command=mongod --config /data/dpdash/configs/mongodb.conf --logpath /data/dpdash/mongodb/logs/mongod.log ; the program (relative uses PATH, can take args) -process_name=%(program_name)s ; process_name expr (default %(program_name)s) -priority=1 ; the relative start priority (default 999) -autostart=true ; start at supervisord start (default: true) -startsecs=10 ; # of secs prog must stay up to be running (def. 1) -startretries=3 ; max # of serial start failures when starting (default 3) -autorestart=unexpected ; when to restart if exited after running (def: unexpected) -exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2) -stopsignal=QUIT ; signal used to kill process (default TERM) -stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) -stopasgroup=false ; send stop signal to the UNIX process group (default false) -killasgroup=true ; SIGKILL the UNIX process group (def false) -redirect_stderr=true ; redirect proc stderr to stdout (default false) -stdout_logfile=/data/dpdash/supervisord/logs/mongod.out ; stdout log path, NONE for none; default AUTO -stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) -stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10) -stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) -stdout_events_enabled=false ; emit events on stdout writes (default false) -stderr_logfile=/data/dpdash/supervisord/logs/mongod.err ; stderr log path, NONE for none; default AUTO -stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) -stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10) -stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) -stderr_events_enabled=false ; emit events on stderr writes (default false) -serverurl=AUTO ; override serverurl computation (childutils) - -[program:rabbitMQ] -command=/usr/lib/rabbitmq/bin/rabbitmq-server ; the program (relative uses PATH, can take args) -process_name=%(program_name)s ; process_name expr (default %(program_name)s) -priority=2 ; the relative start priority (default 999) -autostart=true ; start at supervisord start (default: true) -startsecs=10 ; # of secs prog must stay up to be running (def. 1) -startretries=3 ; max # of serial start failures when starting (default 3) -autorestart=unexpected ; when to restart if exited after running (def: unexpected) -exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2) -stopsignal=QUIT ; signal used to kill process (default TERM) -stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) -stopasgroup=false ; send stop signal to the UNIX process group (default false) -killasgroup=true ; SIGKILL the UNIX process group (def false) -redirect_stderr=true ; redirect proc stderr to stdout (default false) -stdout_logfile=/data/dpdash/supervisord/logs/rabbitmq.out ; stdout log path, NONE for none; default AUTO -stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) -stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10) -stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) -stdout_events_enabled=false ; emit events on stdout writes (default false) -stderr_logfile=/data/dpdash/supervisord/logs/rabbitmq.err ; stderr log path, NONE for none; default AUTO -stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) -stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10) -stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) -stderr_events_enabled=false ; emit events on stderr writes (default false) -serverurl=AUTO ; override serverurl computation (childutils) - -[program:celery] -command=celery worker -A dppy -l info -E -f /data/dpdash/celery/celery.log -Q dpdash -Ofair --pidfile /data/dpdash/celery/celeryd.pid ; the program (relative uses PATH, can take args) -process_name=%(program_name)s ; process_name expr (default %(program_name)s) -priority=3 ; the relative start priority (default 999) -directory=/sw/apps/dppy -autostart=true ; start at supervisord start (default: true) -startsecs=10 ; # of secs prog must stay up to be running (def. 1) -startretries=3 ; max # of serial start failures when starting (default 3) -autorestart=unexpected ; when to restart if exited after running (def: unexpected) -exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2) -stopsignal=QUIT ; signal used to kill process (default TERM) -stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) -stopasgroup=false ; send stop signal to the UNIX process group (default false) -killasgroup=true ; SIGKILL the UNIX process group (def false) -redirect_stderr=true ; redirect proc stderr to stdout (default false) -stdout_logfile=/data/dpdash/supervisord/logs/celery_worker.out ; stdout log path, NONE for none; default AUTO -stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) -stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10) -stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) -stdout_events_enabled=false ; emit events on stdout writes (default false) -stderr_logfile=/data/dpdash/supervisord/logs/celery_worker.err ; stderr log path, NONE for none; default AUTO -stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) -stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10) -stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) -stderr_events_enabled=false ; emit events on stderr writes (default false) -serverurl=AUTO ; override serverurl computation (childutils) - -; The sample eventlistener section below shows all possible eventlistener -; subsection values. Create one or more 'real' eventlistener: sections to be -; able to handle event notifications sent by supervisord. - -;[eventlistener:theeventlistenername] -;command=/bin/eventlistener ; the program (relative uses PATH, can take args) -;process_name=%(program_name)s ; process_name expr (default %(program_name)s) -;numprocs=1 ; number of processes copies to start (def 1) -;events=EVENT ; event notif. types to subscribe to (req'd) -;buffer_size=10 ; event buffer queue size (default 10) -;directory=/tmp ; directory to cwd to before exec (def no cwd) -;umask=022 ; umask for process (default None) -;priority=-1 ; the relative start priority (default -1) -;autostart=true ; start at supervisord start (default: true) -;startsecs=1 ; # of secs prog must stay up to be running (def. 1) -;startretries=3 ; max # of serial start failures when starting (default 3) -;autorestart=unexpected ; autorestart if exited after running (def: unexpected) -;exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2) -;stopsignal=QUIT ; signal used to kill process (default TERM) -;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) -;stopasgroup=false ; send stop signal to the UNIX process group (default false) -;killasgroup=false ; SIGKILL the UNIX process group (def false) -;user=chrism ; setuid to this UNIX account to run the program -;redirect_stderr=false ; redirect_stderr=true is not allowed for eventlisteners -;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO -;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) -;stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10) -;stdout_events_enabled=false ; emit events on stdout writes (default false) -;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO -;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) -;stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10) -;stderr_events_enabled=false ; emit events on stderr writes (default false) -;environment=A="1",B="2" ; process environment additions -;serverurl=AUTO ; override serverurl computation (childutils) - -; The sample group section below shows all possible group values. Create one -; or more 'real' group: sections to create "heterogeneous" process groups. - -;[group:thegroupname] -;programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions -;priority=999 ; the relative start priority (default 999) - -; The [include] section can just contain the "files" setting. This -; setting can list multiple files (separated by whitespace or -; newlines). It can also contain wildcards. The filenames are -; interpreted as relative to this file. Included files *cannot* -; include files themselves. - -;[include] -;files = relative/directory/*.ini diff --git a/stores/actions.js b/stores/actions.js deleted file mode 100755 index e228e820..00000000 --- a/stores/actions.js +++ /dev/null @@ -1,12 +0,0 @@ -export const CONFIGURE_DASHBOARD = 'CONFIGURE_DASHBOARD' - -export function setDashboardConfiguration(configuration) { - return { - type: CONFIGURE_DASHBOARD, - configuration - } -} - -function getDashboardConfiguration() { - -} \ No newline at end of file diff --git a/stores/reducers.js b/stores/reducers.js deleted file mode 100755 index c639e941..00000000 --- a/stores/reducers.js +++ /dev/null @@ -1,32 +0,0 @@ -import { combineReducers } from 'redux' - -import { - CONFIGURE_DASHBOARD -} from './actions' - -function subject(state = window.SUBJECT, action) { - return state -} - -function graph(state = window.GRAPH, action) { - return state -} - -function user(state = window.USER, action) { -// switch(action.type) { -// case CONFIGURE_DASHBOARD: -// return Object.assign({}, state, { -// dashboard.configuration: action.configuration -// }) -// default: -// } - return state -} - -const rootReducer = combineReducers({ - graph, - user, - subject -}) - -export default rootReducer diff --git a/stores/store.js b/stores/store.js deleted file mode 100755 index 01875039..00000000 --- a/stores/store.js +++ /dev/null @@ -1,12 +0,0 @@ -import {createStore, applyMiddleware} from 'redux' -import thunk from 'redux-thunk' -import reducer from './reducers' - -//Redux store set-up -export default function store(preloadedState) { - return createStore( - reducer, - preloadedState, - applyMiddleware(thunk) - ) -} diff --git a/template/template.html b/template/template.html new file mode 100644 index 00000000..a4237912 --- /dev/null +++ b/template/template.html @@ -0,0 +1,13 @@ + + + + + + + DPdash + + + +
+ + diff --git a/test/FormProviderFixture.jsx b/test/FormProviderFixture.jsx new file mode 100644 index 00000000..4560d885 --- /dev/null +++ b/test/FormProviderFixture.jsx @@ -0,0 +1,11 @@ +import React from 'react' + +import { FormProvider, useForm } from 'react-hook-form' + +const FormProviderFixture = ({ children }) => { + const methods = useForm() + + return {children} +} + +export default FormProviderFixture diff --git a/test/PageRenderer.jsx b/test/PageRenderer.jsx new file mode 100644 index 00000000..9ab5c0ac --- /dev/null +++ b/test/PageRenderer.jsx @@ -0,0 +1,23 @@ +import React from 'react' + +import { LocalizationProvider } from '@mui/x-date-pickers' +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs' +import { render } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import { AuthContext, NotificationContext } from '../views/contexts' + +const renderPage = (PageComponent, props = {}) => + render( + + + + + + + + + + ) + +export default renderPage diff --git a/test/fixtures.js b/test/fixtures.js new file mode 100644 index 00000000..cd459080 --- /dev/null +++ b/test/fixtures.js @@ -0,0 +1,414 @@ +import { N_A } from '../server/constants' + +export const createFieldLabelValue = (overrides = {}) => ({ + value: '', + label: '', + color: '#e2860a', + targetValues: {}, + ...overrides, +}) + +let chartID = 0 + +export const createChart = (overrides = {}, fieldLabelOverrides = []) => ({ + _id: (chartID++).toString(), + assessment: '', + description: '', + fieldLabelValueMap: [ + createFieldLabelValue({ + value: 'foo', + label: 'Foo', + targetValues: { + LA: '3', + YA: '3', + MA: '3', + }, + }), + ...fieldLabelOverrides, + ], + owner: '', + title: '', + variable: '', + ...overrides, +}) + +export const createLabel = (overrides = {}) => ({ + name: 'label-name', + color: 'label-color', + ...overrides, +}) + +export const createSiteData = (overrides = {}) => ({ + name: 'Site name', + counts: { + Good: 1, + Bad: 1, + [N_A]: 0, + Total: 2, + }, + totalsForStudy: { + count: 2, + }, + percentages: { + Good: 50, + Bad: 50, + [N_A]: 0, + }, + targets: { + Good: 0, + Bad: 0, + }, + ...overrides, +}) + +export const createDb = (overrides = {}) => ({ + aggregate: jest.fn(function () { + return this + }), + collection: jest.fn(function () { + return this + }), + distinct: jest.fn(), + deleteOne: jest.fn(), + drop: jest.fn(), + insertOne: jest.fn(), + insertMany: jest.fn(), + find: jest.fn(function () { + return this + }), + findOne: jest.fn(), + findOneAndUpdate: jest.fn(), + limit: jest.fn(function () { + return this + }), + sort: jest.fn(function () { + return this + }), + toArray: jest.fn(), + updateOne: jest.fn(), + stream: jest.fn(), + ...overrides, +}) + +export const createResponse = (overrides = {}) => ({ + clearCookie: jest.fn(), + header: jest.fn(), + json: jest.fn(), + redirect: jest.fn(), + send: jest.fn(), + status: jest.fn(function () { + return this + }), + ...overrides, +}) + +export const createRequest = (overrides = {}) => ({ + headers: {}, + params: {}, + query: '', + body: {}, + app: { + locals: { + appDb: createDb(), + dataDb: createDb(), + }, + }, + logout: jest.fn(), + ...overrides, +}) + +export const createUser = (overrides = {}) => ({ + uid: 'user-uid', + display_name: 'Display Name', + icon: 'icon', + ...overrides, +}) + +export const createRequestWithUser = (overrides = {}, userOverrides = {}) => ({ + ...createRequest(overrides), + user: createUser({ ...userOverrides }), + session: { + icon: 'icon', + display_name: 'Display Name', + role: '', + destroy: jest.fn(), + }, +}) + +export const createSubject = (overrides = {}) => ({ + collection: 'collection', + study: 'study', + subject: 'subject', + ...overrides, +}) + +export const createParticipantDayData = (overrides = {}) => ({ + ...overrides, +}) + +export const createConfiguration = (overrides = {}) => ({ + _id: '1', + owner: 'owl', + config: {}, + type: 'matrix', + created: 'Mon, 12 June 2023', + readers: ['owl'], + status: 1, + ...overrides, +}) + +export const createColorbrewer = (overrides = {}) => ({ + schemeGroups: { + sequential: [ + 'BuGn', + 'BuPu', + 'GnBu', + 'OrRd', + 'PuBu', + 'PuBuGn', + 'PuRd', + 'RdPu', + 'YlGn', + 'YlGnBu', + 'YlOrBr', + 'YlOrRd', + ], + singlehue: ['Blues', 'Greens', 'Greys', 'Oranges', 'Purples', 'Reds'], + diverging: [ + 'BrBG', + 'PiYG', + 'PRGn', + 'PuOr', + 'RdBu', + 'RdGy', + 'RdYlBu', + 'RdYlGn', + 'Spectral', + ], + qualitative: [ + 'Accent', + 'Dark2', + 'Paired', + 'Pastel1', + 'Pastel2', + 'Set1', + 'Set2', + 'Set3', + ], + }, + YlGn: { + 3: ['#f7fcb9', '#addd8e', '#31a354'], + 4: ['#ffffcc', '#c2e699', '#78c679', '#238443'], + 5: ['#ffffcc', '#c2e699', '#78c679', '#31a354', '#006837'], + 6: ['#ffffcc', '#d9f0a3', '#addd8e', '#78c679', '#31a354', '#006837'], + }, + ...overrides, +}) + +export const createColorList = (overrides = []) => [ + { value: 0, label: ['#f7fcb9', '#addd8e', '#31a354'] }, + { value: 1, label: ['#ffffcc', '#c2e699', '#78c679', '#238443'] }, + { + value: 2, + label: ['#ffffcc', '#c2e699', '#78c679', '#31a354', '#006837'], + }, + { + label: ['#ffffcc', '#d9f0a3', '#addd8e', '#78c679', '#31a354', '#006837'], + value: 3, + }, + ...overrides, +] + +export const createAnalysisConfig = (overrides = {}) => ({ + label: '', + analysis: '', + color: [], + range: [], + variable: '', + category: '', + ...overrides, +}) + +export const createMatrixData = (overrides = {}) => ({ + analysis: '', + category: '', + color: [], + data: [], + label: '', + range: [], + stat: [], + variable: '', + ...overrides, +}) + +export const createAssessmentsFromConfig = (overrides = {}) => ({ + assessment: '', + collection: '', + ...overrides, +}) + +export const createMetadataParticipant = (overrides = {}) => ({ + Active: 1, + Consent: '', + participant: '', + synced: '', + study: '', + daysInStudy: 0, + ...overrides, +}) + +export const createParticipantRow = (overrides = {}) => ({ + participant: 'CA00066', + days: 1, + study: 'CA', + star: true, + complete: true, + ...overrides, +}) + +export const createParticipantList = (length = 10, overrides = {}) => + Array(length).fill(createParticipantRow(overrides)) + +export const createFilters = (overrides = {}) => ({ + chrcrit_part: [ + { name: 'HC', value: 'true' }, + { name: 'CHR', value: 'true' }, + { name: 'Missing', value: 'true' }, + ], + included_excluded: [ + { name: 'Included', value: 'true' }, + { name: 'Excluded', value: 'true' }, + { name: 'Missing', value: 'true' }, + ], + sex_at_birth: [ + { name: 'Male', value: 'true' }, + { name: 'Female', value: 'true' }, + { name: 'Missing', value: 'true' }, + ], + ...overrides, +}) + +export const createNewAssessmentDayData = (overrides = {}) => ({ + metadata: {}, + participant_assessments: [], + assessment_variables: [], + ...overrides, +}) + +export const createSiteMetadata = (overrides = {}) => ({ + metadata: {}, + participants: [], + ...overrides, +}) + +export const createAssessmentDayData = (overrides = {}) => ({ + day: 1, + assessment: '', + participant: '', + study: '', + dayData: [], + daysInStudy: overrides.dayData + ? Math.max(...overrides.dayData.map((dayData) => dayData.day)) + : 0, + ...overrides, +}) + +export const createGraphDataResponse = (overrides = {}) => ({ + subject: { + sid: 'LA48928', + project: 'LA', + }, + graph: { + matrixData: [ + { + analysis: 'phone_power_activityScores_hourly', + data: [], + label: 'Day', + variable: 'day', + stat: [], + range: [1, '3655'], + text: true, + color: [ + '#f7fcf5', + '#e5f5e0', + '#c7e9c0', + '#a1d99b', + '#74c476', + '#41ab5d', + '#238b45', + '#006d2c', + '#00441b', + ], + category: 'phone_use', + }, + ], + configurations: [ + { + range: [1, '3655'], + text: true, + variable: 'day', + label: 'Day', + color: [ + '#f7fcf5', + '#e5f5e0', + '#c7e9c0', + '#a1d99b', + '#74c476', + '#41ab5d', + '#238b45', + '#006d2c', + '#00441b', + ], + category: 'phone_use', + analysis: 'phone_power_activityScores_hourly', + }, + ], + consentDate: '2022-06-02T00:00:00.000Z', + }, + ...overrides, +}) +export const createAssessmentDayDataMetadata = (overrides = {}) => ({ + study: ' ', + participant: ' ', + assessment: ' ', + units: ' ', + start: ' ', + end: ' ', + time_end: ' ', + Consent: ' ', + Active: 1, + ...overrides, +}) + +export const createAsessmentVariable = (overrides = {}) => ({ + name: '', + ...overrides, +}) +export const createAssessment = (overrides = {}) => ({ + name: '', + ...overrides, +}) + +export const createStudy = (overrides = {}) => ({ + study: '', + updatedAt: '', + participants: [], + ...overrides, +}) + +export const createStudyTableRowData = (overrides = {}) => ({ + daysInStudy: 0, + numOfParticipants: 0, + study: '', + updatedAt: '', + ...overrides, +}) + +export const createSiteParticipant = (overrides = {}) => ({ + participant: ' ', + Active: 1, + Consent: '', + study: '', + daysInStudy: 0, + ...overrides, +}) diff --git a/test/testUtils.js b/test/testUtils.js new file mode 100644 index 00000000..8e0ae91e --- /dev/null +++ b/test/testUtils.js @@ -0,0 +1,1050 @@ +import { + createAssessmentDayData, + createSiteParticipant, + createStudy, +} from './fixtures' +import { + FILTERS_FORM, + INCLUSION_EXCLUSION_CRITERIA_FORM, + SOCIODEMOGRAPHICS_FORM, +} from '../server/constants' + +export const dayDataAssessments = [ + createAssessmentDayData({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + participant: 'YA1', + study: 'YA', + dayData: [{ chrcrit_part: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: FILTERS_FORM, + participant: 'YA1', + study: 'YA', + dayData: [{ recruitment_status: 'recruited', day: 4 }], + }), + createAssessmentDayData({ + assessment: SOCIODEMOGRAPHICS_FORM, + participant: 'YA1', + study: 'YA', + dayData: [{ chrdemo_sexassigned: 2, day: 4 }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'YA1', + study: 'YA', + dayData: [{ eeg: 'foo', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'YA2', + study: 'YA', + dayData: [{ day: 5, eeg: 'bar', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + participant: 'YA2', + study: 'YA', + dayData: [{ chrcrit_part: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: FILTERS_FORM, + participant: 'YA2', + study: 'YA', + dayData: [{ recruitment_status: 'consented', day: 4 }], + }), + createAssessmentDayData({ + assessment: SOCIODEMOGRAPHICS_FORM, + participant: 'YA2', + study: 'YA', + dayData: [{ chrdemo_sexassigned: 2, day: 4 }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'YA3', + study: 'YA', + dayData: [{ day: 2, eeg: 'bar', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + participant: 'YA3', + study: 'YA', + dayData: [{ chrcrit_part: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: FILTERS_FORM, + participant: 'YA3', + study: 'YA', + dayData: [{ recruitment_status: 'recruited', day: 4 }], + }), + createAssessmentDayData({ + assessment: SOCIODEMOGRAPHICS_FORM, + participant: 'YA3', + study: 'YA', + dayData: [{ chrdemo_sexassigned: 2, day: 4 }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'YA4', + study: 'YA', + dayData: [ + { day: 5, eeg: null, var: 'var', baz: 'baz' }, + { eeg: 'foo', var: 'var', baz: 'baz', day: 6 }, + ], + }), + createAssessmentDayData({ + assessment: SOCIODEMOGRAPHICS_FORM, + participant: 'YA4', + study: 'YA', + dayData: [{ chrdemo_sexassigned: 2, day: 4 }], + }), + createAssessmentDayData({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + participant: 'YA4', + study: 'YA', + dayData: [{ chrcrit_part: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: FILTERS_FORM, + participant: 'YA4', + study: 'YA', + dayData: [{ recruitment_status: 'recruited', day: 4 }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'MA1', + study: 'MA', + dayData: [{ day: 1, eeg: 'foo', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: FILTERS_FORM, + participant: 'MA1', + study: 'MA', + dayData: [{ recruitment_status: 'recruited', day: 4 }], + }), + createAssessmentDayData({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + participant: 'MA1', + study: 'MA', + dayData: [{ chrcrit_part: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: SOCIODEMOGRAPHICS_FORM, + participant: 'MA1', + study: 'MA', + dayData: [{ chrdemo_sexassigned: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'MA2', + study: 'MA', + dayData: [{ day: 5, eeg: 'foo', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: FILTERS_FORM, + participant: 'MA2', + study: 'MA', + dayData: [{ recruitment_status: 'not recruited', day: 4 }], + }), + createAssessmentDayData({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + participant: 'MA2', + study: 'MA', + dayData: [{ chrcrit_part: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: SOCIODEMOGRAPHICS_FORM, + participant: 'MA2', + study: 'MA', + dayData: [{ chrdemo_sexassigned: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'MA3', + study: 'MA', + dayData: [{ day: 2, eeg: 'foo', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: FILTERS_FORM, + participant: 'MA3', + study: 'MA', + dayData: [{ recruitment_status: 'recruited', day: 4 }], + }), + createAssessmentDayData({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + participant: 'MA3', + study: 'MA', + dayData: [{ chrcrit_part: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: SOCIODEMOGRAPHICS_FORM, + participant: 'MA3', + study: 'MA', + dayData: [{ chrdemo_sexassigned: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'MA4', + study: 'MA', + dayData: [ + { day: 5, eeg: null, var: 'var', baz: 'baz' }, + { day: 7, eeg: 'foo', var: 'var', baz: 'baz' }, + ], + }), + createAssessmentDayData({ + assessment: FILTERS_FORM, + participant: 'MA4', + study: 'MA', + dayData: [{ recruitment_status: 'recruited', day: 4 }], + }), + createAssessmentDayData({ + assessment: INCLUSION_EXCLUSION_CRITERIA_FORM, + participant: 'MA4', + study: 'MA', + dayData: [{ chrcrit_part: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: SOCIODEMOGRAPHICS_FORM, + participant: 'MA4', + study: 'MA', + dayData: [{ chrdemo_sexassigned: 1, day: 4 }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'LA1', + study: 'LA', + dayData: [{ eeg: 'foo', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'LA2', + study: 'LA', + dayData: [{ day: 5, eeg: 'foo', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'LA3', + study: 'LA', + dayData: [{ day: 2, eeg: 'foo', var: 'var', baz: 'baz' }], + }), + createAssessmentDayData({ + assessment: 'eeg', + participant: 'LA4', + study: 'LA', + dayData: [ + { day: 5, eeg: null, var: 'var', baz: 'baz' }, + { eeg: 'foo', var: 'var', baz: 'baz' }, + ], + }), +] + +export const chartsDataSuccessResponse = (overrides = {}) => ({ + chartOwner: { + display_name: 'Display Name', + icon: 'icon', + uid: 'owl', + }, + chart_id: '', + dataBySite: [ + { + counts: { + Bar: 2, + Foo: 2, + 'N/A': 0, + Total: 4, + }, + siteCode: 'YA', + name: 'Yale', + percentages: { + Bar: 50, + Foo: 50, + 'N/A': 0, + }, + targets: { + Bar: 1, + Foo: 3, + Total: 4, + }, + totalsForStudy: { + count: 4, + targetTotal: 4, + }, + }, + { + counts: { + Bar: 2, + Foo: 10, + 'N/A': 2, + Total: 12, + }, + siteCode: 'Totals', + name: 'Totals', + percentages: { + Bar: 14.285714285714285, + Foo: 71.42857142857143, + 'N/A': 14.285714285714285, + }, + targets: { + Bar: 5, + Foo: 9, + Total: 14, + }, + totalsForStudy: { + count: 12, + targetTotal: 14, + }, + }, + { + counts: { + Bar: 0, + Foo: 4, + 'N/A': 1, + Total: 4, + }, + siteCode: 'MA', + name: 'Madrid', + percentages: { + Bar: 0, + Foo: 80, + 'N/A': 20, + }, + targets: { + Bar: 2, + Foo: 3, + Total: 5, + }, + totalsForStudy: { + count: 4, + targetTotal: 5, + }, + }, + { + counts: { + Bar: 0, + Foo: 4, + 'N/A': 1, + Total: 4, + }, + siteCode: 'LA', + name: 'UCLA', + percentages: { + Bar: 0, + Foo: 80, + 'N/A': 20, + }, + targets: { + Bar: 2, + Foo: 3, + Total: 5, + }, + totalsForStudy: { + count: 4, + targetTotal: 5, + }, + }, + ], + description: 'Participant EEG Measurements', + filters: { + chrcrit_part: { + HC: { + label: 'HC', + value: 0, + }, + CHR: { + label: 'CHR', + value: 0, + }, + Missing: { + label: 'Missing', + value: 0, + }, + }, + + sex_at_birth: { + Male: { + label: 'Male', + value: 0, + }, + Female: { + label: 'Female', + value: 0, + }, + Missing: { + label: 'Missing', + value: 0, + }, + }, + sites: { + YA: { label: 'YA', value: 1 }, + LA: { label: 'LA', value: 1 }, + MA: { label: 'MA', value: 1 }, + }, + networks: { + PRESCIENT: { label: 'PRESCIENT', value: 0 }, + ProNET: { label: 'ProNET', value: 0 }, + }, + recruitment_status: { + 'Not recruited': { + label: 'Not Recruited', + value: 0, + }, + + Recruited: { + label: 'Recruited', + value: 0, + }, + }, + }, + graphTable: { + tableColumns: [ + { + dataProperty: 'site', + label: 'Site Name', + sortable: true, + }, + { + dataProperty: 'siteCode', + label: 'Site Code', + sortable: false, + }, + { + dataProperty: 'Foo', + label: 'Foo', + sortable: false, + }, + { + dataProperty: 'Bar', + label: 'Bar', + sortable: false, + }, + { + dataProperty: 'Total', + label: 'Total', + sortable: false, + }, + ], + tableRows: [ + { + Bar: '0 / 2 (0%)', + Foo: '4 / 3 (133%)', + 'N/A': '1', + Total: '4 / 5 (80%)', + site: 'Madrid', + siteCode: 'MA', + }, + { + Bar: '0 / 2 (0%)', + Foo: '4 / 3 (133%)', + 'N/A': '1', + Total: '4 / 5 (80%)', + site: 'UCLA', + siteCode: 'LA', + }, + { + Bar: '2 / 1 (200%)', + Foo: '2 / 3 (67%)', + 'N/A': '0', + Total: '4 / 4 (100%)', + site: 'Yale', + siteCode: 'YA', + }, + { + Bar: '2 / 5 (40%)', + Foo: '10 / 9 (111%)', + 'N/A': '2', + Total: '12 / 14 (86%)', + site: 'Totals', + siteCode: 'Totals', + }, + ], + }, + labels: [ + { + color: '#e2860a', + name: 'Foo', + }, + { + color: 'red', + name: 'Bar', + }, + { + color: '#808080', + name: 'N/A', + }, + ], + legend: [ + { + name: 'Foo', + symbol: { + fill: '#e2860a', + type: 'rect', + }, + }, + { + name: 'Bar', + symbol: { + fill: 'red', + type: 'rect', + }, + }, + ], + studyTotals: { + Madrid: { + count: 4, + targetTotal: 5, + }, + Totals: { + count: 12, + targetTotal: 14, + }, + UCLA: { + count: 4, + targetTotal: 5, + }, + Yale: { + count: 4, + targetTotal: 4, + }, + }, + title: 'Eeg Measurements', + userSites: ['LA', 'MA', 'YA'], + lastModified: '', + ...overrides, +}) + +export const chartsDataInitialResponse = (overrides = {}) => ({ + chart_id: '', + chartOwner: { + display_name: 'Display Name', + icon: 'icon', + uid: 'owl', + }, + dataBySite: [ + { + counts: { + Bar: 1, + Foo: 2, + 'N/A': 1, + Total: 3, + }, + name: 'Yale', + percentages: { + Bar: 25, + Foo: 50, + 'N/A': 25, + }, + siteCode: 'YA', + targets: { + Bar: 1, + Foo: 3, + Total: 4, + }, + totalsForStudy: { + count: 3, + targetTotal: 4, + }, + }, + { + counts: { + Bar: 1, + Foo: 5, + 'N/A': 8, + Total: 6, + }, + name: 'Totals', + percentages: { + Bar: 7.142857142857142, + Foo: 35.714285714285715, + 'N/A': 57.14285714285714, + }, + siteCode: 'Totals', + targets: { + Bar: 3, + Foo: 6, + Total: 14, + }, + totalsForStudy: { + count: 6, + targetTotal: 14, + }, + }, + { + counts: { + Bar: 0, + Foo: 3, + 'N/A': 2, + Total: 3, + }, + name: 'Madrid', + percentages: { + Bar: 0, + Foo: 60, + 'N/A': 40, + }, + siteCode: 'MA', + targets: { + Bar: 2, + Foo: 3, + Total: 5, + }, + totalsForStudy: { + count: 3, + targetTotal: 5, + }, + }, + ], + description: 'Participant EEG Measurements', + filters: { + chrcrit_part: { + CHR: { + label: 'CHR', + value: 1, + }, + HC: { + label: 'HC', + value: 1, + }, + Missing: { + label: 'Missing', + value: 1, + }, + }, + networks: { + PRESCIENT: { + label: 'PRESCIENT', + value: 0, + }, + ProNET: { + label: 'ProNET', + value: 0, + }, + }, + recruitment_status: { + 'Not recruited': { + label: 'Not Recruited', + value: 0, + }, + Recruited: { + label: 'Recruited', + value: 1, + }, + }, + sex_at_birth: { + Female: { + label: 'Female', + value: 1, + }, + Male: { + label: 'Male', + value: 1, + }, + Missing: { + label: 'Missing', + value: 1, + }, + }, + sites: { + LA: { + label: 'LA', + value: 1, + }, + MA: { + label: 'MA', + value: 1, + }, + YA: { + label: 'YA', + value: 1, + }, + }, + }, + graphTable: { + tableColumns: [ + { + dataProperty: 'site', + label: 'Site Name', + sortable: true, + }, + { + dataProperty: 'siteCode', + label: 'Site Code', + sortable: false, + }, + { + dataProperty: 'Foo', + label: 'Foo', + sortable: false, + }, + { + dataProperty: 'Bar', + label: 'Bar', + sortable: false, + }, + { + dataProperty: 'Total', + label: 'Total', + sortable: false, + }, + ], + tableRows: [ + { + Bar: '0 / 2 (0%)', + Foo: '3 / 3 (100%)', + 'N/A': '2', + Total: '3 / 5 (60%)', + site: 'Madrid', + siteCode: 'MA', + }, + { + Bar: '1 / 1 (100%)', + Foo: '2 / 3 (67%)', + 'N/A': '1', + Total: '3 / 4 (75%)', + site: 'Yale', + siteCode: 'YA', + }, + { + Bar: '1 / 3 (33%)', + Foo: '5 / 6 (83%)', + 'N/A': '8', + Total: '6 / 14 (43%)', + site: 'Totals', + siteCode: 'Totals', + }, + ], + }, + labels: [ + { + color: '#e2860a', + name: 'Foo', + }, + { + color: 'red', + name: 'Bar', + }, + { + color: '#808080', + name: 'N/A', + }, + ], + lastModified: '', + legend: [ + { + name: 'Foo', + symbol: { + fill: '#e2860a', + type: 'rect', + }, + }, + { + name: 'Bar', + symbol: { + fill: 'red', + type: 'rect', + }, + }, + ], + studyTotals: { + Madrid: { + count: 3, + targetTotal: 5, + }, + Totals: { + count: 6, + targetTotal: 14, + }, + UCLA: { + count: 0, + targetTotal: 5, + }, + Yale: { + count: 3, + targetTotal: 4, + }, + }, + title: 'Eeg Measurements', + userSites: ['LA', 'MA', 'YA'], + ...overrides, +}) + +export const chartsDataFilterResponse = (overrides = {}) => ({ + chart_id: '', + chartOwner: { + display_name: 'Display Name', + icon: 'icon', + uid: 'owl', + }, + dataBySite: [ + { + counts: { + Bar: 0, + Foo: 1, + 'N/A': 4, + Total: 1, + }, + name: 'Madrid', + percentages: { + Bar: 0, + Foo: 20, + 'N/A': 80, + }, + siteCode: 'MA', + targets: { + Bar: 2, + Foo: 3, + Total: 5, + }, + totalsForStudy: { + count: 1, + targetTotal: 5, + }, + }, + { + counts: { + Foo: 1, + 'N/A': 13, + Total: 1, + }, + name: 'Totals', + percentages: { + Foo: 7.142857142857142, + 'N/A': 92.85714285714286, + }, + siteCode: 'Totals', + targets: { + Bar: 2, + Foo: 3, + Total: 14, + }, + totalsForStudy: { + count: 1, + targetTotal: 14, + }, + }, + ], + description: 'Participant EEG Measurements', + filters: { + chrcrit_part: { + CHR: { + label: 'CHR', + value: 0, + }, + HC: { + label: 'HC', + value: 0, + }, + Missing: { + label: 'Missing', + value: 0, + }, + }, + networks: { + PRESCIENT: { + label: 'PRESCIENT', + value: 0, + }, + ProNET: { + label: 'ProNET', + value: 0, + }, + }, + recruitment_status: { + 'Not recruited': { + label: 'Not Recruited', + value: 1, + }, + Recruited: { + label: 'Recruited', + value: 0, + }, + }, + sex_at_birth: { + Female: { + label: 'Female', + value: 0, + }, + Male: { + label: 'Male', + value: 1, + }, + Missing: { + label: 'Missing', + value: 0, + }, + }, + sites: { + LA: { + label: 'LA', + value: 1, + }, + MA: { + label: 'MA', + value: 1, + }, + YA: { + label: 'YA', + value: 1, + }, + }, + }, + graphTable: { + tableColumns: [ + { + dataProperty: 'site', + label: 'Site Name', + sortable: true, + }, + { + dataProperty: 'siteCode', + label: 'Site Code', + sortable: false, + }, + { + dataProperty: 'Foo', + label: 'Foo', + sortable: false, + }, + { + dataProperty: 'Bar', + label: 'Bar', + sortable: false, + }, + { + dataProperty: 'Total', + label: 'Total', + sortable: false, + }, + ], + tableRows: [ + { + Bar: '0 / 2 (0%)', + Foo: '1 / 3 (33%)', + 'N/A': '4', + Total: '1 / 5 (20%)', + site: 'Madrid', + siteCode: 'MA', + }, + { + Foo: '1 / 3 (33%)', + 'N/A': '13', + Total: '1 / 14 (7%)', + site: 'Totals', + siteCode: 'Totals', + }, + ], + }, + labels: [ + { + color: '#e2860a', + name: 'Foo', + }, + { + color: 'red', + name: 'Bar', + }, + { + color: '#808080', + name: 'N/A', + }, + ], + lastModified: '', + legend: [ + { + name: 'Foo', + symbol: { + fill: '#e2860a', + type: 'rect', + }, + }, + { + name: 'Bar', + symbol: { + fill: 'red', + type: 'rect', + }, + }, + ], + studyTotals: { + Madrid: { + count: 1, + targetTotal: 5, + }, + Totals: { + count: 1, + targetTotal: 14, + }, + UCLA: { + count: 0, + targetTotal: 5, + }, + Yale: { + count: 0, + targetTotal: 4, + }, + }, + title: 'Eeg Measurements', + userSites: ['LA', 'MA', 'YA'], + ...overrides, +}) + +export const createStudies = () => [ + createStudy({ + study: 'YA', + updatedAt: new Date('01-05-2024'), + participants: [ + createSiteParticipant({ + participant: 'YA1', + Active: 1, + Consent: '2022-06-02', + study: 'YA', + daysInStudy: 55, + }), + createSiteParticipant({ + participant: 'YA2', + Active: 1, + Consent: '2022-06-02', + study: 'YA', + daysInStudy: 105, + }), + ], + }), + createStudy({ + study: 'MA', + updatedAt: new Date('01-05-2024'), + participants: [ + createSiteParticipant({ + participant: 'MA1', + Active: 1, + Consent: '2022-06-02', + study: 'MA', + daysInStudy: 55, + }), + createSiteParticipant({ + participant: 'MA2', + Active: 1, + Consent: '2022-06-02', + study: 'MA', + daysInStudy: 1005, + }), + ], + }), + createStudy({ + study: 'LA', + updatedAt: new Date('01-05-2024'), + participants: [ + createSiteParticipant({ + participant: 'LA1', + Active: 1, + Consent: '2022-06-02', + study: 'LA', + daysInStudy: 655, + }), + createSiteParticipant({ + participant: 'LA2', + Active: 1, + Consent: '2022-06-02', + study: 'LA', + daysInStudy: 5, + }), + ], + }), +] diff --git a/ts_bin/dpdash-cdk.ts b/ts_bin/dpdash-cdk.ts new file mode 100644 index 00000000..27cd031c --- /dev/null +++ b/ts_bin/dpdash-cdk.ts @@ -0,0 +1,18 @@ +#!/usr/bin/env node +import 'source-map-support/register' +import * as cdk from 'aws-cdk-lib' +import { DpdashCdkStack } from '../cdk_lib/dpdash-cdk-stack' + +const app = new cdk.App() +new DpdashCdkStack(app, 'DpdashCdkStack', { + /* If you don't specify 'env', this stack will be environment-agnostic. + * Account/Region-dependent features and context lookups will not work, + * but a single synthesized template can be deployed anywhere. */ + /* Uncomment the next line to specialize this stack for the AWS Account + * and Region that are implied by the current CLI configuration. */ + // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, + /* Uncomment the next line if you know exactly what Account and Region you + * want to deploy the stack to. */ + // env: { account: '123456789012', region: 'us-east-1' }, + /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ +}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..813ff9e6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["es2020", "dom"], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": ["./node_modules/@types"] + }, + "exclude": [ + "node_modules", + "public", + "constants", + "server", + "template", + "test", + "views", + "cdk.out" + ] +} diff --git a/utils/crypto/hash.js b/utils/crypto/hash.js deleted file mode 100755 index 019187b9..00000000 --- a/utils/crypto/hash.js +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node - -var crypto = require('crypto'); - -function encrypt(text, algorithm, secret) { - var cipher = crypto.createCipher(algorithm, secret); - var crypted = cipher.update(text,'utf8','hex'); - crypted += cipher.final('hex'); - return crypted; -} - -function decrypt(text, algorithm, secret) { - var decipher = crypto.createDecipher(algorithm, secret); - var dec = decipher.update(text,'hex','utf8'); - dec += decipher.final('utf8'); - return dec; -} - -module.exports = (text, algorithm, method, secret) => { - if(method == 'encrypt') { - return encrypt(text, algorithm, secret); - } else if (method == 'decrypt') { - return decrypt(text, algorithm, secret); - } else { - return null; - } -}; diff --git a/utils/dateConverter.js b/utils/dateConverter.js deleted file mode 100644 index d89b4e18..00000000 --- a/utils/dateConverter.js +++ /dev/null @@ -1,18 +0,0 @@ -function stringToDate(_date,_format,_delimiter) { - let formatLowerCase=_format.toLowerCase(); - let formatItems=formatLowerCase.split(_delimiter); - let dateItems=_date.split(_delimiter); - let monthIndex=formatItems.indexOf("mm"); - let dayIndex=formatItems.indexOf("dd"); - let yearIndex=formatItems.indexOf("yyyy"); - let month=parseInt(dateItems[monthIndex]); - let year=(dateItems[yearIndex].length == 2 ? '20' + dateItems[yearIndex] : dateItems[yearIndex]); - return new Date(year,--month,dateItems[dayIndex]); -} -function diffDates(date1, date2) { - let millisecondsPerDay = 24 * 60 * 60 * 1000; - return Math.round((date2-date1)/millisecondsPerDay); -} - -exports.diffDates = diffDates; -exports.stringToDate = stringToDate; diff --git a/utils/importer.js b/utils/importer.js deleted file mode 100755 index c66adcef..00000000 --- a/utils/importer.js +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env node - -var configPath = process.env.DPDASH_CONFIG || '../config'; -var config = require(configPath); -var amqp = require('amqplib/callback_api'); -var MongoClient = require('mongodb').MongoClient; -const uuidV4 = require('uuid/v4'); - -function dataImport() { - console.log('INFO - data - connecting to queue'); - var amqpAddress = 'amqps://' + config.rabbitmq.username; - amqpAddress = amqpAddress + ':' + config.rabbitmq.password; - amqpAddress = amqpAddress + '@' + config.rabbitmq.host + ':' + config.rabbitmq.port; - amqp.connect(amqpAddress, config.rabbitmq.opts, function(err, conn) { - if (err) { - console.log('ERROR - rabbimtq - ' + err); - return; - } - conn.createChannel(function(err, ch) { - if (err) { - console.log('ERROR - rabbimtq - ' + err); - return; - } - ch.assertQueue('', {durable: false}, function(err, q) { - if (err) { - console.log('ERROR - rabbimtq - ' + err); - return; - } - var correlationId = uuidV4(); - ch.consume(q.queue, function(msg) { - if (msg.properties.correlationId == correlationId) { - console.log('rabbitmq - cron - ' + msg.content.toString()); - } - var messageContent = JSON.parse(msg.content); - var messageStatus = messageContent.status; - if(messageStatus) { - if (messageStatus == 'SUCCESS') { - console.log('rabbitmq - cron - success. exiting...'); - process.exit(0); - } else if (messageStatus == 'FAILURE') { - console.log('rabbitmq - cron - failed.'); - process.exit(1); - } else if (messageStatus.startsWith('PROCESSING')) { - console.log(messageStatus); - }else { - console.log('rabbitmq - cron - failed. reason unknown. exiting'); - process.exit(1); - } - } - }); - - var message = {}; - message.id = correlationId; - message.task = 'import'; - message.args = [ - config.app.rootDir, - config.app.rootDir, - '', - '', - config.database.mongo.username, - config.database.mongo.password, - config.database.mongo.host, - config.database.mongo.port, - config.database.mongo.authSource, - config.database.mongo.dataDB - ]; - message.kwargs = {}; - message.retries = 0; - - var sent = ch.sendToQueue( - config.rabbitmq.publisherQueue, - new Buffer(JSON.stringify(message)), - { correlationId: correlationId, contentType: 'application/json', replyTo: q.queue } - ); - }); - }); - }); -} -dataImport(); diff --git a/utils/invertColor.js b/utils/invertColor.js deleted file mode 100644 index c3bdf123..00000000 --- a/utils/invertColor.js +++ /dev/null @@ -1,30 +0,0 @@ -/* http://stackoverflow.com/a/35970186 */ -function padZero(str, len) { - len = len || 2 - let zeros = new Array(len).join('0') - - return (zeros + str).slice(-len) -} -function getColor(hex, bw) { - if (hex.indexOf('#') === 0) { - hex = hex.slice(1) - } - - let r = parseInt(hex.slice(0, 2), 16) - let g = parseInt(hex.slice(2, 4), 16) - let b = parseInt(hex.slice(4, 6), 16) - - if (bw) { - return (r * 0.299 + g * 0.587 + b * 0.114) > 186 - ? '#000000' - : '#FFFFFF' - } - - r = (255 - r).toString(16) - g = (255 - g).toString(16) - b = (255 - b).toString(16) - - return "#" + padZero(r) + padZero(g) + padZero(b) -} - -exports.getColor = getColor; diff --git a/utils/passport/ldap.js b/utils/passport/ldap.js deleted file mode 100755 index ec18317c..00000000 --- a/utils/passport/ldap.js +++ /dev/null @@ -1,212 +0,0 @@ -var configPath = process.env.DPDASH_CONFIG || '../../config'; -var config = require(configPath); -var defaultUserConfigPath = process.env.DPDASH_DASHBOARD_CONFIG_DEFAULT || '../../defaultUserConfig'; -var defaultUserConfig = require(defaultUserConfigPath); -var passport = require('passport'); -var MongoDB = require('mongodb'); -var MongoClient = MongoDB.MongoClient; - -function getRealms(user) { - if(user != null && user.realms) { - return user.realms; - } else { - config.app.realms; - } -} - -function getUserIcon(user) { - if(user != null && user.icon) { - return user.icon; - } else { - return ''; - } -} - -function getUserRoles(user) { - if(user != null && user.role) { - return user.role; - } else { - return "member"; - } -} -function getUserAccess(user) { - if(user != null && user.access) { - return user.access; - } else { - return []; - } -} - -function getUserBlocked(user) { - if(user != null && user.blocked) { - return user.blocked; - } else { - return false; - } -} - -function getUserName(user, ldap_name) { - if(user != null && user.display_name) { - return user.display_name; - } else if (ldap_name){ - return ldap_name; - } else { - return ''; - } -} - -function getUserMail(user, ldap_email) { - if(user != null && user.mail) { - return user.mail; - } else if (ldap_email){ - return ldap_email; - } else { - return ''; - } -} - -function getUserTitle(user, ldap_title) { - if(user != null && user.title) { - return user.title; - } else if (ldap_title){ - return ldap_title; - } else { - return ''; - } -} - -function getUserDpt(user, ldap_dpt) { - if(user != null && user.department) { - return user.department; - } else if (ldap_dpt){ - return ldap_dpt; - } else { - return ''; - } -} - -function getUserCompany(user, ldap_company) { - if(user != null && user.company) { - return user.company; - } else if (ldap_company){ - return ldap_company; - } else { - return ''; - } -} - -module.exports = (req, res, next) => { - passport.serializeUser(function(user, done) { - done(null, user.uid); - }); - - passport.deserializeUser(function(user, done) { - done(null, user); - }); - passport.authenticate('ldapauth', {session: true}, function(err, user, info) { - if(err) { - return res.redirect('/login?e=' + err); - } - if(!user) { - return res.redirect('/login?e=forbidden'); - } - req.login(user, function(err) { - if (err) { - return next(err); - } else { - var mongoURI = 'mongodb://' + config.database.mongo.username + ':'; - mongoURI = mongoURI + config.database.mongo.password + '@' + config.database.mongo.host; - mongoURI = mongoURI + ':' + config.database.mongo.port + '/' + config.database.mongo.authSource; - MongoClient.connect(mongoURI, config.database.mongo.server, function(err, client) { - if (err) { - console.error(err.message); - return res.redirect('/login?e=forbidden'); - } - const mongodb = client.db(config.database.mongo.appDB); - var uid = user.uid; - mongodb.collection('users').findOne( - {uid: uid}, - {realms : 1, role: 1, icon: 1, access: 1, blocked: 1}, - function (err, userObj) { - if(err){ - console.error(err.message); - } - var userRealms = getRealms(userObj); - var userIcon = getUserIcon(userObj); - var userName = getUserName(userObj, user.cn); - var userRoles = getUserRoles(userObj); - var userAccess = getUserAccess(userObj); - var userBlocked = getUserBlocked(userObj); - var userMail = getUserMail(userObj, user.mail); - var userDpt = getUserDpt(userObj, user.department); - var userCompany = getUserCompany(userObj, user.company); - var userTitle = getUserTitle(userObj, user.title); - - mongodb.collection('configs').findOne( - {owner: uid}, - function(err, configObj) { - if(err){ - console.error(err.message); - } - if(!configObj) { - var defaultConfig = { - owner: uid, - config: defaultUserConfig, - name: 'default', - type: 'matrix', - readers : [uid], - created: (new Date()).toUTCString() - }; - mongodb.collection('configs').insertOne(defaultConfig); - } - mongodb.collection('users').findOneAndUpdate( - {uid: uid}, - { - $set: { - display_name: userName, - title: userTitle, - department: userDpt, - company: userCompany, - mail: userMail, - member_of: user.memberOf, - bad_pwd_count: user.badPwdCount, - lockout_time: user.lockoutTime, - last_logoff: user.lastLogoff, - last_logon: user.lastLogon, - account_expires: user.accountExpires, - password: null, - ldap: true, - force_reset_pw: false, - realms: userRealms, - icon: userIcon, - role: userRoles, - blocked: userBlocked, - access: userAccess - } - }, - { - upsert: true, - returnOriginal: false, - }, - function(err, userinfo) { - if(err) { - console.error(err.message); - } - client.close(); - req.session.role = userRoles; - req.session.display_name = userName; - req.session.mail = userMail; - req.session.celery_tasks = []; - req.session.icon = userIcon; - return res.redirect('/'); - }); - }); - - }); - - }); - - } - }); - })(req, res, next); -}; diff --git a/utils/passport/local-login.js b/utils/passport/local-login.js deleted file mode 100755 index 39004660..00000000 --- a/utils/passport/local-login.js +++ /dev/null @@ -1,90 +0,0 @@ -var passport = require('passport'); -var configPath = process.env.DPDASH_CONFIG || '../../config'; -var config = require(configPath); -var defaultUserConfigPath = process.env.DPDASH_DASHBOARD_CONFIG_DEFAULT || '../../defaultUserConfig'; -var defaultUserConfig = require(defaultUserConfigPath); -var MongoDB = require('mongodb'); -var MongoClient = MongoDB.MongoClient; - -module.exports = (req, res, next, user) => { - //validate submitted password - var hashedPassword = require('../crypto/hash')(req.body.password, 'aes-256-ctr', 'encrypt', config.app.secret); - if (user.password != hashedPassword) { - return res.redirect('/login?e=forbidden'); - } - //passport local log-in serializer - passport.serializeUser(function(user, done) { - done(null, user.uid); - }); - passport.deserializeUser(function(user, done) { - done(null, user); - }); - //If the user exists, serialize the user to the session - req.login(user, function(err) { - if (err) { - return next(err); - } else { - var mongoURI = 'mongodb://' + config.database.mongo.username + ':'; - mongoURI = mongoURI + config.database.mongo.password + '@' + config.database.mongo.host; - mongoURI = mongoURI + ':' + config.database.mongo.port + '/' + config.database.mongo.authSource; - MongoClient.connect(mongoURI, config.database.mongo.server, function(err, client) { - if (err) { - console.error(err.message); - return res.redirect('/login?e=forbidden'); - } - const mongodb = client.db(config.database.mongo.appDB); - var uid = user.uid; - mongodb.collection('configs').findOne( - {owner: uid}, - function(err, configObj) { - if(err){ - console.error(err.message); - } - if(!configObj) { - var defaultConfig = { - owner: uid, - config: defaultUserConfig, - name: 'default', - type: 'matrix', - readers : [uid], - created: (new Date()).toUTCString() - }; - mongodb.collection('configs').insertOne(defaultConfig); - } - mongodb.collection('users').findOneAndUpdate( - {uid: user.uid}, - { - $set: { - last_logon: Date.now() - } - }, - { - projection : { - _id : 0, - uid : 1, - display_name : 1, - acl : 1, - role: 1, - icon: 1, - mail: 1 - }, - returnOriginal: false, - upsert: true - }, - function(err, userinfo) { - if(err) { - console.error(err.message); - } - client.close(); - req.session.role = userinfo.value.role; - req.session.display_name = userinfo.value.display_name; - req.session.mail = userinfo.value.mail; - req.session.celery_tasks = []; - req.session.icon = userinfo.value.icon; - return res.redirect('/'); - }); - }); - }); - } - }); -}; diff --git a/utils/passport/local-signup.js b/utils/passport/local-signup.js deleted file mode 100755 index 7b7820e6..00000000 --- a/utils/passport/local-signup.js +++ /dev/null @@ -1,96 +0,0 @@ -var passport = require('passport'); -var configPath = process.env.DPDASH_CONFIG || '../../config'; -var config = require(configPath); -var defaultUserConfigPath = process.env.DPDASH_DASHBOARD_CONFIG_DEFAULT || '../../defaultUserConfig'; -var defaultUserConfig = require(defaultUserConfigPath); -var MongoDB = require('mongodb'); -var MongoClient = MongoDB.MongoClient; - -module.exports = (req, res, next) => { - passport.authenticate('local-signup', {session: true}, function(err, user, reqBody) { - if(err) { - return res.redirect('/login?e=' + err); - } - if(user) { - return res.redirect('/signup?e=existingUser'); - } - var password = reqBody.password; - var username = reqBody.username; - var email = reqBody.email; - var display_name = reqBody.display_name; - - var mongoURI = 'mongodb://' + config.database.mongo.username + ':'; - mongoURI = mongoURI + config.database.mongo.password + '@' + config.database.mongo.host; - mongoURI = mongoURI + ':' + config.database.mongo.port + '/' + config.database.mongo.authSource; - MongoClient.connect(mongoURI, config.database.mongo.server, function(err, client) { - if (err) { - console.error(err.message); - return res.redirect('/login?e=forbidden'); - } - const mongodb = client.db(config.database.mongo.appDB); - var hashedPW = require('../crypto/hash')(password, 'aes-256-ctr', 'encrypt', config.app.secret); - mongodb.collection('users').findOneAndUpdate( - {uid: username}, - { - $set: { - display_name: display_name, - title: '', - department: '', - company: '', - mail: email, - member_of: '', - bad_pwd_count: 0, - lockout_time: 0, - last_logoff: Date.now(), - last_logon: Date.now(), - account_expires: null, - password: hashedPW, - ldap: false, - force_reset_pw: false, - realms: config.app.realms, - icon: '', - access:[], - blocked: false, - role: "member" - } - }, - { - projection : { - _id : 0, - uid : 1, - display_name : 1, - acl : 1, - role: 1, - icon: 1, - mail: 1 - }, - returnOriginal: false, - upsert: true - }, - function(err, userinfo) { - if(err) { - console.error(err.message); - } - - var defaultConfig = { - owner: username, - config: defaultUserConfig, - name: 'default', - type: 'matrix', - readers : [username], - created: (new Date()).toUTCString() - }; - mongodb.collection('configs').insertOne(defaultConfig); - client.close(); - - req.session.role = userinfo.value.role; - req.session.uid = userinfo.value.uid; - req.session.display_name = userinfo.value.display_name; - req.session.mail = userinfo.value.mail; - req.session.celery_tasks = []; - req.session.icon = userinfo.value.icon; - return res.redirect('/'); - }); - }); - })(req, res, next); -}; diff --git a/views/AbstractGraph.d3.js b/views/AbstractGraph.d3.js deleted file mode 100755 index 1c612475..00000000 --- a/views/AbstractGraph.d3.js +++ /dev/null @@ -1,17 +0,0 @@ -import * as d3 from 'd3'; - -export default class AbstractGraph { - constructor(el, props) { - this.el = el; - this.props = props; - } - unmount() { - this.el.remove(); - } - create() { - - } - update() { - - } -} \ No newline at end of file diff --git a/views/Account.react.js b/views/Account.react.js deleted file mode 100644 index 91393fad..00000000 --- a/views/Account.react.js +++ /dev/null @@ -1,515 +0,0 @@ -import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import moment from 'moment'; -import 'whatwg-fetch'; -import update from 'immutability-helper'; - -import Avatar from '@material-ui/core/Avatar'; -import Typography from '@material-ui/core/Typography'; -import Person from '@material-ui/icons/Person'; -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import TextField from '@material-ui/core/TextField'; -import IconButton from '@material-ui/core/IconButton'; -import ColorLens from '@material-ui/icons/ColorLens'; -import Button from '@material-ui/core/Button'; -import Tooltip from '@material-ui/core/Tooltip'; -import ButtonBase from '@material-ui/core/ButtonBase'; -import Snackbar from '@material-ui/core/Snackbar'; - -import {compose} from 'redux'; -import { withStyles } from '@material-ui/core/styles'; -import DrawerComponent from './Drawer.react'; -import Drawer from '@material-ui/core/Drawer'; -const drawerWidth = 200; -import Hidden from '@material-ui/core/Hidden'; -const styles = theme => ({ - root: { - flexGrow: 1, - height: '100vh', - zIndex: 1, - overflow: 'hidden', - position: 'relative', - display: 'flex', - width: '100%', - }, - appBar: { - position: 'absolute', - marginLeft: drawerWidth, - [theme.breakpoints.up('md')]: { - width: `calc(100% - ${drawerWidth}px)`, - }, - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - backgroundColor: 'white', - color: 'rgba(0, 0, 0, 0.54)' - }, - navIconHide: { - [theme.breakpoints.up('md')]: { - display: 'none', - }, - }, - drawerPaper: { - width: drawerWidth, - [theme.breakpoints.up('md')]: { - position: 'relative', - }, - borderRight: '0px' - }, - content: { - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - flexGrow: 1, - backgroundColor: '#fefefe', - padding: theme.spacing.unit * 3, - marginTop: '64px', - } -}); - -class AccountPage extends Component { - constructor(props) { - super(props); - this.state = { - user: {}, - _id: '', - uid: '', - display_name : '', - title: '', - department: '', - company: '', - mail: '', - ldap: '', - icon: '', - totalStudies: 0, - totalSubjects: 0, - totalDays : 0, - snackTime: false, - mobileOpen: false - }; - } - componentDidUpdate() { - } - componentWillMount() { - this.fetchUserInfo(this.props.user.uid); - this.setState({ - user : this.props.user - }); - this.fetchSubjects(); - } - componentDidMount() { - } - componentWillUnmount() { - } - handleDrawerToggle = () => { - this.setState(state => ({ mobileOpen: !state.mobileOpen })); - }; - fetchSubjects = () => { - return window.fetch('/api/v1/studies', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - let studies = response ? response : []; - window.fetch('/api/v1/subjects?q=' + JSON.stringify(studies), { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - this.autocomplete(response) - }); - }); - } - getAvatar = (icon) => { - var username = this.state.display_name; - var uid = this.state.uid; - if(icon == '' || icon == undefined) { - if(username == '' || username == undefined) { - if(uid && uid.length > 0) { - return ( - - {uid[0]} - - ); - } else { - return ( - - - - ); - } - } else { - return ( - - {username[0]} - - ); - } - } else { - return ( - - ); - } - } - autocomplete = (acl) => { - var options = []; - for(var study = 0; study < acl.length; study++) { - Array.prototype.push.apply(options, acl[study].subjects); - } - this.setState({ - totalStudies: acl.length, - totalSubjects: options.length, - totalDays: Math.max.apply(Math, options.map(function(o) { return o.days; })) - }); - } - fetchUserInfo = (uid) => { - return window.fetch('/api/v1/users/' + uid, { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return; - } - return response.json(); - }).then((response) => { - this.setState({ - _id: response['_id'], - uid: response['uid'], - display_name : response['display_name'], - title: response['title'], - department: response['department'], - company: response['company'], - mail: response['mail'], - ldap: response['ldap'], - icon: response['icon'] - }); - }); - } - handleChange = (event, key) => { - this.setState({ - [key]: event.target.value, - }); - }; - editUserInfo = () => { - let uid = this.state.uid; - let user = {}; - user['uid'] = uid; - user['display_name'] = this.state.display_name; - user['title'] = this.state.title; - user['department'] = this.state.department; - user['company'] = this.state.company; - user['mail'] = this.state.mail; - user['icon'] = this.state.icon; - - return window.fetch('/api/v1/users/' + uid, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - user: user - }) - }).then((response) => { - return response; - }).then(data => { - this.setState({ - snackTime: true - }); - return data; - }).catch(error => { - return error; - }); - } - openNewWindow = (uri) => { - window.open(uri, '_self'); - } - scaleDownImage = () => { - let image = this.refs.userSubmittedAvatar; - let canvas = this.refs.canvas; - let ctx = canvas.getContext('2d'); - - canvas.height = 200; - canvas.width = 200; - - let sx = 0; - let sy = (image.naturalHeight - image.naturalWidth) / 2; - let swidth = image.naturalWidth; - let sheight = image.naturalWidth; - - if(image.naturalHeight < image.naturalWidth) { - sy = 0; - sx = (image.naturalWidth - image.naturalHeight) / 2; - swidth = image.naturalHeight; - sheight = image.naturalHeight; - } - - let x = 0; - let y = 0; - - ctx.drawImage(image, sx, sy, swidth, sheight, x, y, 200, 200); - - let dataURL = canvas.toDataURL('image/png'); - this.setState({ icon : dataURL}, ()=> { - this.editUserInfo(); - ctx.clearRect(0,0,canvas.width,canvas.height); - }); - } - handleChangeIcon = (event) => { - let accepted_files = event.target.files; - if (accepted_files.length > 0) { - let reader = new FileReader(); - reader.readAsDataURL(accepted_files[0]); - reader.onload = (e) => { - this.setState({ - baseURL : e.target.result - }); - }; - } - } - handleCrumbs =()=> { - this.setState({ - snackTime: false - }); - } - render() { - const { classes, theme } = this.props; - return ( -
- - - - - - - Account - - this.openNewWindow('/u/configure')} - > - - - - - - - - - - - - - - -
-
- - -
- this.handleChange(e, 'display_name')} - fullWidth={true} - /> - this.handleChange(e, 'mail')} - /> - this.handleChange(e, 'title')} - /> - this.handleChange(e, 'department')} - /> - this.handleChange(e, 'company')} - /> -
- -
-
- - - -
- ); - } -} - -const mapStateToProps = (state) => ({ - user: state.user -}); - -export default compose( - withStyles(styles, { withTheme: true }), - connect(mapStateToProps) -)(AccountPage); diff --git a/views/Account.render.react.js b/views/Account.render.react.js deleted file mode 100755 index 2044c114..00000000 --- a/views/Account.render.react.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' -import {render} from 'react-dom' -import { Provider } from 'react-redux' - -import AccountPage from './Account.react' -import store from '../stores/store' - -const reduxStore = store() - -render(, document.getElementById('main')); diff --git a/views/Account.template.js b/views/Account.template.js deleted file mode 100755 index b951e806..00000000 --- a/views/Account.template.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = (user, name, icon, mail, role) => { - var userState = { - "uid" : user, - "name" : name, - "icon" : icon, - "mail" : mail, - "role" : role - }; - return ` - - - - - - Account - DPdash - - - -
- - - - `; -}; diff --git a/views/Admin.react.js b/views/Admin.react.js deleted file mode 100644 index a7c7e61d..00000000 --- a/views/Admin.react.js +++ /dev/null @@ -1,992 +0,0 @@ -import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import moment from 'moment'; -import 'whatwg-fetch'; -import update from 'immutability-helper'; -import { Column, Table } from 'react-virtualized'; -import * as _ from 'lodash'; -import ChipInput from 'material-ui-chip-input'; -import uuid from 'uuid'; -import classNames from 'classnames'; - -import Person from '@material-ui/icons/AccountCircle'; -import Settings from '@material-ui/icons/Settings'; -import Back from '@material-ui/icons/ChevronLeft'; -import SearchIcon from '@material-ui/icons/Search'; -import Clear from '@material-ui/icons/Clear'; - -import DialogActions from '@material-ui/core/DialogActions'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import DialogContent from '@material-ui/core/DialogContent'; -import Dialog from '@material-ui/core/Dialog'; -import Button from '@material-ui/core/Button'; -import Subheader from '@material-ui/core/ListSubheader';; -import Divider from '@material-ui/core/Divider'; -import SelectField from '@material-ui/core/Select'; -import MenuItem from '@material-ui/core/MenuItem'; -import Checkbox from '@material-ui/core/Checkbox'; -import IconButton from '@material-ui/core/IconButton'; -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import Typography from '@material-ui/core/Typography'; -import Avatar from '@material-ui/core/Avatar'; -import NoSsr from '@material-ui/core/NoSsr'; -import Select from 'react-select'; -import TextField from '@material-ui/core/TextField'; -import Paper from '@material-ui/core/Paper'; -import Chip from '@material-ui/core/Chip'; -import { emphasize } from '@material-ui/core/styles/colorManipulator'; - -const memberMenu = [ - {value: 0, level: 'admin', text: 'System Admins'}, - {value: 1, level: 'manager', text: 'Study Manager'}, - {value: 2, level: 'member', text: 'Member'} -]; - -import {compose} from 'redux'; -import { withStyles } from '@material-ui/core/styles'; -import DrawerComponent from './Drawer.react'; -import Drawer from '@material-ui/core/Drawer'; -const drawerWidth = 200; -import Hidden from '@material-ui/core/Hidden'; - -const styles = theme => ({ - root: { - flexGrow: 1, - height: '100vh', - zIndex: 1, - overflow: 'hidden', - position: 'relative', - display: 'flex', - width: '100%', - }, - appBar: { - position: 'absolute', - marginLeft: drawerWidth, - [theme.breakpoints.up('md')]: { - width: `calc(100% - ${drawerWidth}px)`, - }, - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - backgroundColor: 'white', - color: 'rgba(0, 0, 0, 0.54)' - }, - navIconHide: { - [theme.breakpoints.up('md')]: { - display: 'none', - }, - }, - drawerPaper: { - width: drawerWidth, - [theme.breakpoints.up('md')]: { - position: 'relative', - }, - borderRight: '0px' - }, - content: { - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - flexGrow: 1, - backgroundColor: '#fefefe', - padding: theme.spacing.unit * 3, - }, - input: { - display: 'flex', - padding: 0, - }, - valueContainer: { - display: 'flex', - flexWrap: 'wrap', - flex: 1, - alignItems: 'center', - }, - chip: { - margin: `${theme.spacing.unit / 2}px ${theme.spacing.unit / 4}px`, - }, - chipFocused: { - backgroundColor: emphasize( - theme.palette.type === 'light' ? theme.palette.grey[300] : theme.palette.grey[700], - 0.08, - ), - }, - noOptionsMessage: { - padding: `${theme.spacing.unit}px ${theme.spacing.unit * 2}px`, - }, - singleValue: { - fontSize: 16, - }, - placeholder: { - position: 'absolute', - left: 2, - fontSize: 16, - }, - paper: { - marginTop: theme.spacing.unit, - position: 'absolute', - width: '100%' - }, -}); - -function NoOptionsMessage(props) { - return ( - - {props.children} - - ); -} -function inputComponent({ inputRef, ...props }) { - return
; -} -function Control(props) { - return ( - - ); -} -function Option(props) { - return ( - - - {props.children} - - - ); -} -function Placeholder(props) { - return ( - - {props.children} - - ); -} -function SingleValue(props) { - return ( - - {props.children} - - ); -} -function ValueContainer(props) { - return
{props.children}
; -} -function MultiValue(props) { - return ( - { - props.removeProps.onClick(); - props.removeProps.onMouseDown(event); - }} - /> - ); -} -function Menu(props) { - return ( - - {props.children} - - ); -} -function DropdownIndicator(props) { - return ( - - ); -} -const indicatorSeparatorStyle = { - display: 'none' -}; - -const IndicatorSeparator = ({ innerProps }) => { - return ( - - ); -}; -var autocomplete = []; - -class AdminPage extends Component { - constructor(props) { - super(props); - this.state = { - tab: 0, - width: 0, - height: 0, - sortBy: '', - sortDirection: 'ASC', - marginHeight: 72, - marginWidth: 24, - studies: [], - editACL : [], - editLevel : '', - openAccess: false, - openReset: false, - resetUser: 0, - totalStudies: 0, - totalSubjects: 0, - totalDays : 0, - mobileOpen: false, - search: [], - search_array: [], - deleteUser: -1 - }; - } - componentDidUpdate() { - } - componentDidMount() { - this.setState({ - width: window.innerWidth - this.state.marginWidth, - height: window.innerHeight - this.state.marginHeight, - avatar : this.getAvatar() - }) - /* Resize listener register */ - window.addEventListener('resize', this.handleResize) - } - countSubjects = (acl) => { - var options = []; - for(var study = 0; study < acl.length; study++) { - Array.prototype.push.apply(options, acl[study].subjects); - } - this.setState({ - totalStudies: acl.length, - totalSubjects: options.length, - totalDays: Math.max.apply(Math, options.map(function(o) { return o.days; })) - }); - } - componentWillMount() { - this.fetchUsers(); - this.fetchStudies(); - this.fetchSubjects(); - } - componentWillUnmount() { - window.removeEventListener('resize', this.handleResize); - } - handleDrawerToggle = () => { - this.setState(state => ({ mobileOpen: !state.mobileOpen })); - }; - fetchSubjects = () => { - return window.fetch('/api/v1/studies', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - let studies = response ? response : []; - window.fetch('/api/v1/subjects?q=' + JSON.stringify(studies), { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - this.countSubjects(response) - }); - }); - } - getAvatar = () => { - var icon = this.props.user.icon; - var username = this.props.user.name; - var uid = this.props.user.uid; - if(icon == '' || icon == undefined) { - if(username == '' || username == undefined) { - if(uid && uid.length > 0) { - return {uid[0]} - } else { - return - } - } else { - return {username[0]} - } - } else { - return - } - } - fetchStudies = () => { - return window.fetch('/api/v1/search/studies', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - this.setState({ - studies: response.map(suggestion => ({ - value: suggestion, - label: suggestion - })) - }); - return; - }); - } - fetchUsers = () => { - return window.fetch('/api/v1/users', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - this.setState({ - users: this.autocomplete(response) - }); - return; - }); - } - autocomplete = (users) => { - autocomplete = users.map(option => ({ - value: option.uid, - label: ((/\S/.test(option.display_name) && option.display_name != undefined) ? option.display_name : option.uid) - })); - return users; - } - handleTab = (value) => { - this.setState({ - tab: value, - }); - } - handleResize = (event) => { - this.setState({ - width: window.innerWidth - this.state.marginWidth, - height: window.innerHeight - this.state.marginHeight - }) - } - sort = ({sortBy, sortDirection}) => { - const sortedList = this.sortList({sortBy, sortDirection}) - this.setState({ - sortBy: sortBy, - sortDirection: sortDirection, - users: sortedList - }) - } - sortList = ({sortBy, sortDirection}) => { - let list = _.map(this.state.users, _.clone) - return _.orderBy(list, [sortBy], sortDirection.toLowerCase()) - } - rowClassName = ({index}) => { - if (index < 0) { - return 'headerRow' - } else { - return index % 2 === 0 ? 'evenRow' : 'oddRow' - } - } - resetPassword =(cellData)=> { - let index = _.findIndex(this.state.users, function(i) { return cellData['rowData'].uid == i.uid}); - this.openReset(index); - } - closeReset =()=> { - this.setState({ - openReset: false, - resetUser: 0 - }); - } - deleteUser = (cellData) => { - let index = _.findIndex(this.state.users, function(i) { return cellData['rowData'].uid == i.uid}); - this.setState({ - deleteUser: index, - openDelete : true - }); - } - confirmDelete =() => { - let index = this.state.deleteUser; - return window.fetch('/api/v1/users/' + this.state.users[index].uid + '/delete', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - this.closeDelete(); - location.reload(); - }); - } - closeDelete = () => { - this.setState({ - openDelete: false, - deleteUser: -1 - }); - } - blockUser = (cellData) => { - let index = _.findIndex(this.state.users, function(i) { return cellData['rowData'].uid == i.uid}); - let blocked = this.state.users[index]['blocked'] ? this.state.users[index]['blocked'] : false; - let block = !blocked; - let uid = this.state.users[index]['uid']; - this.setState({ - users: update(this.state.users, { - [index] : { - blocked : { - $set : block - } - } - }) - }); - this.updateBlockedUser(uid, block); - } - updateBlockedUser =(uid, block)=> { - return window.fetch('/api/v1/users/' + uid + '/blocked', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - blocked : block, - }) - }).then((response) => { - return; - }); - } - openReset =(index) => { - let uid = this.state.users[index]['uid']; - let reset = this.state.users[index]['force_reset_pw'] ? this.state.users[index]['force_reset_pw'] : false; - let reset_key = uuid.v4(); - if(reset == true) { - reset_key = ''; - this.setState({ - users: update(this.state.users, { - [index] : { - force_reset_pw : { - $set : !reset - }, - reset_key : { - $set : reset_key - } - } - }) - }); - } else { - this.setState({ - users: update(this.state.users, { - [index] : { - force_reset_pw : { - $set : !reset - }, - reset_key : { - $set : reset_key - } - } - }), - openReset: true, - resetUser : index - }); - } - - this.updateReset(uid, !reset, reset_key); - } - updateReset = (uid, force_reset, reset_key) => { - return window.fetch('/api/v1/users/' + uid + '/resetpw', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - force_reset_pw : force_reset, - reset_key: reset_key - }) - }).then((response) => { - return; - }); - } - openAccess = (cellData) => { - let index = _.findIndex(this.state.users, function(i) { return cellData['rowData'].uid == i.uid}); - let access = ('access' in this.state.users[index]) ? this.state.users[index]['access'].map(suggestion => ({ - value: suggestion, - label: suggestion - })) : []; - this.setState({ - editACL: access, - editLevel: this.findEditLevel(this.state.users[index]['role']), - editUser: index, - openAccess: true - }); - } - findEditLevel = (role) => { - for (let key = 0; key < memberMenu.length; key++) { - if(memberMenu[key].level === role) { - return key - } - } - return 0 - } - closeAccess = () => { - let role = memberMenu[this.state.editLevel]['level']; - let uid = this.state.users[this.state.editUser]['uid']; - let access = this.state.editACL; - this.updateRole(uid, role); - - this.setState({ - editACL: [], - editUser: -1, - openAccess: false - }); - } - handleAddChip = (chip) => { - this.setState({ - editACL: update(this.state.editACL, { - $push: [chip] - }) - }); - } - handleDeleteChip = (chip, index) => { - this.setState({ - editACL: update(this.state.editACL, { - $splice: [[index, 1]] - }) - }); - } - modifyACL = () => { - let uid = this.state.users[this.state.editUser]['uid']; - let role = memberMenu[this.state.editLevel]['level']; - let access = this.state.editACL.map(f => f.value); - - this.setState({ - users: update(this.state.users, { - [this.state.editUser] : { - access: { - $set : access - }, - role : { - $set : role - } - } - }) - }); - return window.fetch('/api/v1/users/' + uid + '/studies', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - acl : access, - }) - }).then((response) => { - this.closeAccess(); - }); - } - handleLevelChange =(event)=> { - this.setState({ - editLevel: event.target.value - }); - } - openNewWindow = (uri) => { - window.open(uri, '_self'); - } - updateRole = (uid, role) => { - return window.fetch('/api/v1/users/' + uid + '/role', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - role : role, - }) - }).then((response) => { - return; - }); - } - generatetMenu = (options) => { - return options.map((option, index) => ( - {option.text} - )); - } - handleSearch = value => { - this.setState({ - search : value, - search_array: value.map(option=> option.value) - }); - }; - handleChange = name => value => { - this.setState({ - [name]: value, - }); - }; - render() { - const actions = [ - - - - - { this.state.users && this.state.deleteUser != -1 ? - - - Delete user {this.state.users[this.state.deleteUser].display_name} (uid: {this.state.users[this.state.deleteUser].uid})? - - - - - - : null} - { this.state.users ? - - - Reset user password - - - - {this.state.users[this.state.resetUser] ? 'Reset key for user: ' + this.state.users[this.state.resetUser]['uid'] : ''} - -

{this.state.users[this.state.resetUser]['reset_key'] ? this.state.users[this.state.resetUser]['reset_key'] : ''}

-
-
: null} -
- ); - } -} - -const mapStateToProps = (state) => ({ - user: state.user -}) - -export default compose( - withStyles(styles, { withTheme: true }), - connect(mapStateToProps) -)(AdminPage); diff --git a/views/Admin.render.react.js b/views/Admin.render.react.js deleted file mode 100755 index 9b3850c1..00000000 --- a/views/Admin.render.react.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import {render} from 'react-dom'; -import { Provider } from 'react-redux'; - -import AdminPage from './Admin.react'; -import store from '../stores/store'; - -const reduxStore = store(); - -render(, document.getElementById('main')); diff --git a/views/Admin.template.js b/views/Admin.template.js deleted file mode 100644 index 7de92c4a..00000000 --- a/views/Admin.template.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = (user,name,role,icon) => { - var userState = { - "uid" : user, - "name" : name, - "role" : role, - "icon" : icon - }; - return ` - - - - - - - DPdash - - - -
- - - - `; -}; diff --git a/views/App.css b/views/App.css new file mode 100644 index 00000000..761494b0 --- /dev/null +++ b/views/App.css @@ -0,0 +1,15 @@ +:root { + --primary-light: #addbff; + --primary-main: #2196f3; + --text-secondary: #054da7; + --dark-transparent-grey: #616161e6; + --underline-grey: #0000001f; +} + +.Link--unstyled { + text-decoration: none; +} + +.Link--unstyled { + text-decoration: none; +} diff --git a/views/App.jsx b/views/App.jsx new file mode 100644 index 00000000..996a26b8 --- /dev/null +++ b/views/App.jsx @@ -0,0 +1,50 @@ +import React, { useState } from 'react' + +import { + CssBaseline, + StyledEngineProvider, + createTheme, + ThemeProvider, + Snackbar, +} from '@mui/material' +import { LocalizationProvider } from '@mui/x-date-pickers' +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs' + +import { AuthContext, NotificationContext } from './contexts' +import Router from './routes' +import { NOTIFICATION_DEFAULT, THEME } from '../constants' + +import './App.css' + +const theme = createTheme(THEME) + +const App = () => { + const [notification, setNotification] = useState(NOTIFICATION_DEFAULT) + const [user, setUser] = useState(null) + + const handleNotificationClose = () => setNotification(NOTIFICATION_DEFAULT) + + return ( + + + + + + + + + + + + + + ) +} + +export default App diff --git a/views/Config.react.js b/views/Config.react.js deleted file mode 100644 index c98efc81..00000000 --- a/views/Config.react.js +++ /dev/null @@ -1,1000 +0,0 @@ -import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import moment from 'moment'; -import 'whatwg-fetch'; -import update from 'immutability-helper'; - -import Person from '@material-ui/icons/Person'; -import ColorLens from '@material-ui/icons/ColorLens'; -import Edit from '@material-ui/icons/Edit'; -import Clear from '@material-ui/icons/Clear'; -import Share from '@material-ui/icons/Share'; -import FullView from '@material-ui/icons/AspectRatio'; -import Add from '@material-ui/icons/Add'; -import Copy from '@material-ui/icons/FileCopy'; -import ContentAdd from '@material-ui/icons/Add'; -import AttachFile from '@material-ui/icons/AttachFile'; - -import Card from '@material-ui/core/Card'; -import CardActions from '@material-ui/core/CardActions'; -import CardHeader from '@material-ui/core/CardHeader'; -import CardMedia from '@material-ui/core/CardMedia'; -import CardContent from '@material-ui/core/CardContent'; - -import FormControlLabel from '@material-ui/core/FormControlLabel'; -import Button from '@material-ui/core/Button'; -import GridList from '@material-ui/core/GridList'; -import Avatar from '@material-ui/core/Avatar'; -import IconButton from '@material-ui/core/IconButton'; -import Dialog from '@material-ui/core/Dialog'; -import DialogActions from '@material-ui/core/DialogActions'; -import DialogContent from '@material-ui/core/DialogContent'; -import DialogTitle from '@material-ui/core/DialogTitle'; -import ChipInput from 'material-ui-chip-input'; -import Switch from '@material-ui/core/Switch'; -import Divider from '@material-ui/core/Divider'; -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import Snackbar from '@material-ui/core/Snackbar'; -import ButtonBase from '@material-ui/core/ButtonBase'; -import Tooltip from '@material-ui/core/Tooltip'; - -import {compose} from 'redux'; -import { withStyles } from '@material-ui/core/styles'; -import DrawerComponent from './Drawer.react'; -import Drawer from '@material-ui/core/Drawer'; -const drawerWidth = 200; -import Hidden from '@material-ui/core/Hidden'; - -import NoSsr from '@material-ui/core/NoSsr'; -import TextField from '@material-ui/core/TextField'; -import Paper from '@material-ui/core/Paper'; -import Chip from '@material-ui/core/Chip'; -import MenuList from '@material-ui/core/MenuList'; -import MenuItem from '@material-ui/core/MenuItem'; -import CancelIcon from '@material-ui/icons/Cancel'; -import { emphasize } from '@material-ui/core/styles/colorManipulator'; -import Select from 'react-select'; -import classNames from 'classnames'; -import Typography from '@material-ui/core/Typography'; - -const styles = theme => ({ - root: { - flexGrow: 1, - height: '100vh', - zIndex: 1, - overflow: 'hidden', - position: 'relative', - display: 'flex', - width: '100%', - backgroundColor: '#fefefe', - }, - appBar: { - position: 'absolute', - marginLeft: drawerWidth, - [theme.breakpoints.up('md')]: { - width: `calc(100% - ${drawerWidth}px)`, - }, - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - backgroundColor: 'white', - color: 'rgba(0, 0, 0, 0.54)' - }, - navIconHide: { - [theme.breakpoints.up('md')]: { - display: 'none', - }, - }, - drawerPaper: { - width: drawerWidth, - [theme.breakpoints.up('md')]: { - position: 'relative', - }, - borderRight: '0px' - }, - content: { - flexGrow: 1, - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - backgroundColor: '#fefefe', - padding: theme.spacing.unit * 3, - }, - input: { - display: 'flex', - padding: 0, - }, - valueContainer: { - display: 'flex', - flexWrap: 'wrap', - flex: 1, - alignItems: 'center', - }, - chip: { - margin: `${theme.spacing.unit / 2}px ${theme.spacing.unit / 4}px`, - }, - chipFocused: { - backgroundColor: emphasize( - theme.palette.type === 'light' ? theme.palette.grey[300] : theme.palette.grey[700], - 0.08, - ), - }, - noOptionsMessage: { - padding: `${theme.spacing.unit}px ${theme.spacing.unit * 2}px`, - }, - singleValue: { - fontSize: 16, - }, - placeholder: { - position: 'absolute', - left: 2, - fontSize: 16, - }, - paper: { - position: 'relative', - marginTop: theme.spacing.unit, - left: 0, - right: 0, - zIndex: 1 - }, - divider: { - height: theme.spacing.unit * 2, - }, -}); - -function NoOptionsMessage(props) { - return ( - - {props.children} - - ); -} - -function inputComponent({ inputRef, ...props }) { - return
; -} - -function Control(props) { - return ( - - ); -} - -function Option(props) { - return ( - - {props.children} - - ); -} - -function Placeholder(props) { - return ( - - {props.children} - - ); -} - -function SingleValue(props) { - return ( - - {props.children} - - ); -} - -function ValueContainer(props) { - return
{props.children}
; -} - -function MultiValue(props) { - return ( - } - /> - ); -} - -function Menu(props) { - return ( - - - {props.children} - - - ); -} - -const components = { - Control, - Menu, - MultiValue, - NoOptionsMessage, - Option, - Placeholder, - SingleValue, - ValueContainer, -}; - -class ConfigPage extends Component { - constructor(props) { - super(props); - this.state = { - user: {}, - preferences:{}, - configurations: [], - gridCols : 1, - gridWidth : 350, - searchUsers: false, - friends: [], - shared: [], - snackTime: false, - uploadSnack: false, - selectedConfig: {}, - configOwner: '', - totalStudies: 0, - totalSubjects: 0, - totalDays : 0, - mobileOpen: false - }; - } - handleDrawerToggle = () => { - this.setState(state => ({ mobileOpen: !state.mobileOpen })); - }; - componentDidUpdate() { - } - componentWillMount() { - this.fetchConfigurations(this.props.user.uid); - this.fetchPreferences(this.props.user.uid); - this.fetchUsers(); - this.fetchSubjects(); - } - fetchSubjects = () => { - return window.fetch('/api/v1/studies', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - let studies = response ? response : []; - window.fetch('/api/v1/subjects?q=' + JSON.stringify(studies), { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - this.autocomplete(response) - }); - }); - } - autocomplete = (acl) => { - var options = []; - for(var study = 0; study < acl.length; study++) { - Array.prototype.push.apply(options, acl[study].subjects); - } - this.setState({ - totalStudies: acl.length, - totalSubjects: options.length, - totalDays: Math.max.apply(Math, options.map(function(o) { return o.days; })) - }); - } - componentDidMount() { - if(this.props.user.message.length > 0) { - this.setState({ - uploadSnack: true, - avatar : this.getAvatar() - }); - } else { - this.setState({ - avatar : this.getAvatar() - }); - } - /* Initial Sizing */ - this.handleResize(true); - /* Resize listener register */ - window.addEventListener('resize', this.handleResize); - } - componentWillUnmount() { - window.removeEventListener('resize', this.handleResize); - } - getAvatar = () => { - var icon = this.props.user.icon; - var username = this.props.user.name; - var uid = this.props.user.uid; - if(icon == '' || icon == undefined) { - if(username == '' || username == undefined) { - if(uid && uid.length > 0) { - return {uid[0]} - } else { - return - } - } else { - return {username[0]} - } - } else { - return - } - } - handleResize = (event) => { - if (window.innerWidth >= 768) { - let gridCols = Math.floor(window.innerWidth / this.state.gridWidth); - this.setState({ - gridCols: gridCols - }); - } else { - this.setState({ - gridCols: 1 - }); - } - } - fetchUsers = () => { - return window.fetch('/api/v1/search/users', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return; - } - return response.json(); - }).then((response) => { - this.setState({ - friends: response.map(friend => ({ - value: friend, - label: friend - })) - }); - }); - } - babyProofPreferences = (preferences) => { - let preference = {}; - preference['star'] = 'star' in preferences ? preferences['star'] : {}; - preference['sort'] = 'sort' in preferences ? preferences['sort'] : 0; - preference['config'] = 'config' in preferences ? preferences['config'] : ''; - preference['complete'] = 'complete' in preferences ? preferences['complete'] : {}; - return preference; - } - updateUserPreferences = (index, type) => { - let uid = this.props.user.uid; - let preference = {}; - if (type == 'index') { - if(this.state.configurations.length > 0 && this.state.configurations[index]) { - preference['config'] = this.state.configurations[index]['_id']; - } - } else { - preference['config'] = index; - } - preference['complete'] = 'complete' in this.state.preferences ? this.state.preferences['complete'] : {}; - preference['star'] = 'star' in this.state.preferences ? this.state.preferences['star'] : {}; - preference['sort'] = 'sort' in this.state.preferences ? this.state.preferences['sort'] : 0; - preference = this.babyProofPreferences(preference); - - return window.fetch('/api/v1/users/' + uid + '/preferences', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - preferences: preference - }) - }).then((response) => { - if (type == 'index') { - this.setState({ - preferences: preference, - snackTime: true - }); - } else { - this.setState({ - preferences: preference - }); - } - }); - } - fetchPreferences = (uid) => { - return window.fetch('/api/v1/users/' + uid + '/preferences', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return; - } - return response.json(); - }).then((response) => { - this.setState({ - preferences: this.babyProofPreferences(response) - }); - }); - } - fetchConfigItem =(uid, _id)=> { - return window.fetch('/api/v1/users/' + uid + '/configs/' + _id , { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return; - } - return response.json(); - }).then((response) => { - }); - } - fetchConfigurations = (uid) => { - return window.fetch('/api/v1/users/' + uid + '/configs', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return; - } - return response.json(); - }).then((response) => { - this.setState({ - configurations: response - }); - }); - } - updateConfigurations = (configID, ownsConfig) => { - if(ownsConfig) { - window.fetch('/api/v1/users/' + this.props.user.uid + '/configs', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - remove : configID - }) - }).then((response) => { - return; - }); - } else { - window.fetch('/api/v1/users/' + this.props.user.uid + '/configs', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - disable : configID - }) - }).then((response) => { - return; - }); - } - } - handleCrumbs =()=> { - this.setState({ - snackTime: false, - uploadSnack : false - }); - } - removeConfig = (configs, index, configID, ownsConfig) => { - this.updateConfigurations(configID, ownsConfig); - this.setState({ - configurations: update(configs, { - $splice: [[index, 1]] - }), - snackTime: true - }); - if(index == this.state.preferences['config']) { - this.updateUserPreferences(0, 'index'); - } - } - openSearchUsers = (index, configID, shared, owner) => { - this.setState({ - searchUsers: true, - selectedConfig: { - _id: configID, - index: index - }, - shared: shared.map(friend => ({ - label: friend, - value: friend - })), - configOwner: owner - }); - } - closeSearchUsers = () => { - this.setState({ - searchUsers: false, - selectedConfig: { - _id: '', - index: -1 - }, - shared: [], - configOwner: '' - }); - } - copyConfig = (config) => { - let newConfig = {}; - newConfig['owner'] = this.props.user.uid; - newConfig['readers'] = [this.props.user.uid]; - newConfig['created'] = (new Date()).toUTCString(); - newConfig['type'] = config['type']; - newConfig['name'] = config['name']; - newConfig['config'] = config['config']; - - return window.fetch('/api/v1/users/' + this.props.user.uid + '/configs', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - add : newConfig - }) - }).then((response) => { - if (response.status == 201) { - this.fetchConfigurations(this.props.user.uid); - } - }); - } - openNewWindow = (uri) => { - window.open(uri, '_self'); - } - generateCards = (configs, preference) => { - let cards = []; - if(configs && configs.length > 0) { - for (let item in configs) { - let ownsConfig = this.props.user.uid === configs[item]['owner'] ? true : false; - let showTime = 'modified' in configs[item] ? configs[item]['modified'] : configs[item]['created']; - let localTime = moment.utc(showTime).local().format(); - let updated = moment(localTime).calendar(); - cards.push( - - this.removeConfig(configs,item,configs[item]['_id'],ownsConfig)} - > - - - } - /> - -
- - {configs[item]['name']} - - - {configs[item]['type']} - -
- -
-
- { ownsConfig ? this.openNewWindow('/u/configure?s=edit&id=' + configs[item]['_id'])} - iconStyle={{color: 'rgba(0, 0, 0, 0.54)'}} - tooltipPosition='top-center' - tooltip="Edit"> : this.openNewWindow('/u/configure?s=view&id=' + configs[item]['_id'])} - iconStyle={{color: 'rgba(0, 0, 0, 0.54)'}} - tooltipPosition='top-center' - tooltip="View"> - } - { ownsConfig ? this.openSearchUsers(item, configs[item]['_id'], configs[item]['readers'], configs[item]['owner'])} - > : this.copyConfig(configs[item])} - > - - - } -
- this.changeDefaultConfig(e, isInputChecked, item)} - /> - } - label='Default' - /> -
-
-
- ); - } - } - return cards; - } - shareWithUsers = () => { - return window.fetch('/api/v1/users/' + this.props.user.uid + '/configs', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - share : this.state.selectedConfig['_id'], - shared: this.state.shared.map(o => { return o.value }) - }) - }).then((response) => { - if (response.status == 201) { - this.setState({ - configurations: update(this.state.configurations, { - [this.state.selectedConfig['index']]: { - ['readers'] : { - $set : this.state.shared.map(o => { return o.value }) - } - } - }) - }); - } - this.closeSearchUsers(); - }); - } - handleChange = name => value => { - let uid = this.props.user.uid; - let names = value.map(o=> {return o.value}); - if(names.indexOf(uid) === -1) { - console.log("Can't delete the owner."); - return; - } - this.setState({ - [name]: value, - }); - } - handleChangeFile = (event) => { - this.refs.config_file.submit(); - } - changeDefaultConfig = (e, checked, index) => { - this.updateUserPreferences(index, 'index'); - } - render() { - const { classes, theme } = this.props; - const actions = [ - , - , - ]; - const selectStyles = { - input: base => ({ - ...base, - color: theme.palette.text.primary, - '& input': { - font: 'inherit', - }, - }), - }; - return ( -
- - - - - - - Configuration - - this.openNewWindow('/u')} - > - - - - - - - - - - - - - - -
- - {this.generateCards(this.state.configurations, this.state.preferences)} - -
-
- - -
- -
- - - - Share your configuration - - - - this.handlePaint(event, item)} - > - {this.state.colorblock} - -
-
- this.handleRangeChange(event, item, 'min')} - /> - this.handleRangeChange(event, item, 'max')} - /> -
- } - icon={} - onChange={(event, isInputChecked) => this.makeVisible(event, isInputChecked, item)} - checked={config[item]['text']} - style={{ - width: 'auto', - paddingTop: '4px', - paddingLeft: '4px', - paddingRight: '4px', - paddingBottom: '12px' - }} - /> - } - label='Display Value' - /> - - - - this.copyConfig(item)} - > - - - this.removeConfig(item)} - > - - - - - ); - } - } - return cards; - } - handlePaint = (event, row) => { - let value = event.target.value - this.setState({ - themes: update(this.state.themes, { - [row] : { - $set : value - } - }), - config: update(this.state.config, { - [this.state.configKey]: { - [row] : { - ['color'] : { - $set : this.state.colorarray[value] - } - } - } - }) - }); - } - copyConfig = (index) => { - let configurationItem = this.state.config[this.state.configKey][index]; - let newConfigIndex = this.state.config[this.state.configKey].length; - this.setState({ - config: update(this.state.config, { - [this.state.configKey] : { - $push: [configurationItem] - } - }), - themes: update(this.state.themes, { - [newConfigIndex] : { - $set: this.state.themes[index] - } - }) - }); - } - addConfiguration =()=> { - let newConfigIndex = this.state.config[this.state.configKey].length; - let configurationItem = { - _id : newConfigIndex, - analysis: '', - category: '', - color: this.state.colorarray[0], - label: '', - range: [0,1], - text: false, - variable: '' - }; - - this.setState({ - config: update(this.state.config, { - [this.state.configKey] : { - $push: [configurationItem] - } - }), - themes: update(this.state.themes, { - [newConfigIndex] : { - $set: 0 - } - }) - }); - } - saveConfiguration = () => { - let newReaders = this.state.readers.map(o => { return o.value }); - let newConfig = { - _id : this.state._id, - config: this.state.config, - name: this.state.name, - type: this.state.type, - readers : newReaders, - modified: (new Date()).toUTCString() - }; - return window.fetch('/api/v1/users/' + this.state.user.uid + '/configs', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - edit: newConfig - }) - }).then((response) => { - if (response.status !== 201) { - return; - } - return response.json(); - }).then((response) => { - this.setState({ - snackTime: true - }); - }); - } - insertConfiguration = () => { - let newReaders = this.state.readers.map(o => { return o.value }); - let newConfig = { - owner: this.state.owner, - config: this.state.config, - name: this.state.name, - type: this.state.type, - readers : newReaders, - created: this.state.created - }; - return window.fetch('/api/v1/users/' + this.state.user.uid + '/configs', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - redirect: 'follow', - credentials: 'same-origin', - body: JSON.stringify({ - add: newConfig - }) - }).then((response) => { - if (response.status !== 201) { - return; - } - return response.json(); - }).then((response) => { - this.setState({ - snackTime: true - }); - if('uri' in response) { - window.location.replace(response.uri); - } - }); - } - handleChange = name => value => { - let uid = this.props.user.uid; - let names = value.map(o=> {return o.value}); - if(names.indexOf(uid) === -1) { - console.log("Can't delete the owner."); - return; - } - this.setState({ - [name]: value, - }); - } - handleCrumbs =()=> { - this.setState({ - snackTime: false - }); - } - render() { - const { classes, theme } = this.props; - const selectStyles = { - input: base => ({ - ...base, - color: theme.palette.text.primary, - '& input': { - font: 'inherit', - }, - }), - }; - return ( -
- - - - - - - - {this.generateCards(this.state.config)} - - { !this.state.viewOnly ? -
- -
- { this.props.user.goal == 'add' ? - - : } -
- : null } - -
- ); - } -} - -const mapStateToProps = (state) => ({ - user: state.user -}); - -export default compose( - withStyles(styles, { withTheme: true }), - connect(mapStateToProps) -)(EditConfig); diff --git a/views/EditConfig.render.react.js b/views/EditConfig.render.react.js deleted file mode 100755 index 7af6adbc..00000000 --- a/views/EditConfig.render.react.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' -import {render} from 'react-dom' -import { Provider } from 'react-redux' - -import EditConfig from './EditConfig.react' -import store from '../stores/store' - -const reduxStore = store() - -render(, document.getElementById('main')); diff --git a/views/EditConfig.template.js b/views/EditConfig.template.js deleted file mode 100755 index dfb19709..00000000 --- a/views/EditConfig.template.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = (user, goal, id) => { - var userState = { - "uid" : user, - "goal" : goal, - "config" : id - }; - return ` - - - - - Edit Configuration - DPdash - - - -
- - - - `; -}; diff --git a/views/Graph.react.js b/views/Graph.react.js deleted file mode 100755 index 44448ac2..00000000 --- a/views/Graph.react.js +++ /dev/null @@ -1,634 +0,0 @@ -import React, {Component} from 'react' -import GraphFactory from './GraphFactory.react' -import { connect } from 'react-redux' -import io from 'socket.io-client' -import 'whatwg-fetch' -import update from 'immutability-helper' -import FileSaver from 'file-saver' - -import Button from '@material-ui/core/Button'; -import List from '@material-ui/core/List'; -import ListItem from '@material-ui/core/ListItem'; -import * as _ from 'lodash'; - -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import IconButton from '@material-ui/core/IconButton'; -import Typography from '@material-ui/core/Typography'; - -import Avatar from '@material-ui/core/Avatar'; -import {compose} from 'redux'; -import { withStyles } from '@material-ui/core/styles'; -import DrawerComponent from './Drawer.react'; -import Drawer from '@material-ui/core/Drawer'; -const drawerWidth = 200; -import Hidden from '@material-ui/core/Hidden'; - -import SaveIcon from '@material-ui/icons/Save'; -import CircularProgress from '@material-ui/core/CircularProgress'; -import green from '@material-ui/core/colors/green'; -import CheckIcon from '@material-ui/icons/Check'; -import RefreshIcon from '@material-ui/icons/Refresh'; -import Tooltip from '@material-ui/core/Tooltip'; -import classNames from 'classnames'; - -import DialogActions from '@material-ui/core/DialogActions'; -import DialogContent from '@material-ui/core/DialogContent'; -import Dialog from '@material-ui/core/Dialog'; -import Functions from '@material-ui/icons/Functions'; - -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import TableHead from '@material-ui/core/TableHead'; -import TableRow from '@material-ui/core/TableRow'; - -const socketAddress = 'https://' + window.location.hostname + '/dashboard' -const socket = io(socketAddress, { - requestTimeout: 1250, -// timeout: 1600, - randomizationFactor: 0, - reconnectionDelay: 0, - autoConnect: false -}) - -const styles = theme => ({ - root: { - flexGrow: 1, - height: '100vh', - zIndex: 1, - overflow: 'hidden', - position: 'relative', - display: 'flex', - width: '100%', - }, - appBar: { - position: 'absolute', - marginLeft: drawerWidth, - [theme.breakpoints.up('md')]: { - width: `calc(100% - 0px)`, - }, - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - backgroundColor: 'white', - color: 'rgba(0, 0, 0, 0.54)' - }, - navIconHide: { - }, - drawerPaper: { - width: drawerWidth, - [theme.breakpoints.up('md')]: { - position: 'relative', - }, - borderRight: '0px' - }, - content: { - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - flexGrow: 1, - backgroundColor: '#fefefe', - padding: theme.spacing.unit * 3, - }, - wrapper: { - margin: theme.spacing.unit, - position: 'relative', - }, - buttonSuccess: { - backgroundColor: green[500], - '&:hover': { - backgroundColor: green[700], - }, - }, - fabProgress: { - color: green[500], - position: 'absolute', - bottom: -6, - left: -6, - zIndex: 1, - }, - buttonProgress: { - color: green[500], - position: 'absolute', - top: '50%', - left: '50%', - marginTop: -12, - marginLeft: -12, - }, -}); - -const CustomTableCell = withStyles(theme => ({ - head: { - backgroundColor: theme.palette.common.black, - color: theme.palette.common.white, - }, - body: { - fontSize: 14, - }, -}))(TableCell); - -class Graph extends Component { - constructor(props) { - super(props); - this.state = { - subject: {}, - graph: {}, - user: {}, - searchList: {}, - svgLink : {}, - startFromTheLastDay: false, - graphWidth: 0, - graphHeight: 0, - startDay: 1, - lastDay: null, - maxDay: 1, - socketIOSubjectRoom: null, - socketIOUserRoom: null, - taskId: '', - metadata: {}, - configurations: { - colormap: [] - }, - data: { - matrix: {} - }, - mobileOpen: false, - icon: '', - totalSubjects: 0, - totalStudies: 0, - totalDays: 0, - loading: false, - success: false, - cardSize: 50, - openStat: false - } - } - fetchMetadata = (study, subject, day) => { - return fetch('/api/v1/studies/' + study + '/subjects/' + subject + '/deepdive/' + day, { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 201) { - return - } - return response.json() - }).then((response) => { - this.setState({ - data: response - }) - }) - } - filterList = (event) => { - let updatedList = this.state.searchList - if(event.target.value !== "") { - updatedList = this.props.user.acl.filter(function(item) { - return (item['subjects'].toLowerCase().search(event.target.value.toLowerCase()) !== -1) - }) - } else { - //reset the acl - updatedList = this.props.user.acl - } - - this.setState({searchList: updatedList}) - } - - generateListItem(acl) { - let listItem = [] - for (let i in acl) { - let link = '/dashboard/' + acl[i]['study'] + '/' + acl[i]['subjects'] - listItem.push( - - ) - } - return listItem - } - downloadPng = (event) => { - let SID = this.props.subject.sid - this.refs.canvas.toBlob((blob) => { - FileSaver.saveAs(blob, SID + '.png') - }) - } - handleResize = (event) => { - this.setState({ - graphWidth: window.innerWidth, - graphHeight: window.innerHeight - 30 - }) - } - getAvatar = () => { - var icon = this.props.user.icon; - var username = this.props.user.name; - var uid = this.props.user.uid; - if(icon == '' || icon == undefined) { - if(username == '' || username == undefined) { - if(uid && uid.length > 0) { - return {uid[0]} - } else { - return - } - } else { - return {username[0]} - } - } else { - return - } - } - resync = (event) => { - window.fetch(this.state.socketIOSubjectRoom, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if(response.status !== 201) { - return - } - return response.json() - }).then((response) => { - this.setState({taskId: response.correlationId, loading: true, success: false}) - }) - } - fetchSubjects = () => { - return window.fetch('/api/v1/studies', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - let studies = response ? response : []; - window.fetch('/api/v1/subjects?q=' + JSON.stringify(studies), { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - this.countSubjects(response) - }); - }); - } - closeStat = () => { - this.setState({ - openStat: false, - }); - } - openStat = () => { - this.setState({ - openStat: true, - }); - } - componentDidUpdate() { - } - componentWillMount() { - this.fetchSubjects(); - //this.fetchConfigurations() - //this.fetchMetadata(this.props.subject.project, this.props.subject.sid) - //this.getData(this.props.subject.project, this.props.subject.sid, this.props.graph.matrixConfig) - let maxDay = 1 - for (let dataIndex = 0; dataIndex < this.props.graph.matrixData.length; dataIndex++) { - let maxObj = _.maxBy(this.props.graph.matrixData[dataIndex]['data'], function(o) { return o.day }) - if (maxObj == undefined) { - continue - } - let day = maxObj['day'] - if (day > maxDay) { - maxDay = day - } - } - - this.setState({ - maxDay: maxDay, - subject : this.props.subject, - user : this.props.user, - iconBase64: this.props.user.icon, - searchList: this.props.user.acl, - socketIOSubjectRoom : '/resync/' + this.props.subject.project + '/' + this.props.subject.sid, - socketIOUserRoom : this.props.user.uid - }) - this.setState({configurations : this.props.user.configs }) - if (!HTMLCanvasElement.prototype.toBlob) { - Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', { - value: function (callback, type, quality) { - var binStr = atob( this.toDataURL(type, quality).split(',')[1] ), - len = binStr.length, - arr = new Uint8Array(len) - - for (var i = 0; i < len; i++ ) { - arr[i] = binStr.charCodeAt(i) - } - callback( new Blob( [arr], {type: type || 'image/png'} ) ) - } - }) - } - } - countSubjects = (acl) => { - var options = []; - for(var study = 0; study < acl.length; study++) { - Array.prototype.push.apply(options, acl[study].subjects); - } - this.setState({ - totalStudies: acl.length, - totalSubjects: options.length, - totalDays: Math.max.apply(Math, options.map(function(o) { return o.days; })) - }); - } - handleDrawerToggle = () => { - this.setState(state => ({ mobileOpen: !state.mobileOpen })); - } - generateStatItem(data) { - let tableItem = [] - for (let i in data) { - let dataItem = data[i] - let validData = _.filter(dataItem['data'], _.conforms({[dataItem['variable']] : function(n) { return _.isNumber(n) }})) - let missingDataPercentage = 100 - (validData.length * 100 / this.state.maxDay) - tableItem.push( - - {dataItem['label']} - {(dataItem['stat'].length > 0 && !isNaN(parseFloat(dataItem['stat'][0].min) && isFinite(dataItem['stat'][0].min)) ? dataItem['stat'][0].min.toFixed(2) : 'N/A' )} - {(dataItem['stat'].length > 0 && !isNaN(parseFloat(dataItem['stat'][0].max) && isFinite(dataItem['stat'][0].max)) ? dataItem['stat'][0].max.toFixed(2) : 'N/A' )} - {(dataItem['stat'].length > 0 && !isNaN(parseFloat(dataItem['stat'][0].mean) && isFinite(dataItem['stat'][0].mean)) ? dataItem['stat'][0].mean.toFixed(2) : 'N/A' )} - { missingDataPercentage.toFixed(2) + ' (' + validData.length + '/' + this.state.maxDay + ')' } - - ) - } - return tableItem - } - componentDidMount() { - socket.open() - this.setState({ - avatar : this.getAvatar() - }) - if(this.refs.matrix.graph === undefined) { - console.log('error'); - return - } - let svgElement = this.refs.matrix.graph.el.lastChild - this.setState({ - graphWidth: svgElement.getBBox().width + 20, - graphHeight: svgElement.getBBox().height, - }, - ()=>{ - // Download set-up - let DOMURL = window.URL || window.webkitURL || window - - //svg conversion - let updatedSvgElement = this.refs.matrix.graph.el.lastChild - let svgString = (new XMLSerializer()).serializeToString(updatedSvgElement) - let svgUrl = 'data:image/svg+xml; charset=utf8, '+encodeURIComponent(svgString) - - let canvas = this.refs.canvas - canvas.width = updatedSvgElement.getBBox().width - canvas.height = updatedSvgElement.getBBox().height - - // png conversion - let img = new Image() - let ctx = canvas.getContext('2d') - - img.onload = () => { - ctx.drawImage(img, 0, 0, canvas.width, canvas.height, 0, 0, canvas.width, canvas.height) - } - img.src = svgUrl - - this.setState({ - svgLink:svgUrl, - graphWidth: window.innerWidth, - graphHeight: window.innerHeight - 30, - cardSize: 20 - }) - } - ) - - /* Resize listener register */ - window.addEventListener('resize', this.handleResize) - - /* Socket.io */ - socket.on('PROCESSING', message => { - }) - - socket.on('SUCCESS', message => { - if (this.state.taskId === message.taskId) { - socket.disconnect(); - this.setState({ - loading: false, - success: true - }, - () => { - setTimeout(() => { - location.reload(true) - }, 2000) - }); - } - }) - socket.on('ERROR', message => { - }) - socket.on('CONFIG_UPDATED', message => { - if(message.uid === this.state.user.uid) { - // location.reload(true) - } - }) - } - - componentWillUnmount() { - socket.disconnect() - socket.close() - window.removeEventListener('resize', this.handleResize) - } - - render() { - const { loading, success } = this.state; - const { classes, theme } = this.props; - const buttonClassname = classNames({ - [classes.buttonSuccess]: success, - }); - const selectStyles = { - input: base => ({ - ...base, - color: theme.palette.text.primary, - }), - }; - return ( -
- - - - - - - {this.state.subject.sid + ' - ' + this.state.subject.project} - - - - - - - - - -
-
- -
-
- -
- - {loading && } -
-
-
- - - - - - Label - Min - Max - Mean - Missing % - - - - {this.generateStatItem(this.props.graph.matrixData)} - -
-
- - - -
- -
- ); - } -} - -const mapStateToProps = (state) => ({ - graph: state.graph, - user: state.user, - subject: state.subject -}) - -export default compose( - withStyles(styles, { withTheme: true }), - connect(mapStateToProps) -)(Graph); diff --git a/views/Graph.render.react.js b/views/Graph.render.react.js deleted file mode 100755 index df4a5579..00000000 --- a/views/Graph.render.react.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' -import {render} from 'react-dom' -import { Provider } from 'react-redux' - -import Graph from './Graph.react' -import store from '../stores/store' - -const reduxStore = store() - -render(, document.getElementById('graph')) diff --git a/views/Graph.template.js b/views/Graph.template.js deleted file mode 100755 index c9e2bbdb..00000000 --- a/views/Graph.template.js +++ /dev/null @@ -1,56 +0,0 @@ -module.exports = (subject, project, user, name, icon, mail, acl, matrixData, configs, celeryTasks, role) => { - var userState = { - "uid": user, - "name" : name, - "icon" : icon, - "mail" : mail, - "role" : role, - "acl": acl, - "celeryTasks" : celeryTasks, - 'configs' : configs - }; - var subjectState = { - "sid": subject, - "project" : project - }; - var graphState = { - "matrixData" : matrixData.matrixData, - "configurations" : matrixData.matrixConfig, - "consentDate" : matrixData.consentDate - }; - - return ` - - - - ${subject} - DPdash - - - - - - -
- - - - `; - -}; diff --git a/views/GraphFactory.react.js b/views/GraphFactory.react.js deleted file mode 100755 index 97f27c94..00000000 --- a/views/GraphFactory.react.js +++ /dev/null @@ -1,41 +0,0 @@ -import React, {Component} from 'react' -import { findDOMNode } from 'react-dom' - -import Matrix from './Matrix.d3' - -export default class GraphFactory extends Component { - constructor(props) { - super(props) - this.graphs = { - matrix: Matrix, - } - } - componentDidMount() { - if(!this.props.data || Object.keys(this.props.data).length == 0) { - return - } - const el = findDOMNode(this) - this.graph = new this.graphs[this.props.type](el, this.props) - this.graph.create(this.props.data) - } - - componentDidUpdate() { - const el = findDOMNode(this) - if (el.firstChild) { - el.removeChild(el.firstChild) - } - if(!this.props.data || Object.keys(this.props.data).length == 0) { - return - } - this.graph = new this.graphs[this.props.type](el, this.props) - this.graph.create(this.props.data) - //this.graph.update(this.props.data, this.props) - } - - componentWillUnmount() { - } - - render() { - return (
) - } -} diff --git a/views/Login.react.js b/views/Login.react.js deleted file mode 100644 index 4c305e76..00000000 --- a/views/Login.react.js +++ /dev/null @@ -1,246 +0,0 @@ -import React from 'react'; -import Card from '@material-ui/core/Card'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Typography from '@material-ui/core/Typography'; -import TextField from '@material-ui/core/TextField'; -import Visibility from '@material-ui/icons/Visibility'; -import VisibilityOff from '@material-ui/icons/VisibilityOff'; -import IconButton from '@material-ui/core/IconButton'; -import Input from '@material-ui/core/Input'; -import InputLabel from '@material-ui/core/InputLabel'; -import InputAdornment from '@material-ui/core/InputAdornment'; -import FormControl from '@material-ui/core/FormControl'; -import Button from '@material-ui/core/Button'; -import { connect } from 'react-redux'; -import Snackbar from '@material-ui/core/Snackbar'; - -class LoginPage extends React.Component { - constructor(props) { - super(props); - this.state = { - message: '', - username: '', - password: '', - showPassword: false, - open: false - }; - } - componentDidUpdate() { - } - - handleClick = () => { - this.setState({ - open: true, - }); - }; - - handleRequestClose = () => { - this.setState({ - open: false, - }); - }; - componentWillMount() { - if(this.props.user.message.length > 0) { - this.setState({ - open : true - }); - } - - /* Resize listener register */ - window.addEventListener('resize', this.handleResize) - } - handleResize = (event) => { - this.setState({ - windowWidth: window.innerWidth - }); - } - componentWillUnmount() { - window.removeEventListener('resize', this.handleResize); - } - handleChange = prop => event => { - this.setState({ [prop]: event.target.value }); - }; - handleMouseDownPassword = event => { - event.preventDefault(); - }; - handleClickShowPassword = () => { - this.setState(state => ({ showPassword: !this.state.showPassword })); - }; - render() { - return ( -
- -
- - - Welcome to DPdash! - - - Please log in to continue. - - -
-
-
- -
- - - {this.state.showPassword ? : } - - - ) - }} - required={true} - margin="normal" - /> - -
- - Forgot your password? - -
- -
- - - Don't have an account? - -   - - Sign up - - -
-
-
- {this.state.windowWidth < 620 ? null : - - } -
- -
- ); - } -} -const mapStateToProps = (state) => ({ - user: state.user -}); - -export default connect(mapStateToProps)(LoginPage); diff --git a/views/Login.render.react.js b/views/Login.render.react.js deleted file mode 100755 index b6501106..00000000 --- a/views/Login.render.react.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import {render} from 'react-dom'; -import { Provider } from 'react-redux'; - -import LoginPage from './Login.react'; -import store from '../stores/store'; - -const reduxStore = store(); - -render(, document.getElementById('main')); diff --git a/views/Login.template.js b/views/Login.template.js deleted file mode 100755 index dbcbb79f..00000000 --- a/views/Login.template.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = (message) => { - var userState = { - "message" : message, - }; - return ` - - - - - DPdash - - - - -
- - - - `; -}; diff --git a/views/Main.react.js b/views/Main.react.js deleted file mode 100755 index ade72a07..00000000 --- a/views/Main.react.js +++ /dev/null @@ -1,875 +0,0 @@ -import React, {Component} from 'react'; -import {compose} from 'redux'; -import {connect} from 'react-redux'; -import io from 'socket.io-client'; -import 'whatwg-fetch'; -import Select from 'react-select'; -import classNames from 'classnames'; -import _ from "lodash"; -import { Column, Table } from 'react-virtualized'; -import moment from 'moment'; -import update from 'immutability-helper'; - -import DrawerComponent from './Drawer.react'; - -import { withStyles } from '@material-ui/core/styles'; -import Drawer from '@material-ui/core/Drawer'; -import AppBar from '@material-ui/core/AppBar'; -import Divider from '@material-ui/core/Divider'; -import Toolbar from '@material-ui/core/Toolbar'; -import Typography from '@material-ui/core/Typography'; -import IconButton from '@material-ui/core/IconButton'; -import Hidden from '@material-ui/core/Hidden'; -import TextField from '@material-ui/core/TextField'; -import NoSsr from '@material-ui/core/NoSsr'; -import { emphasize } from '@material-ui/core/styles/colorManipulator'; -import Paper from '@material-ui/core/Paper'; -import MenuItem from '@material-ui/core/MenuItem'; -import Chip from '@material-ui/core/Chip'; -import Avatar from '@material-ui/core/Avatar'; -import Checkbox from '@material-ui/core/Checkbox'; -import Tooltip from '@material-ui/core/Tooltip'; - -import StarBorder from '@material-ui/icons/StarBorder'; -import Star from '@material-ui/icons/Star'; -import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; -import CheckBoxIcon from '@material-ui/icons/CheckBox'; -import Person from '@material-ui/icons/Person'; -import ColorLens from '@material-ui/icons/ColorLens'; -import ExitToApp from '@material-ui/icons/ExitToApp'; -import Settings from '@material-ui/icons/Settings'; -import SearchIcon from '@material-ui/icons/Search'; -import MenuIcon from '@material-ui/icons/Menu'; - -const socketAddress = 'https://' + window.location.hostname + '/'; -const socket = io(socketAddress, { - timeout: 1500 -}); - -const sortMenu = [ - {sort: 'days', order: 'asc', text: 'Days (Asc)'}, - {sort: 'days', order: 'desc', text: 'Days (Desc)'}, - {sort: 'synced', order: 'asc', text: 'Updated (Asc)'}, - {sort: 'synced', order: 'desc', text: 'Updated (Desc)'}, - {sort: 'subject', order: 'asc', text: 'Subject ID (Asc)'}, - {sort: 'subject', order: 'desc', text: 'Subject ID (Desc)'} -]; - -const drawerWidth = 200; -const styles = theme => ({ - root: { - flexGrow: 1, - height: '100vh', - zIndex: 1, - overflow: 'hidden', - position: 'relative', - display: 'flex', - width: '100%', - }, - appBar: { - position: 'absolute', - marginLeft: drawerWidth, - [theme.breakpoints.up('md')]: { - width: `calc(100% - ${drawerWidth}px)`, - }, - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - backgroundColor: 'white', - color: 'rgba(0, 0, 0, 0.54)' - }, - navIconHide: { - [theme.breakpoints.up('md')]: { - display: 'none', - }, - }, - drawerPaper: { - width: drawerWidth, - [theme.breakpoints.up('md')]: { - position: 'relative', - }, - borderRight: '0px' - }, - content: { - padding: 0, - borderLeft: '1px solid rgba(0, 0, 0, 0.12)', - flexGrow: 1, - backgroundColor: '#fefefe', - padding: theme.spacing.unit * 3, - }, - input: { - display: 'flex', - padding: 0, - }, - valueContainer: { - display: 'flex', - flexWrap: 'wrap', - flex: 1, - alignItems: 'center', - }, - chip: { - margin: `${theme.spacing.unit / 2}px ${theme.spacing.unit / 4}px`, - }, - chipFocused: { - backgroundColor: emphasize( - theme.palette.type === 'light' ? theme.palette.grey[300] : theme.palette.grey[700], - 0.08, - ), - }, - noOptionsMessage: { - padding: `${theme.spacing.unit}px ${theme.spacing.unit * 2}px`, - }, - singleValue: { - fontSize: 16, - }, - placeholder: { - position: 'absolute', - left: 2, - fontSize: 16, - }, - paper: { - marginTop: theme.spacing.unit, - position: 'absolute', - width: '100%' - }, -}); - -function NoOptionsMessage(props) { - return ( - - {props.children} - - ); -} -function inputComponent({ inputRef, ...props }) { - return
; -} -function Control(props) { - return ( - - ); -} -function Option(props) { - var index = props.children.indexOf(' '); - return ( - - - {props.children.substr(0, index)} - -   - - {props.children.substr(index)} - - - ); -} -function Placeholder(props) { - return ( - - {props.children} - - ); -} -function SingleValue(props) { - return ( - - {props.children} - - ); -} -function ValueContainer(props) { - return
{props.children}
; -} -function MultiValue(props) { - var index = props.children.indexOf(' '); - return ( - { - props.removeProps.onClick(); - props.removeProps.onMouseDown(event); - }} - /> - ); -} -function Menu(props) { - return ( - - {props.children} - - ); -} -function DropdownIndicator(props) { - return ( - - ); -} -const indicatorSeparatorStyle = { - display: 'none' -}; - -const IndicatorSeparator = ({ innerProps }) => { - return ( - - ); -}; - -var autocomplete = []; -var default_acl = []; - -class MainPage extends Component { - constructor(props) { - super(props); - this.state = { - acl: [], - default_acl : [], - mobileOpen: false, - icon: '', - totalSubjects: 0, - totalStudies: 0, - totalDays: 0, - search: [], - search_array: [], - width: 0, - height: 0, - marginHeight: 72, - marginWidth: 24, - sortBy: '', - sortDirection: 'ASC', - preferences: {}, - star: {}, - complete: {} - }; - } - componentDidUpdate() { - } - componentDidMount() { - this.setState({ - width: window.innerWidth - this.state.marginWidth, - height: window.innerHeight - this.state.marginHeight, - avatar : this.getAvatar() - }); - window.addEventListener('resize', this.handleResize) - } - fetchUserPreferences = (uid) => { - let star = this.state.star; - let complete = this.state.complete; - return fetch('/api/v1/users/' + uid + '/preferences', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - if (response) { - star = 'star' in response ? response['star'] : star; - complete = 'complete' in response ? response['complete'] : complete; - } - this.setState({ - star: star, - complete: complete, - preferences: response - }); - return; - }); - } - handleComplete =(e, checked, cellData) => { - var study = cellData['rowData']['study']; - var subject = cellData['rowData']['subject']; - if (checked == true) { - this.complete(study, subject); - } else { - this.incomplete(study, subject); - } - } - handleStar =(e, checked, cellData) => { - var study = cellData['rowData']['study']; - var subject = cellData['rowData']['subject']; - if (checked == true) { - this.favorite(study, subject); - } else { - this.unfavorite(study, subject); - } - } - favorite = (study, subject) => { - const newState = this.state.star; - if (study in newState) { - let subjectIndex = newState[study].indexOf(subject); - if(subjectIndex == -1) { - let updated = update(this.state.star, { - [study]: { - $push: [subject] - } - }); - this.setState({star: updated}); - this.updateUserStars(updated); - this.starAcl(this.state.default_acl, updated); - } else { - //already favorited - } - } else { - let updated = update(this.state.star, { - [study]: { - $set: [subject] - } - }); - this.updateUserStars(updated); - this.setState({ - star: updated, - }); - this.starAcl(this.state.default_acl, updated); - } - } - unfavorite = (study, subject) => { - const newState = this.state.star; - if (study in newState) { - let subjectIndex = newState[study].indexOf(subject); - if(subjectIndex > -1) { - let updated = update(this.state.star, { - [study]: { - $splice: [[subjectIndex, 1]] - } - }); - this.updateUserStars(updated); - this.setState({ - star: updated, - }); - this.starAcl(this.state.default_acl, updated); - } - } - } - complete = (study, subject) => { - const newState = this.state.complete; - if (study in newState) { - let subjectIndex = newState[study].indexOf(subject); - if(subjectIndex == -1) { - let updated = update(this.state.complete, { - [study]: { - $push: [subject] - } - }); - this.setState({complete: updated}); - this.updateUserComplete(updated); - } else { - //already favorited - } - } else { - let updated = update(this.state.complete, { - [study]: { - $set: [subject] - } - }); - this.updateUserComplete(updated); - this.setState({ - complete: updated, - }); - } - } - incomplete = (study, subject) => { - const newState = this.state.complete; - if (study in newState) { - let subjectIndex = newState[study].indexOf(subject); - if(subjectIndex > -1) { - let updated = update(this.state.complete, { - [study]: { - $splice: [[subjectIndex, 1]] - } - }); - this.updateUserComplete(updated); - this.setState({ - complete: updated, - }); - } - } - } - starAcl = (default_acl, stars) => { - var starred_acl = []; - var unstarred_acl = []; - for(var i = 0; i < default_acl.length; i++) { - var study = default_acl[i]['study']; - var subject = default_acl[i]['subject']; - if(study in stars && stars[study].indexOf(subject) > -1) { - starred_acl.push(default_acl[i]); - } else { - unstarred_acl.push(default_acl[i]); - } - } - this.setState({ - acl: starred_acl.concat(unstarred_acl) - }); - } - checkComplete = (complete, cellData) => { - var study = (cellData['rowData']['study'] in this.state.complete); - if (study) { - var subject = this.state.complete[cellData['rowData']['study']].indexOf(cellData['rowData']['subject']); - if (subject > -1) { - return true; - } else { - return false; - } - } else { - return false; - } - } - checkStar = (star, cellData) => { - var study = (cellData['rowData']['study'] in this.state.star); - if (study) { - var subject = this.state.star[cellData['rowData']['study']].indexOf(cellData['rowData']['subject']); - if (subject > -1) { - return true; - } else { - return false; - } - } else { - return false; - } - } - updateUserStars = (star) => { - let uid = this.props.user.uid; - let preference = {}; - preference['star'] = star ? star : this.state.star; - preference['complete'] = this.state.complete; - preference['config'] = 'config' in this.state.preferences ? this.state.preferences['config'] : ''; - return fetch('/api/v1/users/' + uid + '/preferences', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - preferences: preference - }) - }).then((response) => { - return; - }); - } - updateUserComplete = (complete) => { - let uid = this.props.user.uid; - let preference = {}; - preference['star'] = this.state.star; - preference['complete'] = complete; - preference['config'] = 'config' in this.state.preferences ? this.state.preferences['config'] : ''; - return fetch('/api/v1/users/' + uid + '/preferences', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - body: JSON.stringify({ - preferences: preference - }) - }).then((response) => { - return; - }); - } - handleResize = (event) => { - this.setState({ - width: window.innerWidth - this.state.marginWidth, - height: window.innerHeight - this.state.marginHeight - }) - } - componentWillMount() { - this.fetchSubjects(); - this.fetchUserPreferences(this.props.user.uid); - } - sort = ({sortBy, sortDirection}) => { - const sortedList = this.sortList({sortBy, sortDirection}) - this.setState({ - sortBy: sortBy, - sortDirection: sortDirection, - }) - this.starAcl(sortedList, this.state.star) - } - sortList = ({sortBy, sortDirection}) => { - let list = _.map(this.state.acl, _.clone) - return _.orderBy(list, [sortBy], sortDirection.toLowerCase()) - } - rowClassName = ({index}) => { - if (index < 0) { - return 'headerRow' - } else { - return index % 2 === 0 ? 'evenRow' : 'oddRow' - } - } - getAvatar = () => { - var icon = this.props.user.icon; - var username = this.props.user.name; - var uid = this.props.user.uid; - if(icon == '' || icon == undefined) { - if(username == '' || username == undefined) { - if(uid && uid.length > 0) { - return {uid[0]} - } else { - return - } - } else { - return {username[0]} - } - } else { - return - } - } - handleDrawerToggle = () => { - this.setState(state => ({ mobileOpen: !state.mobileOpen })); - }; - fetchSubjects = () => { - return window.fetch('/api/v1/studies', { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin' - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - let studies = response ? response : []; - window.fetch('/api/v1/subjects?q=' + JSON.stringify(studies), { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - }, - credentials: 'same-origin', - }).then((response) => { - if (response.status !== 200) { - return - } - return response.json() - }).then((response) => { - this.autocomplete(this.aggregateSubjects(response), response) - }); - }); - } - handleSearch = value => { - this.setState({ - search : value, - search_array: value.map(option=> option.value) - }); - }; - handleChange = name => value => { - this.setState({ - [name]: value, - acl : _.map(default_acl, _.clone).filter((row) => { - var key = row.study + row.subject; - var filter = value.map(f => f.value); - if(filter.length > 0 && filter.indexOf(key) === -1) { - return false; - } else { - return true; - } - }) - }); - }; - componentWillUnmount() { - window.removeEventListener('resize', this.handleResize); - } - aggregateSubjects =(acl)=> { - var options = []; - for(var study = 0; study < acl.length; study++) { - Array.prototype.push.apply(options, acl[study].subjects); - } - return this.processDates(options) - } - processDates = (options) => { - const momentSetting = { - sameDay: '[Today]', - nextDay: '[Tomorrow]', - nextWeek: 'dddd', - lastDay: '[Yesterday]', - lastWeek: '[Last] dddd', - sameElse: 'MM/DD/YYYY'}; - const nowT = moment().local(); - for(var i = 0; i < options.length; i++) { - var row = options[i]; - var syncedT = moment.utc(row.synced).local(); - var syncedL = moment(syncedT.format('YYYY-MM-DD')) - .calendar(null,momentSetting); - var days = nowT.diff(syncedT, 'days'); - var color = days > 14 ? '#de1d16' : '#14c774'; - options[i]['synced'] = syncedL; - options[i]['lastSyncedColor'] = color; - } - return options; - } - autocomplete = (options, acl) => { - autocomplete = options.map(option => ({ - value: option.study + option.subject, - label: option.subject + ' in ' + option.study - })); - default_acl = options; - this.starAcl(options, this.state.star) - this.setState({ - totalStudies: acl.length, - totalSubjects: options.length, - totalDays: Math.max.apply(Math, options.map(function(o) { return o.days; })), - default_acl: options - }); - } - getStudyCell = (data) => { - return {data.study} - }; - getSubjectCell = (data) => { - return {data.subject} - } - getSyncedCell = (data, type) => { - var complete = this.state.complete; - if(data.study in complete && complete[data.study].indexOf(data.subject)> -1) { - return {data.synced} - } else { - return {data.synced} - } - }; - render() { - const { classes, theme } = this.props; - const components = { Option, Control, - NoOptionsMessage, Placeholder, - SingleValue, MultiValue, IndicatorSeparator, - ValueContainer, Menu, DropdownIndicator }; - const selectStyles = { - input: base => ({ - ...base, - color: theme.palette.text.primary, - }), - }; - const momentSetting = { - sameDay: '[Today]', - nextDay: '[Tomorrow]', - nextWeek: 'dddd', - lastDay: '[Yesterday]', - lastWeek: '[Last] dddd', - sameElse: 'MM/DD/YYYY'}; - const nowT = moment().local(); - return ( -
- - - - - -
- - field.onChange(e.target.value)} + /> + ))} +
+ + )} + /> + +
+ ) +} + +export default ColorPicker diff --git a/views/components/ConfigurationCategoryCard/index.jsx b/views/components/ConfigurationCategoryCard/index.jsx new file mode 100644 index 00000000..ce72c336 --- /dev/null +++ b/views/components/ConfigurationCategoryCard/index.jsx @@ -0,0 +1,27 @@ +import React from 'react' + +import { Delete, ContentCopy } from '@mui/icons-material' +import { Card, CardActions, CardContent, IconButton } from '@mui/material' + +const ConfigurationCategoryCard = ({ + children, + formIndex, + onCopy, + onRemove, +}) => { + return ( + + {children} + + onRemove(formIndex)}> + + + onCopy(formIndex)}> + + + + + ) +} + +export default ConfigurationCategoryCard diff --git a/views/components/Graph/Graph.test.jsx b/views/components/Graph/Graph.test.jsx new file mode 100644 index 00000000..9ee471d5 --- /dev/null +++ b/views/components/Graph/Graph.test.jsx @@ -0,0 +1,56 @@ +import { render, screen, waitFor } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import { Graph } from '.' +import { createGraphDataResponse, createUser } from '../../../test/fixtures' +import api from '../../api' + +const mockGraphDataResponse = createGraphDataResponse({ + subject: { + sid: 'subject', + project: 'study', + }, +}) +describe('Graph', () => { + const user = createUser({ preferences: { config: 'config' } }) + + it('calls the graph data API endpoint for the given participant', async () => { + const mockApi = jest.spyOn(api.dashboard, 'load') + mockApi.mockResolvedValue(mockGraphDataResponse) + + render( + + + + ) + await waitFor(() => { + expect(api.dashboard.load).toHaveBeenCalledWith('study', 'subject') + }) + }) + it('renders the graph', async () => { + const mockApi = jest.spyOn(api.dashboard, 'load') + mockApi.mockResolvedValue(mockGraphDataResponse) + + render( + + + + ) + const graphElement = await screen.findByTestId('graph') + await waitFor(() => { + expect(graphElement.firstChild).toBeInTheDocument() + }) + }) +}) diff --git a/views/components/Graph/index.jsx b/views/components/Graph/index.jsx new file mode 100644 index 00000000..132488c7 --- /dev/null +++ b/views/components/Graph/index.jsx @@ -0,0 +1,213 @@ +import React, { createRef, useRef, useState } from 'react' + +import { Save, Functions } from '@mui/icons-material' +import { + Box, + Button, + DialogActions, + DialogContent, + Dialog, + Typography, +} from '@mui/material' +import FileSaver from 'file-saver' +import { Link } from 'react-router-dom' + +import { fontSize } from '../../../constants' +import api from '../../api' +import { routes } from '../../routes/routes' +import GraphPageTable from '../GraphPageTable' +import Matrix from '../Matrix.d3' + +const cardSize = 20 + +export const Graph = ({ study, subject, user, theme, setNotification }) => { + const [shoulDrawPng, setShouldDrawPng] = useState(false) + const canvasRef = useRef() + const graphRef = createRef() + const [openStat, setOpenStat] = React.useState(false) + const [graph, setGraph] = React.useState({ + configurations: [], + consentDate: '', + matrixData: [], + }) + const [dayData, setDayData] = React.useState({ + startFromTheLastDay: false, + startDay: 1, + lastDay: null, + maxDay: 1, + }) + + const fetchGraph = async () => await api.dashboard.load(study, subject) + const downloadPng = () => + canvasRef.current.toBlob((blob) => { + FileSaver.saveAs(blob, `${subject}.png`) + }) + + const closeStat = () => setOpenStat(false) + const updateMaxDay = (graph) => { + const daysParticipated = graph.matrixData + .flatMap(({ data }) => data) + .map(({ day }) => day) + const calculateMaxDay = Math.max(...daysParticipated) + + setDayData({ ...dayData, maxDay: calculateMaxDay || 1 }) + } + + const onMount = async () => { + try { + const graphData = await fetchGraph() + + setGraph(graphData.graph) + updateMaxDay(graphData.graph) + + if (!HTMLCanvasElement.prototype.toBlob) { + Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', { + value(callback, type, quality) { + const binStr = atob( + HTMLCanvasElement.prototype + .toDataURL(type, quality) + .split(',')[1] + ), + len = binStr.length, + arr = new Uint8Array(len) + + for (let i = 0; i < len; i++) { + arr[i] = binStr.charCodeAt(i) + } + callback(new Blob([arr], { type: type || 'image/png' })) + }, + }) + } + } catch (e) { + setNotification({ open: true, message: e.message }) + } + } + const renderMatrix = (graph) => { + if (graphRef.current && graphRef.current.firstChild) { + graphRef.current.removeChild(graphRef.current.firstChild) + } + if ( + !graph || + !graph.matrixData || + Object.keys(graph.matrixData).length === 0 + ) { + return + } + const matrixProps = { + id: 'matrix', + type: 'matrix', + data: graph.matrixData, + cardSize, + study, + subject, + consentDate: graph.consentDate, + configuration: graph.configurations, + startFromTheLastDay: dayData.startFromTheLastDay, + startDay: dayData.startDay, + lastDay: dayData.lastDay, + maxDay: dayData.maxDay, + user: user.uid, + } + + graphRef.current = new Matrix(graphRef.current, matrixProps) + graphRef.current.create(graph.matrixData) + + setShouldDrawPng(true) + } + + React.useEffect(() => { + onMount() + }, [user.preferences.config]) + + React.useEffect(() => { + if (shoulDrawPng) { + const updatedSvgElement = graphRef.current.lastChild + + const svgString = new XMLSerializer().serializeToString(updatedSvgElement) + + const kanvas = canvasRef.current + kanvas.width = updatedSvgElement.getBBox().width + kanvas.height = updatedSvgElement.getBBox().height + + const svgUrl = + 'data:image/svg+xml; charset=utf8, ' + + encodeURIComponent( + svgString.replace( + '', + `` + ) + ) + + // png conversion + const img = new Image(kanvas.width, kanvas.height) + const ctx = kanvas.getContext('2d') + img.src = svgUrl + + img.onload = () => { + ctx.drawImage(img, 0, 0) + } + + setShouldDrawPng(false) + } + }, [shoulDrawPng]) + + React.useEffect(() => { + renderMatrix(graph) + }, [graph.matrixData]) + + return ( + + + {subject} + + +
+
+
+
+ +
+ + + + + + + + + + + ) +} diff --git a/views/components/GraphPageTable/GraphPageTableCell.jsx b/views/components/GraphPageTable/GraphPageTableCell.jsx new file mode 100644 index 00000000..b5d9da59 --- /dev/null +++ b/views/components/GraphPageTable/GraphPageTableCell.jsx @@ -0,0 +1,13 @@ +import * as React from 'react' + +import TableCell from '@mui/material/TableCell' + +const GraphPageTableCell = (props) => { + return ( + + {props.children} + + ) +} + +export default GraphPageTableCell diff --git a/views/components/GraphPageTable/index.jsx b/views/components/GraphPageTable/index.jsx new file mode 100644 index 00000000..558bb9e1 --- /dev/null +++ b/views/components/GraphPageTable/index.jsx @@ -0,0 +1,69 @@ +import * as React from 'react' + +import Table from '@mui/material/Table' +import TableBody from '@mui/material/TableBody' +import TableHead from '@mui/material/TableHead' +import TableRow from '@mui/material/TableRow' + +import GraphPageTableCell from './GraphPageTableCell' + +const GraphPageTable = (props) => { + return ( + + + + Label + Min + Max + Mean + Missing % + + + + {props.matrixData.map((data, idx) => { + const validData = data.data.filter( + (assessmentData) => + typeof assessmentData[data.variable] === 'number' + ) + const missingDataPercentage = + 100 - (validData.length * 100) / props.maxDay + const dataStat = data.stat[0] + + return ( + + + {data.label} + + + {!isNaN(parseFloat(dataStat?.min)) && isFinite(dataStat.min) + ? dataStat.min.toFixed(2) + : 'N/A'} + + + {!isNaN(parseFloat(dataStat?.max)) && isFinite(dataStat.max) + ? dataStat.max.toFixed(2) + : 'N/A'} + + + {!isNaN(parseFloat(dataStat?.mean)) && isFinite(dataStat.mean) + ? dataStat.mean.toFixed(2) + : 'N/A'} + + + {`${missingDataPercentage.toFixed(2)} (${validData.length}/${ + props.maxDay + })`} + + + ) + })} + +
+ ) +} + +export default GraphPageTable diff --git a/views/components/GraphTable/GraphTable.css b/views/components/GraphTable/GraphTable.css new file mode 100644 index 00000000..ed21dc7c --- /dev/null +++ b/views/components/GraphTable/GraphTable.css @@ -0,0 +1,5 @@ +.GraphTable_Top { + padding: 25px; + display: flex; + justify-content: flex-end; +} diff --git a/views/components/GraphTable/index.jsx b/views/components/GraphTable/index.jsx new file mode 100644 index 00000000..1b9ba3b6 --- /dev/null +++ b/views/components/GraphTable/index.jsx @@ -0,0 +1,67 @@ +import React from 'react' + +import { SaveAlt } from '@mui/icons-material' +import { Paper, Button } from '@mui/material' + +import { SORT_DIRECTION } from '../../../constants' +import Table from '../../tables/Table' + +import './GraphTable.css' + +const GraphTable = ({ + graph, + onGetCsv, + page, + rowsPerPage, + handleChangePage, + handleChangeRowsPerPage, + onSort, + rowCount, + tableColumns, + tableRows, + sortBy, + sortDirection, +}) => { + if (!graph) return null + + const cellRenderer = (site, property) => site[property] + + const handleRequestSort = (_event, property) => { + const isAsc = sortDirection === SORT_DIRECTION.ASC + + return onSort(property, isAsc ? SORT_DIRECTION.DESC : SORT_DIRECTION.ASC) + } + + return ( + +
+ +
+ + + ) +} + +export default GraphTable diff --git a/views/components/HeroCard/HeroCard.css b/views/components/HeroCard/HeroCard.css new file mode 100644 index 00000000..0bb2d13b --- /dev/null +++ b/views/components/HeroCard/HeroCard.css @@ -0,0 +1,22 @@ +.HeroCard_container { + box-shadow: 0 0 0 0; + width: 350px; +} +.HeroCard_button { + text-transform: none; + border-radius: 8px; +} +.HeroCard_image { + height: 80px; +} + +@media screen and (min-width: 900px) { + .HeroCard_container { + width: 565px; + /* flex-grow: 1; */ + } + .HeroCard_image { + height: 106px; + width: 476px; + } +} diff --git a/views/components/HeroCard/HeroCard.test.jsx b/views/components/HeroCard/HeroCard.test.jsx new file mode 100644 index 00000000..10c01741 --- /dev/null +++ b/views/components/HeroCard/HeroCard.test.jsx @@ -0,0 +1,44 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import Hero from '.' + +describe('Hero Component', () => { + beforeEach(() => { + render( + + + + ) + }) + + test('renders Hero image', () => { + const image = screen.getByRole('img') + + expect(image).toBeInTheDocument() + }) + + test('renders Hero content', () => { + const heroCopyContent = + 'DPDash is a Deep/Digital Phenotyping Dashboard designed to manage and visualize multiple data streams coming in continuously over extended periods of time in individuals.' + const content = screen.getByText(heroCopyContent) + + expect(content).toBeInTheDocument() + }) + + test('renders Hero Learn More button', () => { + const learnMoreButton = screen.getByText('Learn More') + + expect(learnMoreButton).toBeDefined() + }) + test('Learn More button has href attribuates', () => { + const learnMoreButton = screen.getByText('Learn More') + + expect(learnMoreButton).toHaveAttribute( + 'href', + 'https://sites.google.com/g.harvard.edu/dpdash/' + ) + }) +}) diff --git a/views/components/HeroCard/index.jsx b/views/components/HeroCard/index.jsx new file mode 100644 index 00000000..07bfac22 --- /dev/null +++ b/views/components/HeroCard/index.jsx @@ -0,0 +1,42 @@ +import React from 'react' + +import { ArrowForwardOutlined } from '@mui/icons-material' +import { + Button, + Card, + CardMedia, + CardContent, + CardActions, + Typography, +} from '@mui/material' +import './HeroCard.css' + +const HeroCard = () => { + return ( + + + + + DPDash is a Deep/Digital Phenotyping Dashboard designed to manage and + visualize multiple data streams coming in continuously over extended + periods of time in individuals. + + + + + + + ) +} + +export default HeroCard diff --git a/views/components/HeroFooter/HeroFooter.css b/views/components/HeroFooter/HeroFooter.css new file mode 100644 index 00000000..a7975ae8 --- /dev/null +++ b/views/components/HeroFooter/HeroFooter.css @@ -0,0 +1,40 @@ +.HeroFooter_container { + bottom: 0; + display: flex; + gap: 60px; + left: 0; + padding: 24px 72px; + right: 0; +} + +.HeroFooter_linksContainer { + display: flex; + gap: 40px; +} + +@media screen and (max-width: 500px) { + .HeroFooter_container { + flex-direction: column-reverse; + gap: 20px; + padding: 20px; + } + .HeroFooter_linksContainer { + gap: 20px; + flex-direction: column; + } +} + +@media screen and (min-width: 700px) { + .HeroFooter_container { + position: fixed; + } + .HeroFooter_linksContainer { + gap: 24px; + } +} + +@media screen and (min-width: 1000px) { + .HeroFooter_linksContainer { + gap: 80px; + } +} diff --git a/views/components/HeroFooter/HeroFooter.test.jsx b/views/components/HeroFooter/HeroFooter.test.jsx new file mode 100644 index 00000000..f7c1bbd0 --- /dev/null +++ b/views/components/HeroFooter/HeroFooter.test.jsx @@ -0,0 +1,43 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import HeroFooter from '.' + +describe('Hero Component', () => { + beforeEach(() => { + render( + + + + ) + }) + + test('renders copyright notice', () => { + const currentYear = new Date().getFullYear() + const copyright = screen.getByText( + `©${currentYear} Mass General Hospital. All rights reserved.` + ) + + expect(copyright).toBeInTheDocument() + }) + + test('renders contact us link', () => { + const contactUsLink = screen.getByText('Contact Us') + + expect(contactUsLink).toBeInTheDocument() + }) + + test('renders contact us link', () => { + const privacyPolicyLink = screen.getByText('Privacy Policy') + + expect(privacyPolicyLink).toBeInTheDocument() + }) + + test('renders contact us link', () => { + const termsOfUseLink = screen.getByText('Terms of Use') + + expect(termsOfUseLink).toBeInTheDocument() + }) +}) diff --git a/views/components/HeroFooter/HeroFooterLink.jsx b/views/components/HeroFooter/HeroFooterLink.jsx new file mode 100644 index 00000000..263e0d40 --- /dev/null +++ b/views/components/HeroFooter/HeroFooterLink.jsx @@ -0,0 +1,20 @@ +import React from 'react' + +import { Typography } from '@mui/material' +import { Link } from 'react-router-dom' + +import { fontSize } from '../../../constants' + +const HeroFooterLink = ({ to, label }) => { + return ( + + {label} + + ) +} + +export default HeroFooterLink diff --git a/views/components/HeroFooter/index.jsx b/views/components/HeroFooter/index.jsx new file mode 100644 index 00000000..88af35ab --- /dev/null +++ b/views/components/HeroFooter/index.jsx @@ -0,0 +1,37 @@ +import React from 'react' + +import { Box, Typography } from '@mui/material' + +import HeroFooterLink from './HeroFooterLink' +import { fontSize } from '../../../constants' +import { routes } from '../../routes/routes' + +import './HeroFooter.css' + +const HeroFooter = () => { + const currentYear = new Date().getFullYear() + + return ( + + + ©{currentYear} Mass General Hospital. All rights reserved. + +
+ + + +
+
+ ) +} + +export default HeroFooter diff --git a/views/components/Matrix.d3.js b/views/components/Matrix.d3.js new file mode 100644 index 00000000..ad49caea --- /dev/null +++ b/views/components/Matrix.d3.js @@ -0,0 +1,408 @@ +import * as d3 from 'd3' + +import { stringToDate } from '../../server/utils/dateConverter' +import { getColor } from '../../server/utils/invertColor' + +const margin = { + top: 30, + bottom: 20, + left: 10, + right: 30, +} + +const cellWidth = 65 +const DARK_GREY = '#545454' +const GREY = '#e6e6e6' +const NONE = 'none' +const WHITE = '#ffffff' + +export default class Matrix { + constructor(el, props) { + this.el = el + this.cardSize = props.cardSize + this.halfCardSize = props.cardSize / 2 + this.startDay = props.startDay + this.lastDay = props.lastDay + this.maxDay = props.maxDay + this.study = props.study + this.subject = props.subject + this.consentDate = props.consentDate + this.startFromTheLastDay = props.startFromTheLastDay + } + + cleanData = (data) => { + if (data.length > 0) { + return data + } + + const newData = [] + for (let day = this.startDay; day <= this.lastDayForFilter; day++) { + newData.push({ day }) + } + + return newData + } + + get lastDayForFilter() { + return this.lastDay === null || this.lastDay === '' + ? this.maxDay + : this.lastDay + } + + validDay = (d) => d.day >= this.startDay && d.day <= this.lastDayForFilter + create = (data) => { + this.data = data + const calculatedHeight = + data.length * this.cardSize + margin.top + margin.bottom + + const svgElement = d3 + .select(this.el) + .append('svg') + .attr('width', () => '100%') + .attr('height', () => calculatedHeight) + this.svg = svgElement.append('g') + this.cards = this.svg + .append('g') + .attr('class', 'Cards') + .attr('transform', 'translate(0,0)') + + let category = null + const yIndices = [] + + for (let idx = 0; idx < data.length; idx++) { + const dataEl = data[idx] + + if (category !== dataEl.category) { + category = dataEl.category + yIndices.push(idx) + } + + //d3.thresholdScale takes in range as (firstIndex, lastIndex]. This is a way around to ensure we get [firstIndex, lastIndex] + const colors = dataEl.color.slice() + colors.unshift(dataEl.color[0]) + const range = + dataEl.range.length === 2 + ? d3.range( + dataEl.range[0], + dataEl.range[1], + (dataEl.range[1] - dataEl.range[0]) / 8 + ) + : dataEl.range + const thresholdScale = d3.scaleThreshold().domain(range).range(colors) + + if (Object.hasOwn(dataEl, 'data')) { + const dataVariable = dataEl.variable + + //append rectangles filled with colors <3 + const card = this.cards + .selectAll('.cell') + .data(this.cleanData(dataEl.data), (d) => `${dataEl.label}:${d.day}`) + card + .enter() + .append('rect') + .filter(this.validDay) + .attr('x', (d) => (d.day - this.startDay) * cellWidth) + .attr('y', () => idx * this.cardSize) + .attr('class', 'Card hour') + .attr('width', cellWidth) + .attr('height', this.cardSize) + .style('fill', (d) => + d[dataVariable] !== '' && d[dataVariable] !== undefined + ? thresholdScale(d[dataVariable]) + : WHITE + ) + .style('stroke', (d) => (d[dataVariable] === undefined ? NONE : GREY)) + .style('stroke-width', '2px') + .on('click', (d) => { + const val = d[dataVariable] || 'Not Available' + const msg = `The value for ${dataEl.label} on day ${d.day} is: ${val}` + + alert(msg) + }) + .append('svg:title') + .filter(this.validDay) + .text((d) => d[dataVariable]) + + if (dataEl?.text === true) { + card + .enter() + .append('text') + .filter(this.validDay) + .text((d) => d[dataVariable]) + .attr( + 'x', + (d) => (d.day - this.startDay) * cellWidth + cellWidth / 2 + ) + .attr('y', () => idx * this.cardSize + (this.cardSize * 3) / 4) + .attr('font-size', this.halfCardSize) + .style('fill', (d) => { + const blockColor = d[dataVariable] + ? thresholdScale(d[dataVariable]) + : WHITE + + return getColor(blockColor, true) + }) + .attr('font-family', 'Tahoma, Geneva, sans-serif') + .style('text-anchor', 'middle') + } + } + } + this.maxYAxisWidth = margin.left + this.matrixHeight = margin.top //temp placeholder + this.matrixWidth = this.svg + .select('.Cards') + .node() + .getBoundingClientRect().width + + const leftMarginWhiteOut = this.generateMarginWhiteOutLeft() + //an array of labels for the variables + const yAxisRange = [] + const yAxisValues = [] + for (let idx = 0; idx < data.length; idx++) { + yAxisRange.push((idx + 1) * this.cardSize - this.halfCardSize) + yAxisValues.push(idx) + } + this.yScaleLinear = d3 + .scaleLinear() + .range([this.halfCardSize, yAxisRange[yAxisRange.length - 1]]) + .domain([0, data.length - 1]) + this.yAxisLinear = d3 + .axisLeft(this.yScaleLinear) + .ticks(data.length - 1) + .tickValues(yAxisValues) + .tickSize(0) + + this.yAxisLeft = this.svg + .append('g') + .attr('class', 'yAxisLinear') + .call(this.yAxisLinear) + this.adjustYAxisLeft() + this.maxYAxisWidth = this.svg.select('.yAxisLinear').node().getBBox().width + this.matrixHeight = + this.svg.select('.yAxisLinear').node().getBBox().height + this.cardSize + + if (this.initialHeight === -1) { + svgElement + .attr('width', () => Math.max(this.width, 0)) + .attr('height', this.matrixHeight + this.cardSize * 2) + } else if (this.initialHeight === 0 && this.width === 0) { + svgElement + .attr('width', () => Math.max(this.width, 0)) + .attr('height', this.matrixHeight + this.cardSize * 2) + + this.matrixHeight = this.matrixHeight + this.cardSize * 3 + } + + this.svg.attr( + 'transform', + `translate(${this.maxYAxisWidth + margin.left},${margin.top - 5})` + ) + leftMarginWhiteOut.attr( + 'transform', + `translate(-${this.maxYAxisWidth + margin.left},-${this.cardSize})` + ) + leftMarginWhiteOut + .select('rect') + .attr('width', this.maxYAxisWidth + margin.left) + .attr('height', this.matrixHeight + this.cardSize) + this.categoryMarker = this.generateCategoryMarker(yIndices) + this.generateMarginWhiteOutBottom() + this.generateMarginWhiteOutTop() + this.xAxisForDatesData = this.generateXAxisForDatesData() + this.generateXAxis() + this.generateWhiteSpaceTopLeft() + + if (this.startFromTheLastDay) { + this.update() + } + } + + adjustYAxisLeft = () => { + return this.yAxisLeft + .selectAll('text') + .data(this.data) + .text((d) => d.label) + .attr('font-size', this.halfCardSize) + .style('fill', DARK_GREY) + } + + filteredXAxisTop = () => { + return this.xAxisTop + .selectAll('text') + .data(this.xAxisForDatesData.filter(this.validDay)) + .text((d) => d.marker) + .attr('class', (d) => (d.marker === 'N/A' ? 'EmptyDates' : 'DatesText')) + } + + generateXAxisForDatesData = () => { + const xAxisForDatesData = [] + const startDate = this.consentDate + ? stringToDate(this.consentDate, 'yyyy-mm-dd', '-') + : null + const firstDay = this.startDay - 1 //Consent date is 1 + for (let i = firstDay; i < this.lastDayForFilter; i++) { + const day = i + 1 + + if (startDate && (startDate.getDay() === 0 || startDate.getDay() === 6)) { + xAxisForDatesData.push({ day, marker: 'S' }) + } else if (startDate && startDate.getDay() === 3) { + const month = startDate.getMonth() + 1 + const localeDate = `${month}/${startDate.getDate()}/${startDate.getFullYear()}` + + xAxisForDatesData.push({ + day, + marker: localeDate.substring(0, localeDate.length - 5), + }) + } else { + xAxisForDatesData.push({ day, marker: 'N/A' }) + } + if (startDate) { + startDate.setDate(startDate.getDate() + 1) + } + } + + return xAxisForDatesData + } + + generateCategoryMarker = (indices) => { + const { matrixWidth, matrixHeight, maxYAxisWidth } = this + const categoryMarker = this.svg + .append('g') + .attr('class', 'CategoryMarker') + .attr('transform', 'translate(-' + maxYAxisWidth + ',0)') + + for (let i = 0; i < indices.length; i++) { + const yPosition = i === 0 ? 1 : indices[i] * this.cardSize + + categoryMarker + .append('line') + .attr('x1', 0) + .attr('x2', matrixWidth + maxYAxisWidth) + .attr('y1', yPosition) + .attr('y2', yPosition) + .attr('stroke', DARK_GREY) + } + categoryMarker + .append('line') + .attr('x1', 0) + .attr('x2', matrixWidth + maxYAxisWidth) + .attr('y1', matrixHeight - this.halfCardSize) + .attr('y2', matrixHeight - this.halfCardSize) + .attr('stroke-width', 1.5) + .attr('stroke', DARK_GREY) + + return categoryMarker + } + + generateXAxis = () => { + const { xAxisForDatesData, startDay } = this + const xAxisRange = [] + const xAxisValuesTop = [] + const xAxisValuesBottom = [] + + for (let idx = 0; idx < xAxisForDatesData.length; idx++) { + xAxisRange.push((idx + 1) * cellWidth - cellWidth / 2) + xAxisValuesBottom.push(xAxisForDatesData[idx].day.toString()) + xAxisValuesTop.push(idx) + } + + this.xScaleLinearTop = d3 + .scaleLinear() + .range([cellWidth / 2, xAxisRange[xAxisRange.length - 1] || 0]) + .domain([0, xAxisForDatesData.length - 1]) + this.xScaleLinearBottom = d3 + .scaleLinear() + .range([cellWidth / 2, xAxisRange[xAxisRange.length - 1] || 0]) + .domain( + [startDay, xAxisForDatesData[xAxisForDatesData.length - 1]?.day] || 0 + ) + this.xAxisLinearTop = d3 + .axisTop(this.xScaleLinearTop) + .ticks(xAxisForDatesData.length - 1 || 1) + .tickValues(xAxisValuesTop) + + this.xAxisTop = this.svg + .append('g') + .attr('class', 'xAxisLinearTop') + .call(this.xAxisLinearTop) + + this.filteredXAxisTop() + .attr('font-size', this.halfCardSize) + .style('fill', (d) => (d.marker === 'N/A' ? WHITE : DARK_GREY)) + + this.xAxisTop.selectAll('path').attr('stroke-opacity', 0) + this.xAxisTop.selectAll('line').attr('stroke-opacity', 0) + } + + get widthBasedFill() { + return this.width === 0 ? NONE : WHITE + } + + generateMarginWhiteOutLeft = () => { + const { matrixHeight, maxYAxisWidth } = this + + return this.generateSpace({ + width: maxYAxisWidth + margin.left + this.cardSize, + height: matrixHeight + this.cardSize, + x: 0, + y: -this.halfCardSize + 2, + }) + } + + generateMarginWhiteOutTop = () => { + const { matrixWidth, maxYAxisWidth } = this + + return this.generateSpace({ + width: matrixWidth + maxYAxisWidth, + height: this.cardSize + this.halfCardSize, + x: -maxYAxisWidth, + y: -(this.cardSize + this.halfCardSize), + }) + } + + generateMarginWhiteOutBottom = () => { + const bottomYCoordinate = + this.height > 0 && this.height < this.matrixHeight + ? this.height - this.cardSize * 2 + 1 + : this.matrixHeight - this.halfCardSize + 1 + this.generateSpace({ + width: this.matrixWidth + this.maxYAxisWidth, + height: this.cardSize + 2, + x: -this.maxYAxisWidth, + y: 0, + }) + .attr('class', 'marginBottom') + .attr('transform', `translate(0,${bottomYCoordinate})`) + } + + generateWhiteSpaceTopLeft = () => { + const { maxYAxisWidth } = this + + this.generateSpace({ + width: maxYAxisWidth + margin.left, + height: this.cardSize, + x: -(maxYAxisWidth + margin.left), + y: -this.cardSize, + }) + } + + generateSpace = ({ width, height, x, y }) => { + const el = this.svg.append('g') + + el.append('rect') + .attr('width', width) + .attr('height', height) + .attr('x', x) + .attr('y', y) + .style('fill', this.widthBasedFill) + + return el + } + + update() { + d3.select(this.el) + .select('svg') + .style('width', this.width) + .style('height', this.height) + } +} diff --git a/views/components/Modal/index.jsx b/views/components/Modal/index.jsx new file mode 100644 index 00000000..589a2c71 --- /dev/null +++ b/views/components/Modal/index.jsx @@ -0,0 +1,18 @@ +import { Typography, DialogTitle, DialogContent, Dialog } from '@mui/material' + +const Modal = (props) => { + return ( + + + {props.title} + + {props.children} + + ) +} + +export default Modal diff --git a/views/components/PageHeader/PageHeader.css b/views/components/PageHeader/PageHeader.css new file mode 100644 index 00000000..1dbd9b13 --- /dev/null +++ b/views/components/PageHeader/PageHeader.css @@ -0,0 +1,46 @@ +.PageHeader { + display: grid; + grid-template-columns: repeat(5, 1fr); + column-gap: 20px; + padding-bottom: 20px; +} +.PageHeaderTitle { + font-weight: 600; + font-size: 16px; + grid-column-start: 1; + flex-grow: 0.1; + padding-top: 10px; +} +.PageHeaderCTA { + grid-column-start: 4; + grid-column-end: 6; + align-content: center; +} +.PageHeaderDescription { + grid-column-start: 1; + grid-column-end: 5; +} + +@media screen and (max-width: 1200px) { + .PageHeader { + display: grid; + grid-template-columns: repeat(1, 1fr); + column-gap: 20px; + padding-bottom: 20px; + } + .PageHeaderCTA { + grid-column-start: 1; + align-content: center; + } + .PageHeaderDescription { + grid-column-start: 1; + } +} + +@media screen and (min-width: 2000px) { + .PageHeaderCTA { + grid-column-start: 5; + grid-column-end: 6; + align-content: center; + } +} diff --git a/views/components/PageHeader/index.jsx b/views/components/PageHeader/index.jsx new file mode 100644 index 00000000..dc75bcf8 --- /dev/null +++ b/views/components/PageHeader/index.jsx @@ -0,0 +1,55 @@ +import React from 'react' + +import { ArrowBack } from '@mui/icons-material' +import { Box, Typography, IconButton } from '@mui/material' + +import './PageHeader.css' + +const PageHeader = (props) => { + return props.isDescription ? ( + + + + + + {props.title} + {props.cta && {props.cta}} +
{props.description}
+
+ ) : ( + + + {props.title} + + + + {props.form} + + + {props.cta && {props.cta}} + + ) +} + +export default PageHeader diff --git a/views/components/SearchSelect/MenuWithFooterActions.jsx b/views/components/SearchSelect/MenuWithFooterActions.jsx new file mode 100644 index 00000000..1c7e00b2 --- /dev/null +++ b/views/components/SearchSelect/MenuWithFooterActions.jsx @@ -0,0 +1,18 @@ +import React, { forwardRef } from 'react' + +import { Paper } from '@mui/material' + +const MenuWithFooterActions = forwardRef(function MenuWithFooterActions( + { children, actions, searchInput, ...other }, + ref +) { + return ( + + {searchInput} + {children} + {actions} + + ) +}) + +export default MenuWithFooterActions diff --git a/views/components/SearchSelect/SearchInput.css b/views/components/SearchSelect/SearchInput.css new file mode 100644 index 00000000..53abb4ba --- /dev/null +++ b/views/components/SearchSelect/SearchInput.css @@ -0,0 +1,9 @@ +.SearchInput { + padding: 10px; + position: sticky; + bottom: 0; + right: 0; + top: 0; + z-index: 100; + background-color: white; +} diff --git a/views/components/SearchSelect/SearchInput.jsx b/views/components/SearchSelect/SearchInput.jsx new file mode 100644 index 00000000..2abb405f --- /dev/null +++ b/views/components/SearchSelect/SearchInput.jsx @@ -0,0 +1,18 @@ +import React from 'react' + +import { TextField } from '@mui/material' +import './SearchInput.css' + +const SearchInput = ({ handleSearch }) => ( +
+ +
+) + +export default SearchInput diff --git a/views/components/SearchSelect/SearchSelect.test.jsx b/views/components/SearchSelect/SearchSelect.test.jsx new file mode 100644 index 00000000..bb716a71 --- /dev/null +++ b/views/components/SearchSelect/SearchSelect.test.jsx @@ -0,0 +1,88 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import SearchSelect from '.' + +jest.mock('react-hook-form', () => ({ + ...jest.requireActual('react-hook-form'), + useController: () => jest.fn().mockReturnValue({ field: {} }), + control: {}, +})) + +describe('Search Select', () => { + beforeEach(() => { + jest.resetAllMocks() + }) + + const defaultProps = { + control: {}, + options: [ + { label: 'AA', value: 'AA' }, + { label: 'BB', value: 'BB' }, + { label: 'CC', value: 'CC' }, + ], + actions: ( +
+ + +
+ ), + name: 'studies', + formValues: { studies: ['BB'] }, + label: 'search select', + } + const elements = { + searchSelect: () => + screen.getByRole('combobox', { label: 'search select' }), + } + const renderElement = (props) => render() + + it('renders a dropdown menu with input and actions', async () => { + renderElement(defaultProps) + + const searchSelect = elements.searchSelect() + + await userEvent.click(searchSelect) + + const searchSelectInput = await screen.findByLabelText('Find category') + const optionsPopupEl = await screen.findByRole('listbox') + const leftActionButton = await screen.findByText('Left') + const rightActionButton = await screen.findByText('Right') + + expect(optionsPopupEl.childElementCount).toEqual(3) + expect(searchSelectInput).toBeInTheDocument() + expect(leftActionButton).toBeInTheDocument() + expect(rightActionButton).toBeInTheDocument() + }) + + it('filters the list of options based on search', async () => { + renderElement(defaultProps) + + const searchSelect = elements.searchSelect() + + await userEvent.click(searchSelect) + + const searchSelectInput = await screen.findByLabelText('Find category') + + await userEvent.type(searchSelectInput, 'c') + const optionsPopupEl = await screen.findByRole('listbox') + + await waitFor(() => expect(optionsPopupEl.childElementCount).toEqual(1)) + }) + + it('checks the checkbox when value is within formValues', async () => { + renderElement(defaultProps) + + const searchSelect = elements.searchSelect() + + await userEvent.click(searchSelect) + + const unchecked = screen.getAllByTestId('CheckBoxOutlineBlankIcon') + const checked = screen.getAllByTestId('CheckBoxIcon') + + expect(unchecked.length).toBe(2) + expect(checked.length).toBe(1) + }) +}) diff --git a/views/components/SearchSelect/index.jsx b/views/components/SearchSelect/index.jsx new file mode 100644 index 00000000..4dc9b2f8 --- /dev/null +++ b/views/components/SearchSelect/index.jsx @@ -0,0 +1,81 @@ +import React, { useState, useMemo } from 'react' + +import { Card, Checkbox, Chip, MenuItem, ListItemText } from '@mui/material/' + +import MenuWithFooterActions from './MenuWithFooterActions' +import SearchInput from './SearchInput' +import { fontSize } from '../../../constants' +import ControlledSelect from '../../forms/ControlledSelect' + +const SearchSelect = ({ + control, + options, + actions, + name, + formValues, + label, +}) => { + const [search, setSearch] = useState('') + const displayedOptions = useMemo(() => { + const searchTerm = new RegExp(search, 'i') + return options.filter(({ value }) => searchTerm.test(value)) + }, [search]) + + const handleSearch = (e) => setSearch(e.target.value) + const handleClose = () => setSearch('') + + return ( + + selected.map((l) => ), + onClose: () => handleClose(), + multiple: true, + MenuProps: { + autoFocus: false, + MenuListProps: { + autoFocus: true, + }, + PaperProps: { + component: MenuWithFooterActions, + searchInput: , + actions: ( + + {actions} + + ), + }, + }, + }} + > + {displayedOptions.map(({ label, value }) => { + return ( + + + + + ) + })} + + ) +} + +export default SearchSelect diff --git a/views/components/Sidebar/NavItem.jsx b/views/components/Sidebar/NavItem.jsx new file mode 100644 index 00000000..4cba7204 --- /dev/null +++ b/views/components/Sidebar/NavItem.jsx @@ -0,0 +1,24 @@ +import React from 'react' + +import { ListItem, ListItemIcon, ListItemText } from '@mui/material' + +import SidebarLink from './SidebarLink' + +const NavItem = ({ to, Icon, label }) => { + return ( + + + + + + + ) +} + +export default NavItem diff --git a/views/components/Sidebar/SideNavigation.jsx b/views/components/Sidebar/SideNavigation.jsx new file mode 100644 index 00000000..795c9e66 --- /dev/null +++ b/views/components/Sidebar/SideNavigation.jsx @@ -0,0 +1,38 @@ +import React from 'react' + +import { + SpaceDashboard, + Group, + ShowChart, + DashboardCustomize, + AdminPanelSettings, + FolderOpen, +} from '@mui/icons-material' +import { List, Divider } from '@mui/material' + +import NavItem from './NavItem' +import { routes } from '../../routes/routes' + +const SideNavigation = ({ user }) => { + return ( + + ) +} + +export default SideNavigation diff --git a/views/components/Sidebar/SideNavigation.test.jsx b/views/components/Sidebar/SideNavigation.test.jsx new file mode 100644 index 00000000..8484adb2 --- /dev/null +++ b/views/components/Sidebar/SideNavigation.test.jsx @@ -0,0 +1,27 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import SideNavigation from './SideNavigation' +import { createUser } from '../../../test/fixtures' + +jest.mock('./SidebarLink') + +describe('SideNavigation', () => { + const user = createUser({ role: 'admin' }) + + beforeEach(() => { + render( + + + + ) + }) + + test('renders SideNavigation component', () => { + const nav = screen.getByTestId('nav') + + expect(nav).toBeInTheDocument() + }) +}) diff --git a/views/components/Sidebar/Sidebar.test.jsx b/views/components/Sidebar/Sidebar.test.jsx new file mode 100644 index 00000000..b54a5e3b --- /dev/null +++ b/views/components/Sidebar/Sidebar.test.jsx @@ -0,0 +1,39 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' +import { BrowserRouter } from 'react-router-dom' // Use MemoryRouter for testing routes + +import Sidebar from '.' +import { createUser } from '../../../test/fixtures' + +describe('Sidebar', () => { + const user = createUser() + + beforeEach(() => { + render(, { + wrapper: BrowserRouter, + }) + }) + + test('renders the Logo, Navigation and Footer', async () => { + const logo = screen.getByAltText('dpdash logo') + const navigation = screen.getByTestId('nav') + const footer = screen.getByAltText('D') + + expect(logo).toHaveAttribute('src', '/img/dpdash.png') + expect(navigation).toBeInTheDocument() + expect(footer).toBeInTheDocument() + }) + + test('it renders the side navigation items', () => { + const dashboard = screen.getByText('Dashboard') + const charts = screen.getByText('Charts') + const participants = screen.getByText('Participants') + const configurations = screen.getByText('Configurations') + + expect(dashboard).toBeInTheDocument() + expect(charts).toBeInTheDocument() + expect(participants).toBeInTheDocument() + expect(configurations).toBeInTheDocument() + }) +}) diff --git a/views/components/Sidebar/SidebarFooter.css b/views/components/Sidebar/SidebarFooter.css new file mode 100644 index 00000000..8de7855e --- /dev/null +++ b/views/components/Sidebar/SidebarFooter.css @@ -0,0 +1,17 @@ +.SidebarFooter_container { + margin-top: auto; + padding-left: 24px; +} + +.SidebarFooter_content { + padding: 8px 0; +} + +.SidebarFooter_actions { + display: flex; + gap: 16px; +} + +.SidebarFooter_version { + padding: 16px; +} diff --git a/views/components/Sidebar/SidebarFooter.jsx b/views/components/Sidebar/SidebarFooter.jsx new file mode 100644 index 00000000..958387e1 --- /dev/null +++ b/views/components/Sidebar/SidebarFooter.jsx @@ -0,0 +1,75 @@ +import React from 'react' + +import { + Typography, + Card, + Avatar, + CardHeader, + CardContent, + CardActions, + Button, +} from '@mui/material' +import { Link } from 'react-router-dom' + +import { fontSize } from '../../../constants' +import { routes } from '../../routes/routes' +import './SidebarFooter.css' + +const SidebarFooter = ({ user, onLogout }) => { + return ( + + } + sx={{ pb: '8px' }} + /> + + {user.display_name} + + {user.title} + + + + + + + + + DPdash v{process.env.DPDASH_VERSION} + + + + ) +} + +export default SidebarFooter diff --git a/views/components/Sidebar/SidebarFooter.test.jsx b/views/components/Sidebar/SidebarFooter.test.jsx new file mode 100644 index 00000000..cfe49dba --- /dev/null +++ b/views/components/Sidebar/SidebarFooter.test.jsx @@ -0,0 +1,48 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import SidebarFooter from './SidebarFooter' +import { createUser } from '../../../test/fixtures' + +describe('SidebarFooter', () => { + const envVars = process.env + const user = createUser() + + process.env.DPDASH_VERSION = '1.0.0' + + beforeEach(() => { + render( + + + + ) + }) + afterAll(() => { + process.env = envVars + }) + + test('renders SidebarFooter component with user data', async () => { + const userNameElement = screen.getByText(user.display_name) + const userAvatarElement = screen.getByAltText('D') + + expect(userNameElement).toBeInTheDocument() + expect(userAvatarElement).toBeInTheDocument() + }) + + test('renders Edit Profile and Log Out buttons with correct links', () => { + const editProfileButton = screen.getByText('Edit Profile') + const logOutButton = screen.getByText('Log out') + + expect(editProfileButton).toBeInTheDocument() + expect(editProfileButton).toHaveAttribute('href', '/user-account') + expect(logOutButton).toBeInTheDocument() + }) + + test('renders DPdash version correctly', () => { + const versionElement = screen.getByText('DPdash v1.0.0') + + expect(versionElement).toBeInTheDocument() + }) +}) diff --git a/views/components/Sidebar/SidebarLink.css b/views/components/Sidebar/SidebarLink.css new file mode 100644 index 00000000..f0402a0a --- /dev/null +++ b/views/components/Sidebar/SidebarLink.css @@ -0,0 +1,29 @@ +.SidebarLink_link { + border-radius: 8px; + display: flex; + gap: 20px; + text-decoration: none; + padding: 6px 12px; + + &:visited&:focus { + text-decoration: none; + } +} + +.SidebarLink_link-active { + display: flex; + text-decoration: none; + &:visited&:focus { + text-decoration: none; + } + background-color: var(--primary-light); + border-radius: 8px; +} + +.SidebarLink_link-active .MuiListItemIcon-root { + color: var(--text-secondary); +} + +.SidebarLink_link-active .MuiListItemText-root { + color: var(--text-secondary); +} diff --git a/views/components/Sidebar/SidebarLink.jsx b/views/components/Sidebar/SidebarLink.jsx new file mode 100644 index 00000000..25fcc554 --- /dev/null +++ b/views/components/Sidebar/SidebarLink.jsx @@ -0,0 +1,22 @@ +import React, { forwardRef } from 'react' + +import classNames from 'classnames' +import { NavLink } from 'react-router-dom' + +import './SidebarLink.css' + +const SidebarLink = forwardRef(function SidebarLink(props, ref) { + return ( + + classNames('SidebarLink_link', { 'SidebarLink_link-active': isActive }) + } + > + {props.children} + + ) +}) + +export default SidebarLink diff --git a/views/components/Sidebar/SidebarLogo.css b/views/components/Sidebar/SidebarLogo.css new file mode 100644 index 00000000..d8db941d --- /dev/null +++ b/views/components/Sidebar/SidebarLogo.css @@ -0,0 +1,9 @@ +.SidebarLogo_container { + display: flex; + justify-content: center; + align-items: center; + padding: 32px 16px; +} +.SidebarLogo_image { + height: 45px; +} diff --git a/views/components/Sidebar/SidebarLogo.jsx b/views/components/Sidebar/SidebarLogo.jsx new file mode 100644 index 00000000..cc54f81b --- /dev/null +++ b/views/components/Sidebar/SidebarLogo.jsx @@ -0,0 +1,16 @@ +import React from 'react' +import './SidebarLogo.css' + +const SidebarLogo = () => { + return ( +
+ dpdash logo +
+ ) +} + +export default SidebarLogo diff --git a/views/components/Sidebar/index.jsx b/views/components/Sidebar/index.jsx new file mode 100644 index 00000000..bd7ddf81 --- /dev/null +++ b/views/components/Sidebar/index.jsx @@ -0,0 +1,36 @@ +import React from 'react' + +import { Drawer } from '@mui/material' + +import SidebarFooter from './SidebarFooter' +import SidebarLogo from './SidebarLogo' +import SideNavigation from './SideNavigation' + +const Sidebar = ({ user, sidebarOpen, onLogout, isMobile, onClose }) => { + const status = isMobile ? 'temporary' : 'permanent' + + return ( + + + + + + ) +} + +export default Sidebar diff --git a/views/components/StatusChip/index.jsx b/views/components/StatusChip/index.jsx new file mode 100644 index 00000000..aadc4d19 --- /dev/null +++ b/views/components/StatusChip/index.jsx @@ -0,0 +1,23 @@ +import React from 'react' + +import { Chip } from '@mui/material' + +import { borderRadius, fontSize } from '../../../constants' + +const StatusChip = ({ isActive }) => { + return ( + + ) +} + +export default StatusChip diff --git a/views/components/StudyDetails/UploadFile.jsx b/views/components/StudyDetails/UploadFile.jsx new file mode 100644 index 00000000..59a7e833 --- /dev/null +++ b/views/components/StudyDetails/UploadFile.jsx @@ -0,0 +1,30 @@ +import Add from '@mui/icons-material/Add' +import Button from '@mui/material/Button' + +const UploadFile = ({ handleChangeFile }) => { + return ( +
+ + +
+ ) +} + +export default UploadFile diff --git a/views/components/UserAvatar/index.jsx b/views/components/UserAvatar/index.jsx new file mode 100644 index 00000000..0ad5660e --- /dev/null +++ b/views/components/UserAvatar/index.jsx @@ -0,0 +1,54 @@ +import React from 'react' + +import Person from '@mui/icons-material/AccountCircle' +import Avatar from '@mui/material/Avatar' + +import { colors } from '../../../constants' + +const DEFAULT_AVATAR_STYLE = { width: 60, height: 60 } +const AVATAR_STYLE_WITH_COLOR = { + ...DEFAULT_AVATAR_STYLE, + backgroundColor: colors.columbia_blue, +} +const SMALLER_AVATAR_STYLE = { + width: 30, + height: 30, +} +const SMALLER_AVATAR_WITH_COLOR = { + ...SMALLER_AVATAR_STYLE, + backgroundColor: colors.columbia_blue, +} +const UserAvatar = ({ user, small }) => { + const { icon, name, uid } = user + + if (icon) { + return ( + + ) + } + + if (name) { + return ( + + {name[0]} + + ) + } + + return uid && uid.length > 0 ? ( + + {uid[0]} + + ) : ( + + + + ) +} + +export default UserAvatar diff --git a/views/contexts/AuthContext.js b/views/contexts/AuthContext.js new file mode 100644 index 00000000..f5d4674d --- /dev/null +++ b/views/contexts/AuthContext.js @@ -0,0 +1,3 @@ +import { createContext } from 'react' + +export const AuthContext = createContext() diff --git a/views/contexts/GridContext.js b/views/contexts/GridContext.js new file mode 100644 index 00000000..1c29bb1a --- /dev/null +++ b/views/contexts/GridContext.js @@ -0,0 +1,3 @@ +import { createContext } from 'react' + +export const GridContext = createContext() diff --git a/views/contexts/NotificationContext.js b/views/contexts/NotificationContext.js new file mode 100644 index 00000000..96c83bba --- /dev/null +++ b/views/contexts/NotificationContext.js @@ -0,0 +1,3 @@ +import { createContext } from 'react' + +export const NotificationContext = createContext() diff --git a/views/contexts/ThemeContext.js b/views/contexts/ThemeContext.js new file mode 100644 index 00000000..bad3ab2c --- /dev/null +++ b/views/contexts/ThemeContext.js @@ -0,0 +1,3 @@ +import { createContext } from 'react' + +export const ThemeContext = createContext() diff --git a/views/contexts/index.js b/views/contexts/index.js new file mode 100644 index 00000000..91c84821 --- /dev/null +++ b/views/contexts/index.js @@ -0,0 +1,5 @@ +import { AuthContext } from './AuthContext' +import { NotificationContext } from './NotificationContext' +import { ThemeContext } from './ThemeContext' + +export { AuthContext, NotificationContext, ThemeContext } diff --git a/views/fe-utils/colorList.js b/views/fe-utils/colorList.js new file mode 100644 index 00000000..c1c02d51 --- /dev/null +++ b/views/fe-utils/colorList.js @@ -0,0 +1,9 @@ +import colorbrewer from 'colorbrewer' + +export const colorList = (colorObj = colorbrewer) => { + const { schemeGroups: _, ...colorBrewer } = colorObj + + return Object.values(colorBrewer) + .flatMap((colorPalette) => Object.values(colorPalette)) + .map((colors, i) => ({ value: i, label: colors })) +} diff --git a/views/fe-utils/colorList.test.js b/views/fe-utils/colorList.test.js new file mode 100644 index 00000000..2db38cb3 --- /dev/null +++ b/views/fe-utils/colorList.test.js @@ -0,0 +1,12 @@ +import { colorList } from './colorList' +import { createColorList, createColorbrewer } from '../../test/fixtures' + +const colorbrewer = createColorbrewer() + +describe('Utils - colorList', () => { + it('returns an array of objects containing a label and values property', () => { + const colors = colorList(colorbrewer) + + expect(colors).toEqual(createColorList()) + }) +}) diff --git a/views/fe-utils/helpers.js b/views/fe-utils/helpers.js new file mode 100644 index 00000000..0fc7d12a --- /dev/null +++ b/views/fe-utils/helpers.js @@ -0,0 +1,9 @@ +export const formatAsPercentage = (value = 0) => value.toFixed(0) + '%' + +export const studyCountsToPercentage = (studyCount, targetTotal) => { + if (!targetTotal || Number.isNaN(+studyCount) || Number.isNaN(+targetTotal)) { + return 0 + } + + return (+studyCount / +targetTotal) * 100 +} diff --git a/views/fe-utils/preferencesUtil.js b/views/fe-utils/preferencesUtil.js new file mode 100644 index 00000000..bf176b02 --- /dev/null +++ b/views/fe-utils/preferencesUtil.js @@ -0,0 +1,14 @@ +const babyProofPreferences = (preferences) => { + const defaultPreferences = { + complete: {}, + star: {}, + sort: 0, + } + + return { ...defaultPreferences, ...preferences } +} + +export const preparePreferences = (configurationId = '', preferences = {}) => ({ + ...babyProofPreferences(preferences), + config: configurationId, +}) diff --git a/views/fe-utils/styleUtil.js b/views/fe-utils/styleUtil.js new file mode 100644 index 00000000..49c9197a --- /dev/null +++ b/views/fe-utils/styleUtil.js @@ -0,0 +1,25 @@ +import { colors } from '../../constants' + +const getDefaultStyles = (theme) => ({ + root: { + flexGrow: 1, + zIndex: 1, + overflow: 'hidden', + position: 'relative', + display: 'flex', + width: '100%', + backgroundColor: colors.configWhite, + }, + content: { + flexGrow: 1, + backgroundColor: '#fefefe', + padding: theme.spacing.unit * 3, + }, + contentPadded: { + padding: '12px', + marginTop: '64px', + overflow: 'scroll', + }, +}) + +export default getDefaultStyles diff --git a/views/fe-utils/targetValuesUtil.js b/views/fe-utils/targetValuesUtil.js new file mode 100644 index 00000000..6cc94a2b --- /dev/null +++ b/views/fe-utils/targetValuesUtil.js @@ -0,0 +1,9 @@ +import { DISALLOWED_STUDIES } from '../../constants' + +const allowedStudies = (study) => !DISALLOWED_STUDIES.includes(study) + +export const targetValuesFields = (studyList) => + studyList.filter(allowedStudies).reduce((targets, study) => { + targets[study] = '' + return targets + }, {}) diff --git a/views/fe-utils/tooltipUtil.js b/views/fe-utils/tooltipUtil.js new file mode 100644 index 00000000..0d9c4f0f --- /dev/null +++ b/views/fe-utils/tooltipUtil.js @@ -0,0 +1,7 @@ +export const toolTipPercent = (count, targetTotal) => { + if (!targetTotal || Number.isNaN(+count) || Number.isNaN(+targetTotal)) { + return 0 + } + + return ((+count / +targetTotal) * 100).toFixed(0) +} diff --git a/views/fe-utils/windowUtil.js b/views/fe-utils/windowUtil.js new file mode 100644 index 00000000..560be64c --- /dev/null +++ b/views/fe-utils/windowUtil.js @@ -0,0 +1,5 @@ +const openNewWindow = (uri) => { + window.open(uri, '_self') +} + +export default openNewWindow diff --git a/views/forms/AdminUsersSearchForm/AdminUsersSearchForm.test.jsx b/views/forms/AdminUsersSearchForm/AdminUsersSearchForm.test.jsx new file mode 100644 index 00000000..8e251348 --- /dev/null +++ b/views/forms/AdminUsersSearchForm/AdminUsersSearchForm.test.jsx @@ -0,0 +1,41 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import { AdminUsersSearchForm } from '.' + +describe('Admin User Search Form', () => { + const defaultProps = { + allOptions: [ + { label: 'dpdash', value: 'dpdash' }, + { label: 'asdf', value: 'asdf' }, + { label: 'person', value: 'person' }, + ], + onSubmit: () => {}, + } + const elements = { + searchField: () => screen.getByRole('combobox'), + } + const renderForm = (props = defaultProps) => { + render() + } + + test('calls the onSubmit prop when the form is submitted with valid data', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + + user.type(elements.searchField(), 'dpdash') + + userEvent.click(await screen.findByText('dpdash')) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith([ + { label: 'dpdash', value: 'dpdash' }, + ]) + ) + }) +}) diff --git a/views/forms/AdminUsersSearchForm/index.jsx b/views/forms/AdminUsersSearchForm/index.jsx new file mode 100644 index 00000000..5df5790c --- /dev/null +++ b/views/forms/AdminUsersSearchForm/index.jsx @@ -0,0 +1,48 @@ +import React, { useEffect } from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import SearchIcon from '@mui/icons-material/Search' +import { InputAdornment } from '@mui/material' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import ControlledMultiSelect from '../ControlledMultiSelect' + +const schema = yup.object({ + users: yup.array(), +}) + +export const AdminUsersSearchForm = ({ onSubmit, allOptions }) => { + const { handleSubmit, control, formState, watch } = useForm({ + defaultValues: { + users: [], + }, + mode: 'onChange', + resolver: yupResolver(schema), + }) + + const data = watch() + + useEffect(() => { + if (formState.isValid && !formState.isValidating) { + onSubmit(data.users) + } + }, [data, formState]) + + return ( +
+ + + + } + fullWidth + /> + + ) +} diff --git a/views/forms/BarChartFields/BarChartFields.css b/views/forms/BarChartFields/BarChartFields.css new file mode 100644 index 00000000..6a723b5b --- /dev/null +++ b/views/forms/BarChartFields/BarChartFields.css @@ -0,0 +1,24 @@ +.BarChartFieldsValueLabel { + display: flex; + flex-direction: column; + padding-bottom: 20px; + padding-top: 20px; +} +.BarChartFieldsTargetValues { + display: flex; + align-items: center; +} +.BarChartFieldsAddTargets { + padding-top: 20px; +} +@media screen and (max-width: 800px) { + .BarChartFieldsValueLabel { + width: auto; + } +} + +@media screen and (min-width: 900px) { + .BarChartFieldsValueLabel { + width: 50%; + } +} diff --git a/views/forms/BarChartFields/index.jsx b/views/forms/BarChartFields/index.jsx new file mode 100644 index 00000000..7c6c8618 --- /dev/null +++ b/views/forms/BarChartFields/index.jsx @@ -0,0 +1,134 @@ +import React from 'react' + +import Delete from '@mui/icons-material/Delete' +import { Button, Typography } from '@mui/material' + +import { presetColors } from '../../../constants' +import ColorPicker from '../../components/ColorPicker/' +import ControlledCheckbox from '../ControlledCheckbox' +import TextInput from '../TextInput' + +import './BarChartFields.css' + +const BarChartFields = ({ + control, + fields, + onRemove, + onAddNewFields, + fieldsValue, +}) => { + return ( + <> + + + + +
+ +
+ {fields.map((field, index) => { + const { id, targetValues } = field + return ( + +
+ +
+
+ + +
+ + + Targets + + {Object.keys(targetValues).map((study, idx) => ( +
+ + {study} + + +
+ ))} +
+ ) + })} +
+ +
+ + ) +} + +export default BarChartFields diff --git a/views/forms/ChartFilterForm/ChartFilterForm.css b/views/forms/ChartFilterForm/ChartFilterForm.css new file mode 100644 index 00000000..d916c222 --- /dev/null +++ b/views/forms/ChartFilterForm/ChartFilterForm.css @@ -0,0 +1,35 @@ +.ChartFilterForm { + display: grid; + width: 100%; + gap: 10px; + padding-bottom: 20px; + grid-template-columns: repeat(1fr, 4); + grid-template-rows: auto; +} +.ChartFilterForm_container { + display: flex; + padding-left: 15px; +} +.ChartFilterForm_text { + margin-top: 0; + margin-bottom: 0; + text-indent: 15px; +} +.ChartFilterForm_nested { + padding: 0; +} +.ChartFilterForm_submit { + padding-top: 20px; + width: 158px; + padding-left: 15px; +} + +@media screen and (max-width: 1040px) { + .ChartFilterForm { + display: flex; + flex-direction: column; + width: 100%; + gap: 20px; + padding-bottom: 20px; + } +} diff --git a/views/forms/ChartFilterForm/ChartFilterForm.test.jsx b/views/forms/ChartFilterForm/ChartFilterForm.test.jsx new file mode 100644 index 00000000..0d83afc7 --- /dev/null +++ b/views/forms/ChartFilterForm/ChartFilterForm.test.jsx @@ -0,0 +1,120 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import ChartFilterForm from '.' +import { SITES_BY_NETWORK } from '../../../constants' + +describe('Chart Filter Form', () => { + const defaultInitialValues = { + chrcrit_part: { + HC: { label: 'HC', value: 0 }, + CHR: { label: 'CHR', value: 0 }, + Missing: { label: 'Missing', value: 0 }, + }, + recruitment_status: { + Recruited: { label: 'Recruited', value: 0 }, + 'Not recruited': { label: 'Not Recruited', value: 0 }, + }, + sex_at_birth: { + Male: { label: 'Male', value: 0 }, + Female: { label: 'Female', value: 0 }, + Missing: { label: 'Missing', value: 0 }, + }, + sites: { + CA: { label: 'CA', value: 1 }, + LA: { label: 'LA', value: 1 }, + MA: { label: 'MA', value: 0 }, + ME: { label: 'ME', value: 0 }, + }, + networks: { + PRESCIENT: { label: 'PRESCIENT', value: 0 }, + ProNET: { label: 'ProNET', value: 0 }, + }, + } + + const defaultProps = { + initialValues: defaultInitialValues, + onSubmit: () => {}, + } + + const elements = { + form: () => screen.getByTestId('filter_form'), + clearButton: () => screen.getByRole('button', { name: 'Clear' }), + sitesFilters: () => screen.getByRole('textbox', { name: 'sites' }), + cohortFilters: () => screen.getByLabelText('Cohort'), + recruitmentFilters: () => screen.getByLabelText('Recruitment Status'), + networkFilters: () => screen.getByLabelText('Networks'), + getFilterElement: (name) => screen.getByText(name), + } + + const renderForm = (props = defaultProps) => { + return render() + } + + test('calls the onSubmit prop when the form is submitted with valid data', async () => { + const onSubmit = jest.fn() + + renderForm({ ...defaultProps, onSubmit }) + + const cohortElement = elements.cohortFilters() + const recruitmentFilterElement = elements.recruitmentFilters() + + await userEvent.click(cohortElement) + await userEvent.click(elements.getFilterElement('HC')) + await userEvent.click(recruitmentFilterElement) + await userEvent.click(elements.getFilterElement('Recruited')) + await userEvent.keyboard('{Escape}') + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + chrcrit_part: ['HC'], + recruitment_status: ['Recruited'], + networks: [], + sex_at_birth: [], + sites: ['CA', 'LA'], + }, + expect.anything() + ) + ) + }) + + test('updates the available sites when a network is selected', async () => { + const prescient = 'PRESCIENT' + const onSubmit = jest.fn() + + const props = { + ...defaultProps, + onSubmit, + } + + renderForm(props) + + const networksElement = elements.networkFilters() + + await userEvent.click(networksElement) + await userEvent.click(elements.getFilterElement(prescient)) + await userEvent.keyboard('{Escape}') + + const prescientSites = screen.queryByDisplayValue( + SITES_BY_NETWORK[prescient].join(',') + ) + + expect(prescientSites).toBeInTheDocument() + + await waitFor(() => { + expect(onSubmit).toHaveBeenCalledWith( + { + chrcrit_part: [], + recruitment_status: [], + networks: [prescient], + sex_at_birth: [], + sites: SITES_BY_NETWORK[prescient], + }, + expect.anything() + ) + }) + }) +}) diff --git a/views/forms/ChartFilterForm/index.jsx b/views/forms/ChartFilterForm/index.jsx new file mode 100644 index 00000000..4cc8403a --- /dev/null +++ b/views/forms/ChartFilterForm/index.jsx @@ -0,0 +1,85 @@ +import React, { useEffect } from 'react' + +import { FormControl, InputLabel } from '@mui/material' +import { useForm } from 'react-hook-form' + +import { + SITES_BY_NETWORK, + NETWORKS_FILTER_KEY, + SITES_FILTER_KEY, + FILTER_CATEGORIES, +} from '../../../constants' +import { ChartFiltersModel } from '../../models' +import DropdownCheckboxGroup from '../DropdownCheckboxGroup' + +import './ChartFilterForm.css' + +const ChartFilterForm = ({ initialValues, onSubmit }) => { + const { handleSubmit, setValue, watch, control } = useForm({ + defaultValues: ChartFiltersModel.filtersToFormValues(initialValues), + }) + const handleClear = (filterField) => setValue(filterField, []) + const handleSelectAll = (filterField) => { + const allFilterValues = Object.values(initialValues[filterField]).map( + ({ label }) => label + ) + return setValue(filterField, allFilterValues) + } + + useEffect(() => { + const subscription = watch((value, { name }) => { + if (name === NETWORKS_FILTER_KEY) { + const sitesUnion = [ + ...new Set( + value[NETWORKS_FILTER_KEY].reduce((siteList, network) => { + return siteList.concat(SITES_BY_NETWORK[network]) + }, []) + ), + ] + + setValue(SITES_FILTER_KEY, sitesUnion) + } + }) + return () => subscription.unsubscribe() + }, [watch]) + + return ( +
+
+ {Object.keys(initialValues).map((filterKey, i) => { + const columnStart = (i % 4) + 1 + const row = Math.trunc(i / 4) + 1 + + return ( + + + {FILTER_CATEGORIES[filterKey]} + + + + ) + })} +
+ + ) +} + +export default ChartFilterForm diff --git a/views/forms/ChartForm.jsx b/views/forms/ChartForm.jsx new file mode 100644 index 00000000..5e36dca8 --- /dev/null +++ b/views/forms/ChartForm.jsx @@ -0,0 +1,62 @@ +import React from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import Button from '@mui/material/Button' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import BarChartFields from './BarChartFields' +import { colors } from '../../constants' +import { targetValuesFields } from '../fe-utils/targetValuesUtil' +import useArrayFormFields from '../hooks/useArrayFormFields' + +const schema = yup.object({ + title: yup.string().required(), + description: yup.string().required(), + assessment: yup.string().required(), + variable: yup.string().required(), + public: yup.boolean(), + fieldLabelValueMap: yup.array().of( + yup.object({ + value: yup.string(), + label: yup.string(), + color: yup.string(), + targetValues: yup.object(), + }) + ), +}) + +const ChartForm = ({ onSubmit, user, initialValues }) => { + const { handleSubmit, control, watch } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(schema), + }) + const { fields, addNewField, removeField } = useArrayFormFields({ + control, + name: 'fieldLabelValueMap', + defaultFieldValue: { + value: '', + label: '', + color: colors.dark_sky_blue, + targetValues: targetValuesFields(user.access), + }, + }) + return ( +
+ +
+ +
+ + ) +} + +export default ChartForm diff --git a/views/forms/ChartShareForm/ChartShareForm.test.jsx b/views/forms/ChartShareForm/ChartShareForm.test.jsx new file mode 100644 index 00000000..5bcaa887 --- /dev/null +++ b/views/forms/ChartShareForm/ChartShareForm.test.jsx @@ -0,0 +1,157 @@ +import React from 'react' + +import { render, screen, waitFor, fireEvent } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import ChartShareForm from '.' +import { createChart } from '../../../test/fixtures' + +jest.mock('react-hook-form', () => ({ + ...jest.requireActual('react-hook-form'), + useController: () => jest.fn().mockReturnValue({ field: {} }), + control: {}, +})) + +beforeEach(() => { + jest.resetAllMocks() +}) +describe(ChartShareForm, () => { + const defaultProps = { + chartToShare: {}, + closeDialog: jest.fn(), + shareWithUsers: jest.fn(), + sharedWithOptions: [], + shareFormControl: jest.fn().mockReturnValue({ field: {} }), + shareFormValues: { + sharedWith: [], + }, + clearSelectedUsers: jest.fn(), + selectAllUsers: jest.fn(), + } + + const elements = { + dialogs: () => screen.queryAllByRole('dialog'), + dialog: () => screen.findByRole('dialog'), + combobox: () => screen.getByRole('combobox'), + checkbox: async () => { + const checkboxes = await screen.findAllByRole('checkbox') + return checkboxes[0] + }, + submitButton: () => screen.getByTestId('submit'), + cancelButton: () => screen.getByTestId('cancel'), + clearButton: () => screen.getByRole('button', { name: 'CLEAR' }), + selectAllButton: () => screen.getByRole('button', { name: 'SELECT ALL' }), + } + + describe('when the chart to share is empty', () => { + it('does not show the dialog', async () => { + render() + + expect(await elements.dialogs()).toEqual([]) + }) + }) + + describe('when the chart to share is populated', () => { + const chartToShare = createChart() + const selectedUser = { + value: 'alice', + label: 'Alice', + } + + const sharedWithOptions = [ + selectedUser, + { value: 'bob', label: 'Bob' }, + { value: 'cody', label: 'Cody' }, + ] + it('shows the dialog', async () => { + render( + + ) + + await waitFor(async () => { + expect(await elements.dialog()).toBeInTheDocument() + }) + }) + it('allows the user to select other users to share the chart with', async () => { + render( + + ) + + await waitFor(async () => + expect(await elements.dialog()).toBeInTheDocument() + ) + + await userEvent.click(elements.combobox()) + + await waitFor(async () => { + expect(await elements.checkbox()).toBeInTheDocument() + }) + + await userEvent.click(await elements.checkbox()) + fireEvent.submit(await elements.submitButton()) + + await waitFor(async () => { + expect(defaultProps.shareWithUsers).toHaveBeenCalled() + }) + }) + + it('allows the user to clear all selected users', async () => { + render( + + ) + + await waitFor(async () => + expect(await elements.dialog()).toBeInTheDocument() + ) + + await userEvent.click(elements.combobox()) + + await waitFor(async () => { + expect(await elements.checkbox()).toBeInTheDocument() + }) + + await userEvent.click(await elements.clearButton()) + + await waitFor(async () => { + expect(defaultProps.clearSelectedUsers).toHaveBeenCalled() + }) + }) + it('allows the user to select all users', async () => { + render( + + ) + + await waitFor(async () => + expect(await elements.dialog()).toBeInTheDocument() + ) + + await userEvent.click(elements.combobox()) + + await waitFor(async () => { + expect(await elements.checkbox()).toBeInTheDocument() + }) + + await userEvent.click(await elements.selectAllButton()) + + await waitFor(async () => { + expect(defaultProps.selectAllUsers).toHaveBeenCalled() + }) + }) + }) +}) diff --git a/views/forms/ChartShareForm/index.jsx b/views/forms/ChartShareForm/index.jsx new file mode 100644 index 00000000..29325fc0 --- /dev/null +++ b/views/forms/ChartShareForm/index.jsx @@ -0,0 +1,77 @@ +import React from 'react' + +import { + Button, + CardActions, + Dialog, + DialogTitle, + DialogContent, + DialogActions, +} from '@mui/material' + +import SearchSelect from '../../components/SearchSelect' + +const ChartShareForm = ({ + chartToShare, + closeDialog, + shareWithUsers, + sharedWithOptions, + shareFormControl, + shareFormValues, + clearSelectedUsers, + selectAllUsers, +}) => { + return ( + + Share Chart {chartToShare.title}? + + + + + + + } + /> + + + + + + + ) +} + +export default ChartShareForm diff --git a/views/forms/ChartsSearchForm/index.jsx b/views/forms/ChartsSearchForm/index.jsx new file mode 100644 index 00000000..7e274ba2 --- /dev/null +++ b/views/forms/ChartsSearchForm/index.jsx @@ -0,0 +1,44 @@ +import React from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import SearchIcon from '@mui/icons-material/Search' +import { InputAdornment } from '@mui/material' +import debounce from 'debounce' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import TextInput from '../TextInput' + +const schema = yup.object({ + search: yup.string(), +}) + +const ChartsSearchForm = ({ initialValues, onSubmit }) => { + const { handleSubmit, control } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(schema), + }) + + return ( +
+ + + + } + fullWidth + onChange={debounce( + (e) => onSubmit({ [e.target.name]: e.target.value }), + 500 + )} + InputProps={{ autoComplete: 'off' }} + /> + + ) +} + +export default ChartsSearchForm diff --git a/views/forms/ConfigAssessmentFormFields/ConfigAssessmentFormFields.css b/views/forms/ConfigAssessmentFormFields/ConfigAssessmentFormFields.css new file mode 100644 index 00000000..d8095507 --- /dev/null +++ b/views/forms/ConfigAssessmentFormFields/ConfigAssessmentFormFields.css @@ -0,0 +1,12 @@ +.ColorPaletteDropdown { + display: table; + width: 100%; +} +.ColorPaletteBlock { + width: 20px; + height: 20px; + display: table-cell; +} +.RangeFields { + display: 'flex'; +} diff --git a/views/forms/ConfigAssessmentFormFields/index.jsx b/views/forms/ConfigAssessmentFormFields/index.jsx new file mode 100644 index 00000000..2b5c9a02 --- /dev/null +++ b/views/forms/ConfigAssessmentFormFields/index.jsx @@ -0,0 +1,104 @@ +import React from 'react' + +import { VisibilityOffOutlined, Visibility } from '@mui/icons-material' +import { MenuItem } from '@mui/material' + +import ConfigurationCategoryCard from '../../components/ConfigurationCategoryCard' +import ControlledCheckbox from '../ControlledCheckbox' +import ControlledSelectInput from '../ControlledSelect' +import PredictiveInputSelect from '../PredictiveInputSelect' +import TextInput from '../TextInput' +import './ConfigAssessmentFormFields.css' + +const ConfigAssessmentFormFields = ({ + control, + colors, + index, + id, + onCopy, + onRemove, + assessmentOptions, + handleAssessmentSearch, + handleClearAssessments, +}) => { + return ( + + + + + + + {colors.map(({ value, label }, colorsIndex) => ( + +
+ {label.map((palette) => ( + + ))} +
+
+ ))} +
+
+ + +
+ } + checkedIcon={} + labelprops={{}} + /> +
+ ) +} + +export default ConfigAssessmentFormFields diff --git a/views/forms/ConfigFields/ConfigFields.css b/views/forms/ConfigFields/ConfigFields.css new file mode 100644 index 00000000..edc0c924 --- /dev/null +++ b/views/forms/ConfigFields/ConfigFields.css @@ -0,0 +1,6 @@ +.ConfigFields { + display: flex; + gap: 10px; + flex-flow: wrap; + padding-top: 40px; +} diff --git a/views/forms/ConfigFields/index.jsx b/views/forms/ConfigFields/index.jsx new file mode 100644 index 00000000..b81dbffa --- /dev/null +++ b/views/forms/ConfigFields/index.jsx @@ -0,0 +1,54 @@ +import React from 'react' + +import ConfigAssessmentFormFields from '../ConfigAssessmentFormFields' +import ConfigTypeFormFields from '../ConfigTypeFormFields' + +import './ConfigFields.css' + +const ConfigFormFields = ({ + control, + colors, + fields, + friendsList, + onCopy, + onRemove, + assessmentOptions, + handleAssessmentSearch, + handleClearAssessments, + handleClearUsers, + handleSelectAllUsers, +}) => { + return ( + <> + +
+ {fields.map((field, index) => { + const { id, ...rest } = field + + return ( + + ) + })} +
+ + ) +} + +export default ConfigFormFields diff --git a/views/forms/ConfigForm/ConfigForm.css b/views/forms/ConfigForm/ConfigForm.css new file mode 100644 index 00000000..754ea4c1 --- /dev/null +++ b/views/forms/ConfigForm/ConfigForm.css @@ -0,0 +1,17 @@ +.ConfigFormActions { + position: fixed; + bottom: 0; + right: 0; + border: 0; + padding: 24px; + display: grid; + grid-template-columns: repeat(1fr, 3); + gap: 10px; + font-size: 12px; +} + +@media screen and (min-width: 1000px) { + .ConfigForm { + padding-top: 40px; + } +} diff --git a/views/forms/ConfigForm/ConfigForm.test.jsx b/views/forms/ConfigForm/ConfigForm.test.jsx new file mode 100644 index 00000000..883faa84 --- /dev/null +++ b/views/forms/ConfigForm/ConfigForm.test.jsx @@ -0,0 +1,91 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import ConfigForm from '.' +import { colorList } from '../../fe-utils/colorList' +import { UserConfigModel } from '../../models' + +describe('ConfigForm', () => { + const defaultProps = { + colors: colorList(), + friendsList: [ + { label: 'user 1', value: 'user 1' }, + { label: 'user 2', value: 'user 2' }, + ], + initialValues: UserConfigModel.defaultFormValues({ + readers: [], + owner: 'user 1', + }), + handleClearAssessments: () => {}, + handleAssessmentSearch: () => {}, + handleSubmitDraft: () => {}, + onSubmit: () => {}, + } + const elements = { + configNameInput: () => + screen.getByRole('textbox', { name: 'Configuration name' }), + description: () => + screen.getByRole('textbox', { name: 'Description (Optional)' }), + submitAsDraft: () => screen.getByText('Save as draft'), + publishConfig: () => screen.getByText('Publish'), + makePublic: () => screen.getByRole('checkbox', { name: 'public' }), + } + const renderForm = (props = defaultProps) => { + return render() + } + + it('calls the onSubmit prop when the form is submitted with valid data', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.configNameInput(), 'my config') + await user.type(elements.description(), 'description') + await user.click(elements.makePublic()) + + await user.click(elements.publishConfig()) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + config: [], + configName: 'my config', + configType: 'matrix', + description: 'description', + owner: 'user 1', + public: true, + readers: [], + }, + expect.anything() + ) + ) + }) + it('calls the save as draft prop when the form is saved as a draft configuration', async () => { + const user = userEvent.setup() + const handleSubmitDraft = jest.fn() + const props = { ...defaultProps, handleSubmitDraft } + + renderForm(props) + await user.type(elements.configNameInput(), 'draft config') + await user.type(elements.description(), 'draft') + await user.click(elements.submitAsDraft()) + + await waitFor(() => + expect(handleSubmitDraft).toHaveBeenCalledWith( + { + config: [], + configName: 'draft config', + configType: 'matrix', + description: 'draft', + owner: 'user 1', + public: false, + readers: [], + }, + expect.anything() + ) + ) + }) +}) diff --git a/views/forms/ConfigForm/index.jsx b/views/forms/ConfigForm/index.jsx new file mode 100644 index 00000000..e23522e6 --- /dev/null +++ b/views/forms/ConfigForm/index.jsx @@ -0,0 +1,133 @@ +import React from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import { Button } from '@mui/material' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import useArrayFormFields from '../../hooks/useArrayFormFields' +import { UserConfigModel } from '../../models' +import ConfigFormFields from '../ConfigFields' +import './ConfigForm.css' + +const schema = yup.object({ + configName: yup.string().required(), + configType: yup.string().required(), + description: yup.string(), + readers: yup.array().of( + yup.object({ + value: yup.string(), + label: yup.string(), + isFixed: yup.boolean(), + }) + ), + public: yup.boolean(), + owner: yup.string().required(), + config: yup.array().of( + yup.object({ + category: yup.string(), + analysis: yup.string(), + variable: yup.string(), + label: yup.string(), + color: yup.number(), + min: yup.string(), + max: yup.string(), + text: yup.boolean(), + }) + ), + status: yup.number(), +}) + +const ConfigForm = ({ + colors, + friendsList, + initialValues, + onSubmit, + assessmentOptions, + handleClearAssessments, + handleAssessmentSearch, + handleSubmitDraft, +}) => { + const defaultFieldValue = UserConfigModel.defaultConfigValues + + const { handleSubmit, control, getValues, setValue } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(schema), + }) + const { fields, addNewField, removeField } = useArrayFormFields({ + control, + name: 'config', + defaultFieldValue, + }) + const onCopy = (configCategoryIndex) => + addNewField(getValues(`config[${configCategoryIndex}]`)) + const handleClearUsers = () => setValue('readers', []) + const handleSelectAllUsers = () => setValue('readers', friendsList) + + return ( +
+ +
+ + + +
+ + ) +} + +export default ConfigForm diff --git a/views/forms/ConfigTypeFormFields/ConfigTypeFormFields.css b/views/forms/ConfigTypeFormFields/ConfigTypeFormFields.css new file mode 100644 index 00000000..8fc10acd --- /dev/null +++ b/views/forms/ConfigTypeFormFields/ConfigTypeFormFields.css @@ -0,0 +1,41 @@ +.ConfigTypeFormFields { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-areas: + 'name type' + 'description share'; + grid-gap: 10%; +} +.ConfigTypeShareContainer { + display: flex; + grid-area: share; + flex-direction: column; +} +.ConfigTypeShareHeader { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-areas: 'share_label make_public'; +} + +@media screen and (max-width: 1100px) { + .ConfigTypeFormFields { + display: grid; + grid-template-columns: 1fr; + grid-template-areas: + 'name' + 'type' + 'description' + 'share'; + grid-gap: 15px; + } +} + +@media screen and (max-width: 600px) { + .ConfigTypeShareHeader { + display: grid; + grid-template-columns: 1fr; + grid-template-areas: + 'make_public' + 'share_label'; + } +} diff --git a/views/forms/ConfigTypeFormFields/index.jsx b/views/forms/ConfigTypeFormFields/index.jsx new file mode 100644 index 00000000..720fbf04 --- /dev/null +++ b/views/forms/ConfigTypeFormFields/index.jsx @@ -0,0 +1,111 @@ +import React from 'react' + +import { FormHelperText, InputLabel } from '@mui/material' + +import { fontSize, lineHeight } from '../../../constants' +import ControlledCheckbox from '../ControlledCheckbox' +import ControlledMultiSelect from '../ControlledMultiSelect' +import TextInput from '../TextInput' + +import './ConfigTypeFormFields.css' + +const textInputStyles = { + color: 'text.primary', + fontWeight: 500, + lineHeight: lineHeight[21], + fontSize: fontSize[18], + mt: '-10px', +} +const textInputProps = { notched: false } +const inputLabelProps = { shrink: true, sx: textInputStyles } + +const ConfigTypeFormFields = (props) => { + const { control, friendsList, handleClearUsers, handleSelectAllUsers } = props + + return ( +
+ + + +
+
+ + Share with + + +
+ + + Added users will have view only access to this configuration. + +
+
+ ) +} + +export default ConfigTypeFormFields diff --git a/views/forms/ControlledCheckbox/index.jsx b/views/forms/ControlledCheckbox/index.jsx new file mode 100644 index 00000000..9a62bd27 --- /dev/null +++ b/views/forms/ControlledCheckbox/index.jsx @@ -0,0 +1,64 @@ +import React from 'react' + +import { Checkbox, FormControlLabel } from '@mui/material' +import { Controller } from 'react-hook-form' + +const ControlledCheckbox = ({ + name, + control, + onChange, + checked, + label, + ...props +}) => { + return label ? ( + ( + { + field.onChange(e) + if (onChange) onChange(e) + }} + inputProps={{ name, 'aria-label': name }} + checked={ + !checked && typeof field.value === 'boolean' + ? field.value + : checked + } + /> + )} + /> + } + label={label} + labelPlacement={props.labelplacement || 'start'} + sx={props.labelprops.sx || {}} + /> + ) : ( + ( + { + field.onChange(e) + if (onChange) onChange(e) + }} + inputProps={{ name, 'aria-label': name }} + defaultChecked={ + !checked && typeof field.value === 'boolean' ? field.value : checked + } + /> + )} + /> + ) +} + +export default ControlledCheckbox diff --git a/views/forms/ControlledMultiSelect/ControlledMultiSelect.test.jsx b/views/forms/ControlledMultiSelect/ControlledMultiSelect.test.jsx new file mode 100644 index 00000000..cea5e44c --- /dev/null +++ b/views/forms/ControlledMultiSelect/ControlledMultiSelect.test.jsx @@ -0,0 +1,138 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +import { useForm } from 'react-hook-form' + +import ControlledMultiSelect from '.' + +describe('Controlled Multi Select', () => { + const defaultComponentProps = { + label: 'Input label', + name: 'field_name', + options: [ + { label: 'One', value: '1' }, + { label: 'Two', value: '2' }, + { label: 'Three', value: '3' }, + ], + } + const defaultProps = { + initialValues: { field_name: [] }, + onSubmit: () => {}, + componentProps: defaultComponentProps, + } + const elements = { + autoComplete: () => screen.getByRole('combobox', { name: 'Input label' }), + submitBtn: () => screen.getByRole('button', { name: 'submit' }), + } + const FormWrapper = (props) => { + const { control, handleSubmit } = useForm({ + defaultValues: props.initialValues, + }) + + return ( +
+ + + + + ) + } + const renderComponent = (props = defaultProps) => { + render() + } + + test('allows selecting a new option', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderComponent(props) + const textbox = elements.autoComplete() + await userEvent.type(textbox, 'o') + await userEvent.click(await screen.findByText('One')) + await userEvent.type(textbox, 't') + await userEvent.click(await screen.findByText('Two')) + await user.click(elements.submitBtn()) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + field_name: [ + defaultComponentProps.options[0], + defaultComponentProps.options[1], + ], + }, + expect.anything() + ) + ) + }) + + test('removing an existing option', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { + ...defaultProps, + initialValues: { + field_name: [ + defaultComponentProps.options[1], + defaultComponentProps.options[2], + ], + }, + onSubmit, + } + + renderComponent(props) + await userEvent.type(elements.autoComplete(), '{backspace}') + await user.click(elements.submitBtn()) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + field_name: [defaultComponentProps.options[1]], + }, + expect.anything() + ) + ) + }) + + test('fixed value remains after input field has been cleared', async () => { + const user = userEvent.setup() + + const onSubmit = jest.fn() + const defaultComponentPropsWithStaticOption = { + label: 'Input label', + name: 'field_name', + options: [ + { label: 'One', value: '1' }, + { label: 'Two', value: '2' }, + { label: 'Three', value: '3', isFixed: true }, + ], + } + const updatedProps = { + initialValues: { + field_name: [ + { label: 'One', value: '1' }, + { label: 'Two', value: '2' }, + { label: 'Three', value: '3', isFixed: true }, + ], + }, + onSubmit, + componentProps: defaultComponentPropsWithStaticOption, + } + + renderComponent(updatedProps) + await userEvent.click(elements.autoComplete()) + await userEvent.click(screen.getByTitle('Clear')) + await user.click(elements.submitBtn()) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + field_name: [defaultComponentPropsWithStaticOption.options[2]], + }, + expect.anything() + ) + ) + }) +}) diff --git a/views/forms/ControlledMultiSelect/index.jsx b/views/forms/ControlledMultiSelect/index.jsx new file mode 100644 index 00000000..c2e30388 --- /dev/null +++ b/views/forms/ControlledMultiSelect/index.jsx @@ -0,0 +1,47 @@ +import React from 'react' + +import { Controller } from 'react-hook-form' + +import { MultiSelect } from '../MultiSelect' + +const ControlledMultiSelect = (props) => { + const onChange = (value, reason, field) => { + switch (reason) { + case 'clear': + value = field.value.filter(({ isFixed }) => isFixed) + + return field.onChange(value) + case 'removeOption': { + const optionToRemove = field.value.filter( + (prevOption) => + !value.find( + (currentOption) => currentOption.value === prevOption.value + ) + ) + if (!optionToRemove[0]?.isFixed) { + field.onChange(value) + } + break + } + default: + return field.onChange(value) + } + } + + return ( + ( + + )} + /> + ) +} + +export default ControlledMultiSelect diff --git a/views/forms/ControlledReactSelect/components.js b/views/forms/ControlledReactSelect/components.js new file mode 100644 index 00000000..fc5ea898 --- /dev/null +++ b/views/forms/ControlledReactSelect/components.js @@ -0,0 +1,49 @@ +import CancelIcon from '@mui/icons-material/Cancel' +import { Chip, MenuItem, Typography, TextField } from '@mui/material' + +export const components = { + MultiValue: (props) => ( + } + /> + ), + Option: (props) => ( + + {props.children} + + ), + NoOptionsMessage: (props) => ( + + {props.children} + + ), + Control: (props) => ( + + ), + Placeholder: (props) => ( + + {props.children} + + ), + SingleValue: (props) => ( + {props.children} + ), +} diff --git a/views/forms/ControlledReactSelect/index.jsx b/views/forms/ControlledReactSelect/index.jsx new file mode 100644 index 00000000..db20d9d4 --- /dev/null +++ b/views/forms/ControlledReactSelect/index.jsx @@ -0,0 +1,47 @@ +import { useContext } from 'react' + +import { useController } from 'react-hook-form' +import Select from 'react-select' + +import { components } from './components' +import { NotificationContext } from '../../contexts' + +const ControlledReactSelect = (props) => { + const { field } = useController(props) + const [, setNotification] = useContext(NotificationContext) + + const onChange = (options, actionMeta, field) => { + switch (actionMeta.action) { + case 'remove-value': + case 'pop-value': + if (actionMeta.removedValue.isFixed) { + setNotification({ + open: true, + message: `${actionMeta.removedValue.value} cannot be removed`, + }) + + return + } + break + case 'clear': + options = field.value.filter(({ isFixed }) => isFixed) + field.onChange(options) + + break + } + + field.onChange(options) + } + + return ( + + } + renderValue={(selected) => { + const EtcChip = + selected.length > 5 ? : <> + + return selected + .slice(0, 5) + .map((value) => ) + .concat([EtcChip]) + }} + onClose={onClose} + MenuProps={MenuProps} + fullWidth={false} + > + {options.map(({ label }) => { + return ( + + {label} + + ) + })} + + + + + + ) +} +export default DropdownCheckboxGroup diff --git a/views/forms/MultiSelect/MultiSelect.css b/views/forms/MultiSelect/MultiSelect.css new file mode 100644 index 00000000..970458ed --- /dev/null +++ b/views/forms/MultiSelect/MultiSelect.css @@ -0,0 +1,5 @@ +.MultiSelectActions { + width: 100%; + display: flex; + justify-content: space-between; +} diff --git a/views/forms/MultiSelect/MultiSelect.test.jsx b/views/forms/MultiSelect/MultiSelect.test.jsx new file mode 100644 index 00000000..6d6278ac --- /dev/null +++ b/views/forms/MultiSelect/MultiSelect.test.jsx @@ -0,0 +1,83 @@ +import React, { useState } from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import { MultiSelect } from '.' + +describe('Controlled Multi Select', () => { + const defaultComponentProps = { + label: 'Input label', + name: 'field_name', + options: [ + { label: 'One', value: '1' }, + { label: 'Two', value: '2' }, + { label: 'Three', value: '3' }, + ], + } + const defaultProps = { + initialValues: [], + onChange: () => {}, + componentProps: defaultComponentProps, + } + const elements = { + autoComplete: () => screen.getByRole('combobox', { name: 'Input label' }), + } + const FormWrapper = (props) => { + const [value, setValue] = useState(props.initialValues) + + return ( +
+ { + setValue(v) + props.onChange(v) + }} + {...props.componentProps} + /> + + ) + } + const renderComponent = (props = defaultProps) => { + render() + } + + test('allows selecting a new option', async () => { + const onChange = jest.fn() + const props = { ...defaultProps, onChange } + + renderComponent(props) + const textbox = elements.autoComplete() + await userEvent.type(textbox, 'o') + await userEvent.click(await screen.findByText('One')) + await userEvent.type(textbox, 't') + await userEvent.click(await screen.findByText('Two')) + + await waitFor(() => + expect(onChange).toHaveBeenLastCalledWith([ + defaultComponentProps.options[0], + defaultComponentProps.options[1], + ]) + ) + }) + + test('removing an existing option', async () => { + const onChange = jest.fn() + const props = { + ...defaultProps, + initialValues: [ + defaultComponentProps.options[1], + defaultComponentProps.options[2], + ], + onChange, + } + + renderComponent(props) + await userEvent.type(elements.autoComplete(), '{backspace}') + + await waitFor(() => + expect(onChange).toHaveBeenCalledWith([defaultComponentProps.options[1]]) + ) + }) +}) diff --git a/views/forms/MultiSelect/MultiSelectActions.jsx b/views/forms/MultiSelect/MultiSelectActions.jsx new file mode 100644 index 00000000..3e5483c3 --- /dev/null +++ b/views/forms/MultiSelect/MultiSelectActions.jsx @@ -0,0 +1,29 @@ +import { Paper, Button } from '@mui/material' + +import './MultiSelect.css' + +const MultiSelectFooterActions = ({ + children, + onClear, + onSelectAll, + ...rest +}) => { + // Prevent input blur which triggers closing the menu + const preventClosingThePopup = (e) => e.preventDefault() + + return ( + + {children} +
+ + +
+
+ ) +} + +export default MultiSelectFooterActions diff --git a/views/forms/MultiSelect/index.jsx b/views/forms/MultiSelect/index.jsx new file mode 100644 index 00000000..bd3ecfe5 --- /dev/null +++ b/views/forms/MultiSelect/index.jsx @@ -0,0 +1,59 @@ +import React from 'react' + +import { Autocomplete, Chip, TextField } from '@mui/material' + +import MultiSelectFooterActions from './MultiSelectActions' + +export const MultiSelect = (props) => { + const { field, fieldState } = props + + return ( + option.isFixed} + isOptionEqualToValue={(option, value) => option.value === value.value} + multiple + onChange={(_, data, reason) => props.onChange(data, reason, field)} + options={props.options} + renderTags={(tagValue, getTagProps) => + tagValue.map((option, index) => ( + + )) + } + renderInput={(params) => ( + + {props.startAdornment} + {params.InputProps.startAdornment} + + ), + }} + placeholder={props.placeholder} + /> + )} + value={props.value || field.value} + sx={props.sx || {}} + componentsProps={{ + paper: { + onClear: props.onClear || {}, + onSelectAll: props.onSelectAll || {}, + }, + }} + PaperComponent={props.displayActions ? MultiSelectFooterActions : null} + /> + ) +} diff --git a/views/forms/ParticipantsSearchForm/ParticipantsSearchForm.css b/views/forms/ParticipantsSearchForm/ParticipantsSearchForm.css new file mode 100644 index 00000000..afa5a1cb --- /dev/null +++ b/views/forms/ParticipantsSearchForm/ParticipantsSearchForm.css @@ -0,0 +1,12 @@ +.ParticipantsSearchForm { + display: flex; + gap: 16px; + align-items: center; +} + +@media screen and (max-width: 1100px) { + .ParticipantsSearchForm { + flex-direction: column; + align-items: normal; + } +} diff --git a/views/forms/ParticipantsSearchForm/index.jsx b/views/forms/ParticipantsSearchForm/index.jsx new file mode 100644 index 00000000..d27ea47d --- /dev/null +++ b/views/forms/ParticipantsSearchForm/index.jsx @@ -0,0 +1,100 @@ +import React, { useEffect } from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import { Search } from '@mui/icons-material' +import { InputAdornment, MenuItem, Button, CardActions } from '@mui/material' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import SearchSelect from '../../components/SearchSelect' +import ControlledMultiSelect from '../ControlledMultiSelect' +import ControlledSelectInput from '../ControlledSelect' + +import './ParticipantsSearchForm.css' + +const schema = yup.object({ + participants: yup.array(), + studies: yup.array(), + status: yup.number(), +}) + +const ParticipantsSearchForm = ({ initialValues, onSubmit, allOptions }) => { + const { handleSubmit, control, watch, setValue, getValues } = useForm({ + defaultValues: initialValues, + mode: 'onChange', + resolver: yupResolver(schema), + }) + const formValues = getValues() + + const handleClear = () => setValue('studies', []) + const handleSelectAll = () => + setValue( + 'studies', + allOptions.studies.map(({ value }) => value) + ) + + useEffect(() => { + const subscription = watch((value) => onSubmit(value)) + + return () => subscription.unsubscribe() + }, [watch]) + return ( +
+
+ + + + } + sx={{ flexBasis: 1, flexGrow: 5 }} + /> + + + + + } + /> + + All + Active + Inactive + +
+ + ) +} + +export default ParticipantsSearchForm diff --git a/views/forms/PredictiveInputSelect/index.jsx b/views/forms/PredictiveInputSelect/index.jsx new file mode 100644 index 00000000..0f1aead2 --- /dev/null +++ b/views/forms/PredictiveInputSelect/index.jsx @@ -0,0 +1,48 @@ +import React from 'react' + +import { Autocomplete, TextField } from '@mui/material' +import { useController } from 'react-hook-form' + +const PredictiveInputSelect = ({ control, options, name, ...rest }) => { + const { field } = useController({ name, control }) + + return ( + { + if (rest.onBlur) rest.onBlur(e) + + field.onBlur(e) + }} + onChange={(e, selectedValue) => { + if (rest.onChange) rest.onChange(e) + + field.onChange(selectedValue) + }} + renderInput={(params) => ( + { + if (rest.onChange) rest.onChange(e) + + field.onChange(e.target.value) + }} + onBlur={(e) => { + if (rest.onBlur) rest.onBlur(e) + + field.onBlur(e) + }} + /> + )} + /> + ) +} + +export default PredictiveInputSelect diff --git a/views/forms/RegisterForm/RegisterForm.test.jsx b/views/forms/RegisterForm/RegisterForm.test.jsx new file mode 100644 index 00000000..458886c4 --- /dev/null +++ b/views/forms/RegisterForm/RegisterForm.test.jsx @@ -0,0 +1,103 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import RegisterForm from '.' + +describe('Register Form', () => { + const defaultProps = { + initialValues: { + username: '', + password: '', + confirmPassword: '', + fullName: '', + mail: '', + }, + onSubmit: () => {}, + } + const elements = { + usernameField: () => screen.getByRole('textbox', { name: 'Username' }), + passwordField: () => screen.getByTestId('pw'), + confirmPasswordField: () => screen.getByTestId('confirm-pw'), + fullNameField: () => screen.getByRole('textbox', { name: 'Full Name' }), + emailField: () => screen.getByRole('textbox', { name: 'Email' }), + signUpBtn: () => screen.getByText('Sign up'), + } + const renderForm = (props = defaultProps) => { + render() + } + + test('calls the onSubmit prop when the form is submitted with valid data', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.usernameField(), 'myUsername') + await user.type(elements.passwordField(), 'myPassword') + await user.type(elements.confirmPasswordField(), 'myPassword') + await user.type(elements.fullNameField(), 'Joe Schmoe') + await user.type(elements.emailField(), 'joe@example.test') + await user.click(elements.signUpBtn()) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + username: 'myUsername', + password: 'myPassword', + confirmPassword: 'myPassword', + fullName: 'Joe Schmoe', + mail: 'joe@example.test', + }, + expect.anything() + ) + ) + }) + + test('displays errors and does not submit the form with invalid data', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.usernameField(), 'myUsername') + await user.type(elements.passwordField(), 'nope') + await user.type(elements.confirmPasswordField(), 'nope') + await user.type(elements.fullNameField(), 'Joe Schmoe') + await user.type(elements.emailField(), 'not-an-email') + await user.click(elements.signUpBtn()) + + await waitFor(() => + expect( + screen.getByText('password must be at least 8 characters') + ).toBeInTheDocument() + ) + expect(screen.getByText('mail must be a valid email')).toBeInTheDocument() + + expect(onSubmit).not.toHaveBeenCalled() + }) + + test('displays errors and does not submit the form with unmatched passwords', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.usernameField(), 'myUsername') + await user.type(elements.passwordField(), 'thisIsMyPassword') + await user.type( + elements.confirmPasswordField(), + 'thisIsMyConfirmedPassword' + ) + await user.type(elements.fullNameField(), 'Joe Schmoe') + await user.type(elements.emailField(), 'joe@example.test') + await user.click(elements.signUpBtn()) + + await waitFor(() => + expect(screen.getByText('passwords do not match')).toBeInTheDocument() + ) + + expect(onSubmit).not.toHaveBeenCalled() + }) +}) diff --git a/views/forms/RegisterForm/index.jsx b/views/forms/RegisterForm/index.jsx new file mode 100644 index 00000000..067ed52b --- /dev/null +++ b/views/forms/RegisterForm/index.jsx @@ -0,0 +1,93 @@ +import { yupResolver } from '@hookform/resolvers/yup' +import { Button } from '@mui/material' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import TextInput from '../TextInput' + +const schema = yup.object({ + username: yup.string().required(), + password: yup.string().min(8).required(), + confirmPassword: yup + .string() + .oneOf([yup.ref('password'), null], 'passwords do not match'), + fullName: yup.string().required(), + mail: yup.string().email().required(), +}) + +const RegistrationForm = ({ initialValues, onSubmit }) => { + const { + handleSubmit, + control, + formState: { errors }, + } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(schema), + }) + + return ( +
+ + + + + + + + + ) +} + +export default RegistrationForm diff --git a/views/forms/ResetPasswordForm/ResetPasswordForm.test.jsx b/views/forms/ResetPasswordForm/ResetPasswordForm.test.jsx new file mode 100644 index 00000000..0cfdb82d --- /dev/null +++ b/views/forms/ResetPasswordForm/ResetPasswordForm.test.jsx @@ -0,0 +1,109 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import ResetPasswordForm from '.' + +describe('Reset Password Form', () => { + const defaultProps = { + initialValues: { + username: '', + password: '', + confirmPassword: '', + reset_key: '', + }, + onCancel: () => {}, + onSubmit: () => {}, + } + const elements = { + usernameField: () => screen.getByRole('textbox', { name: 'Username' }), + passwordField: () => screen.getByTestId('pw'), + confirmPasswordField: () => screen.getByTestId('confirm-pw'), + resetKeyField: () => screen.getByRole('textbox', { name: 'Reset Key' }), + cancelBtn: () => screen.getByText('Cancel'), + submitBtn: () => screen.getByText('Submit'), + } + const renderForm = (props = defaultProps) => { + render() + } + + test('calls the onSubmit prop when the form is submitted with valid data', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.usernameField(), 'myUsername') + await user.type(elements.passwordField(), 'myPassword') + await user.type(elements.confirmPasswordField(), 'myPassword') + await user.type(elements.resetKeyField(), 'myResetKey') + await user.click(elements.submitBtn()) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + username: 'myUsername', + password: 'myPassword', + confirmPassword: 'myPassword', + reset_key: 'myResetKey', + }, + expect.anything() + ) + ) + }) + + test('displays errors and does not submit the form with invalid data', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.usernameField(), 'myUsername') + await user.type(elements.passwordField(), 'nope') + await user.type(elements.confirmPasswordField(), 'nope') + await user.type(elements.resetKeyField(), 'myResetKey') + await user.click(elements.submitBtn()) + + await waitFor(() => + expect( + screen.getByText('password must be at least 8 characters') + ).toBeInTheDocument() + ) + + expect(onSubmit).not.toHaveBeenCalled() + }) + + test('displays errors and does not submit the form with unmatched passwords', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.usernameField(), 'myUsername') + await user.type(elements.passwordField(), 'thisIsMyPassword') + await user.type( + elements.confirmPasswordField(), + 'thisIsMyConfirmedPassword' + ) + await user.type(elements.resetKeyField(), 'myResetKey') + await user.click(elements.submitBtn()) + + await waitFor(() => + expect(screen.getByText('passwords do not match')).toBeInTheDocument() + ) + + expect(onSubmit).not.toHaveBeenCalled() + }) + + test('calls the onCancel prop when the cancel button is clicked', async () => { + const user = userEvent.setup() + const onCancel = jest.fn() + const props = { ...defaultProps, onCancel } + + renderForm(props) + await user.click(elements.cancelBtn()) + + await waitFor(() => expect(onCancel).toHaveBeenCalledWith()) + }) +}) diff --git a/views/forms/ResetPasswordForm/index.jsx b/views/forms/ResetPasswordForm/index.jsx new file mode 100644 index 00000000..c7bd682e --- /dev/null +++ b/views/forms/ResetPasswordForm/index.jsx @@ -0,0 +1,81 @@ +import { yupResolver } from '@hookform/resolvers/yup' +import { Button } from '@mui/material' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import TextInput from '../TextInput' + +const schema = yup.object({ + username: yup.string().required(), + password: yup.string().required().min(8), + confirmPassword: yup + .string() + .oneOf([yup.ref('password'), null], 'passwords do not match'), + reset_key: yup.string().required(), +}) + +const ResetPasswordForm = ({ initialValues, onCancel, onSubmit }) => { + const { + handleSubmit, + control, + formState: { errors }, + } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(schema), + }) + return ( +
+ + + + + +
+ + +
+ + ) +} + +export default ResetPasswordForm diff --git a/views/forms/SelectConfigurationsForm/SelectConfigurationsForm.test.jsx b/views/forms/SelectConfigurationsForm/SelectConfigurationsForm.test.jsx new file mode 100644 index 00000000..cb79bdda --- /dev/null +++ b/views/forms/SelectConfigurationsForm/SelectConfigurationsForm.test.jsx @@ -0,0 +1,57 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import SelectConfigurationForm from '.' +import { createConfiguration } from '../../../test/fixtures' + +describe(SelectConfigurationForm, () => { + const defaultInitialValues = { + config: '1', + } + const defaultProps = { + initialValues: defaultInitialValues, + configurations: [], + onSubmit: () => {}, + } + + const elements = { + configurationsDropdown: () => + screen.getByRole('combobox', { name: 'Select configuration' }), + getFilterElement: (name) => screen.getByText(name), + } + const renderForm = (props = defaultProps) => { + return render() + } + + test('calls the onSubmit prop when the form is submitted with valid data', async () => { + const onSubmit = jest.fn() + const configurationsOptions = [ + createConfiguration({ name: 'first config' }), + createConfiguration({ _id: '2', name: 'second config' }), + createConfiguration({ _id: '3', name: 'third configuration' }), + ] + + renderForm({ + ...defaultProps, + configurations: configurationsOptions, + onSubmit, + }) + + const configurations = elements.configurationsDropdown() + + await userEvent.click(configurations) + await userEvent.click(elements.getFilterElement('third configuration')) + await userEvent.keyboard('{Escape}') + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + config: '3', + }, + expect.anything() + ) + ) + }) +}) diff --git a/views/forms/SelectConfigurationsForm/index.jsx b/views/forms/SelectConfigurationsForm/index.jsx new file mode 100644 index 00000000..20eacaca --- /dev/null +++ b/views/forms/SelectConfigurationsForm/index.jsx @@ -0,0 +1,41 @@ +import React from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import { MenuItem } from '@mui/material' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import ControlledSelect from '../ControlledSelect' + +const schema = yup.object({ + config: yup.string().required(), +}) +const SelectConfigurationsForm = ({ + configurations, + onSubmit, + initialValues, +}) => { + const { handleSubmit, control } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(schema), + }) + + return ( +
+ + {configurations.map((configuration) => ( + + {configuration.name} + + ))} + + + ) +} + +export default SelectConfigurationsForm diff --git a/views/forms/ShareConfigurationForm/index.jsx b/views/forms/ShareConfigurationForm/index.jsx new file mode 100644 index 00000000..99294644 --- /dev/null +++ b/views/forms/ShareConfigurationForm/index.jsx @@ -0,0 +1,60 @@ +import React, { useEffect } from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import { + Button, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Typography, +} from '@mui/material' +import { useForm } from 'react-hook-form' +import { object, array } from 'yup' + +import ControlledMultiSelect from '../ControlledMultiSelect' + +const schema = object().shape({ + readers: array(), +}) + +const ShareConfigurationForm = ({ + onClose, + onSubmit, + open, + options, + title, + initialValues, +}) => { + const { control, reset, handleSubmit } = useForm({ + resolver: yupResolver(schema), + }) + useEffect(() => { + reset(initialValues) + }, [initialValues]) + + return ( + + + {title} + + +
+ + + , + + + +
+
+ ) +} + +export default ShareConfigurationForm diff --git a/views/forms/SignInForm/SignInForm.css b/views/forms/SignInForm/SignInForm.css new file mode 100644 index 00000000..f7e4bf53 --- /dev/null +++ b/views/forms/SignInForm/SignInForm.css @@ -0,0 +1,7 @@ +.SignInForm_submitBtnContainer { + margin-top: 8px; +} +.SignInForm_button { + border-radius: 8px; + text-transform: none; +} diff --git a/views/forms/SignInForm/SignInForm.test.jsx b/views/forms/SignInForm/SignInForm.test.jsx new file mode 100644 index 00000000..8de48a6d --- /dev/null +++ b/views/forms/SignInForm/SignInForm.test.jsx @@ -0,0 +1,53 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import SignInForm from '.' + +describe('Sign In Form', () => { + const defaultProps = { + initialValues: { + username: '', + password: '', + }, + onSubmit: () => {}, + } + const elements = { + usernameField: () => screen.getByRole('textbox', { name: 'Username' }), + passwordField: () => screen.getByTestId('pw'), + submitBtn: () => screen.getByText('Sign in'), + } + const renderForm = (props = defaultProps) => { + render() + } + + test('renders the text inputs and submit button', () => { + renderForm() + + expect(elements.usernameField()).toBeInTheDocument() + expect(elements.passwordField()).toBeInTheDocument() + expect(elements.submitBtn()).toBeInTheDocument() + }) + + test('calls the onSubmit prop when the form is submitted', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.usernameField(), 'myUsername') + await user.type(elements.passwordField(), 'myPassword') + await user.click(elements.submitBtn()) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + username: 'myUsername', + password: 'myPassword', + }, + expect.anything() + ) + ) + }) +}) diff --git a/views/forms/SignInForm/index.jsx b/views/forms/SignInForm/index.jsx new file mode 100644 index 00000000..81a187f1 --- /dev/null +++ b/views/forms/SignInForm/index.jsx @@ -0,0 +1,66 @@ +import React from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import { Button } from '@mui/material' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import TextInput from '../TextInput' +import './SignInForm.css' + +const schema = yup.object({ + username: yup.string().required(), + password: yup.string().min(8).required(), +}) + +const SignInForm = ({ initialValues, onSubmit }) => { + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(schema), + }) + + return ( +
+ + +
+ +
+ + ) +} + +export default SignInForm diff --git a/views/forms/TextInput/index.jsx b/views/forms/TextInput/index.jsx new file mode 100644 index 00000000..4f9b0df3 --- /dev/null +++ b/views/forms/TextInput/index.jsx @@ -0,0 +1,36 @@ +import React from 'react' + +import TextField from '@mui/material/TextField' +import { useController } from 'react-hook-form' + +const TextInput = (props) => { + const { errors } = props + const { field } = useController(props) + + return ( + { + props.onChange?.(e) + + field.onChange(e) + }} + /> + ) +} + +export default TextInput diff --git a/views/forms/TextInputTopLabel/TextInputTopLabel.test.jsx b/views/forms/TextInputTopLabel/TextInputTopLabel.test.jsx new file mode 100644 index 00000000..f7ff2154 --- /dev/null +++ b/views/forms/TextInputTopLabel/TextInputTopLabel.test.jsx @@ -0,0 +1,40 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' + +import TextInputTopLabel from '.' + +jest.mock('react-hook-form', () => ({ + ...jest.requireActual('react-hook-form'), + useController: jest.fn().mockReturnValue({ + field: { value: 'testValue', onChange: jest.fn() }, + formState: { + errors: { 'text-field': { message: 'This field is required' } }, + }, + }), +})) + +describe('TextInputTopLabel', () => { + test('renders TextInputTopLabel component', () => { + render() + + const inputElement = screen.getByRole('textbox', { + name: 'text-field-label', + }) + + expect(inputElement).toBeInTheDocument() + }) + + test('renders TextInputTopLabel component with error message', () => { + render() + + const inputElement = screen.getByRole('textbox', { + name: 'text-field-label', + }) + const errorMessageElement = screen.getByLabelText('text-field-error') + + expect(inputElement).toBeInTheDocument() + expect(errorMessageElement).toBeInTheDocument() + expect(errorMessageElement).toHaveTextContent('This field is required') + }) +}) diff --git a/views/forms/TextInputTopLabel/index.jsx b/views/forms/TextInputTopLabel/index.jsx new file mode 100644 index 00000000..d35020ef --- /dev/null +++ b/views/forms/TextInputTopLabel/index.jsx @@ -0,0 +1,58 @@ +import React from 'react' + +import { InputLabel, FormHelperText, OutlinedInput } from '@mui/material/' +import { useController } from 'react-hook-form' + +import { lineHeight, fontSize, borderRadius } from '../../../constants' + +const TextInputTopLabel = (props) => { + const { + field, + formState: { errors }, + } = useController(props) + + return ( + <> + + {props.label} + + + {!!errors[props.name] && ( + + {errors[props.name].message} + + )} + + ) +} + +export default TextInputTopLabel diff --git a/views/forms/UserPriviligeFormFields/UserPriviligeFields.css b/views/forms/UserPriviligeFormFields/UserPriviligeFields.css new file mode 100644 index 00000000..c34f0614 --- /dev/null +++ b/views/forms/UserPriviligeFormFields/UserPriviligeFields.css @@ -0,0 +1,6 @@ +.subheader { + padding: '0px'; +} +.divider { + border-bottom: '1px solid #d3d3d3'; +} diff --git a/views/forms/UserPriviligeFormFields/index.jsx b/views/forms/UserPriviligeFormFields/index.jsx new file mode 100644 index 00000000..f514df2b --- /dev/null +++ b/views/forms/UserPriviligeFormFields/index.jsx @@ -0,0 +1,62 @@ +import { Button, DialogActions, MenuItem, NoSsr } from '@mui/material' +import Subheader from '@mui/material/ListSubheader' + +import { ROLE_OPTIONS } from '../../../constants' +import Modal from '../../components/Modal' +import ControlledReactSelect from '../ControlledReactSelect' +import { components } from '../ControlledReactSelect/components' +import ControlledSelectInput from '../ControlledSelect' +import './UserPriviligeFields.css' + +const UserPriviligeFields = ({ + currentRowIndex, + control, + options, + open, + onClose, + onUpdateUser, +}) => { + return ( + + Membership Level + + {ROLE_OPTIONS.map(({ value, label }) => ( + + {label} + + ))} + +
+ Viewable Studies + + + +
+ + + + +
+ ) +} + +export default UserPriviligeFields diff --git a/views/forms/UserProfileForm/UserProfileForm.test.jsx b/views/forms/UserProfileForm/UserProfileForm.test.jsx new file mode 100644 index 00000000..d08c57d2 --- /dev/null +++ b/views/forms/UserProfileForm/UserProfileForm.test.jsx @@ -0,0 +1,83 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import UserProfileForm from '.' + +describe('User Profile Form', () => { + const pngFile = new File(['hello'], 'hello.png', { type: 'image/png' }) + const defaultProps = { + initialValues: { + display_name: '', + mail: 'myEmail@example.test', + title: '', + iconFile: pngFile, + }, + onCancel: () => {}, + onSubmit: () => {}, + } + const elements = { + displayNameField: () => screen.getByRole('textbox', { name: 'Full name' }), + emailField: () => screen.getByRole('textbox', { name: 'Email' }), + titleField: () => + screen.getByRole('textbox', { name: 'Title and institution (optional)' }), + iconField: () => screen.getByTestId('icon-input'), + submitBtn: () => screen.getByText('Save changes'), + } + const renderForm = (props = defaultProps) => { + render() + } + + test('email field should be disabled', () => { + renderForm({ ...defaultProps }) + + expect(elements.emailField()).toBeDisabled() + }) + + test('calls the onSubmit prop when the form is submitted with valid data', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { + ...defaultProps, + onSubmit, + } + + renderForm(props) + await user.type(elements.displayNameField(), 'My Full Name') + await user.type(elements.titleField(), 'My Title') + await user.upload(elements.iconField(), pngFile) + await user.click(elements.submitBtn()) + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith( + { + display_name: 'My Full Name', + mail: 'myEmail@example.test', + title: 'My Title', + iconFile: pngFile, + }, + expect.anything() + ) + ) + }) + + test('displays errors and does not submit the form with invalid data', async () => { + const user = userEvent.setup() + const onSubmit = jest.fn() + const props = { ...defaultProps, onSubmit } + + renderForm(props) + await user.type(elements.displayNameField(), 'My name') + await user.clear(elements.displayNameField()) + await user.click(elements.submitBtn()) + + await waitFor(() => { + expect( + screen.getByText('display_name is a required field') + ).toBeInTheDocument() + }) + + expect(onSubmit).not.toHaveBeenCalled() + }) +}) diff --git a/views/forms/UserProfileForm/UserProfileFormFields.css b/views/forms/UserProfileForm/UserProfileFormFields.css new file mode 100644 index 00000000..9af28b52 --- /dev/null +++ b/views/forms/UserProfileForm/UserProfileFormFields.css @@ -0,0 +1,3 @@ +.UserProfileFormInputs_box { + max-width: 502px; +} diff --git a/views/forms/UserProfileForm/UserProfileFormFields.jsx b/views/forms/UserProfileForm/UserProfileFormFields.jsx new file mode 100644 index 00000000..13db7c8c --- /dev/null +++ b/views/forms/UserProfileForm/UserProfileFormFields.jsx @@ -0,0 +1,46 @@ +import React from 'react' + +import TextInputTopLabel from '../TextInputTopLabel' + +import './UserProfileFormFields.css' + +const UserProfileFormFields = ({ control }) => { + return ( +
+ + + +
+ ) +} + +export default UserProfileFormFields diff --git a/views/forms/UserProfileForm/UserProfileImage.css b/views/forms/UserProfileForm/UserProfileImage.css new file mode 100644 index 00000000..b958dafd --- /dev/null +++ b/views/forms/UserProfileForm/UserProfileImage.css @@ -0,0 +1,15 @@ +.UserProfileForm_profileImage { + display: flex; + align-items: center; + padding: 24px 0px; +} +.UserProfileFormFileUploadInput { + display: none; +} +.UserProfileFormAlert { + max-width: 502px; + padding-bottom: 24px; +} +.UserProfileFormFileInfo { + padding-right: 14px; +} diff --git a/views/forms/UserProfileForm/UserProfileImage.jsx b/views/forms/UserProfileForm/UserProfileImage.jsx new file mode 100644 index 00000000..d99af909 --- /dev/null +++ b/views/forms/UserProfileForm/UserProfileImage.jsx @@ -0,0 +1,100 @@ +import React from 'react' + +import { Delete, Image } from '@mui/icons-material' +import { Avatar, Typography, Alert, IconButton } from '@mui/material' +import { Controller } from 'react-hook-form' + +import { fontSize } from '../../../constants' + +import './UserProfileImage.css' + +const UserProfileImage = ({ + control, + iconFileName, + fileInputRef, + onRemoveIcon, + iconSrc, +}) => { + return ( + <> +
+ + + + Upload Profile Photo + + { + return ( + { + fileInputRef.current = inputRef + field.ref(inputRef) + }} + onChange={(event) => { + const { files } = event.target + if (files[0]) { + field.onChange(files[0]) + } + }} + /> + ) + }} + /> +
+ {iconFileName && ( +
+ onRemoveIcon()} + sx={{ color: 'text.secondary' }} + > + + + } + sx={{ + display: 'flex', + flexDirection: 'row-reverse', + justifyContent: 'space-between', + alignItems: 'center', + color: 'black.A100', + }} + > + + + + {iconFileName} + +
+ )} + + ) +} + +export default UserProfileImage diff --git a/views/forms/UserProfileForm/UserProfileImage.test.jsx b/views/forms/UserProfileForm/UserProfileImage.test.jsx new file mode 100644 index 00000000..c62c9f14 --- /dev/null +++ b/views/forms/UserProfileForm/UserProfileImage.test.jsx @@ -0,0 +1,31 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' + +import UserProfileImage from './UserProfileImage' + +jest.mock('react-hook-form') + +describe('UserProfileImage', () => { + test('renders profile image', () => { + render( + + ) + const iconFileImage = screen.getByAltText('User avatar') + const iconFileName = screen.getByText('myProfileImage.jpeg') + + expect(iconFileImage).toBeInTheDocument() + expect(iconFileName).toBeInTheDocument() + }) + + test('renders an icon when no profile image', () => { + render() + const profileIcon = screen.getByTestId('PersonIcon') + + expect(profileIcon).toBeInTheDocument() + }) +}) diff --git a/views/forms/UserProfileForm/index.jsx b/views/forms/UserProfileForm/index.jsx new file mode 100644 index 00000000..6e4566c7 --- /dev/null +++ b/views/forms/UserProfileForm/index.jsx @@ -0,0 +1,82 @@ +import React, { useEffect, useRef, useState } from 'react' + +import { yupResolver } from '@hookform/resolvers/yup' +import { Button } from '@mui/material' +import { useForm } from 'react-hook-form' +import * as yup from 'yup' + +import UserProfileFormFields from './UserProfileFormFields' +import UserProfileImage from './UserProfileImage' +import { borderRadius } from '../../../constants' +import { FileModel } from '../../models' + +const schema = yup.object({ + company: yup.string(), + department: yup.string(), + display_name: yup.string().required(), + icon: yup.string(), + mail: yup.string().email(), + title: yup.string(), +}) + +const UserProfileForm = ({ initialValues, onSubmit }) => { + const { handleSubmit, control, watch, setValue } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(schema), + mode: 'onChange', + }) + const fileInput = useRef() + const iconFile = watch('iconFile') + const [iconSrc, setIconSrc] = useState() + const [iconName, setIconName] = useState() + + useEffect(() => { + if (iconFile) { + setIconName(iconFile.name) + FileModel.toDataURL(iconFile).then(setIconSrc) + } else { + setIconSrc(undefined) + } + }, [iconFile]) + + const onRemoveIcon = () => { + setValue('iconFileName', '') + setValue('iconFile', null) + setIconName('') + + fileInput.current.value = '' + } + return ( + <> +
+ + +
+ +
+ + + ) +} + +export default UserProfileForm diff --git a/views/forms/UserResetKeyFormFields/UserResetKeyFields.css b/views/forms/UserResetKeyFormFields/UserResetKeyFields.css new file mode 100644 index 00000000..1b62bd7a --- /dev/null +++ b/views/forms/UserResetKeyFormFields/UserResetKeyFields.css @@ -0,0 +1,3 @@ +.subheader { + padding: '0px'; +} diff --git a/views/forms/UserResetKeyFormFields/index.jsx b/views/forms/UserResetKeyFormFields/index.jsx new file mode 100644 index 00000000..f23731ef --- /dev/null +++ b/views/forms/UserResetKeyFormFields/index.jsx @@ -0,0 +1,19 @@ +import Subheader from '@mui/material/ListSubheader' + +import Modal from '../../components/Modal' +import './UserResetKeyFields.css' + +const UserResetKeyFields = ({ open, onClose, resetKey }) => { + return ( + + {resetKey} + + ) +} + +export default UserResetKeyFields diff --git a/views/hoc/AuthenticatedRoute.jsx b/views/hoc/AuthenticatedRoute.jsx new file mode 100644 index 00000000..606d9c35 --- /dev/null +++ b/views/hoc/AuthenticatedRoute.jsx @@ -0,0 +1,29 @@ +import React, { useContext, useEffect } from 'react' + +import { useNavigate } from 'react-router-dom' + +import api from '../api' +import { AuthContext } from '../contexts/AuthContext' +import { routes } from '../routes/routes' + +const AuthenticatedRoute = ({ children }) => { + const navigate = useNavigate() + const [user, setUser] = useContext(AuthContext) + + const fetchUser = async () => { + try { + const currentUser = await api.auth.me() + setUser(currentUser) + } catch { + navigate(routes.signin) + } + } + + useEffect(() => { + if (!user) fetchUser() + }, []) + + return user ? children :
Loading...
+} + +export default AuthenticatedRoute diff --git a/views/hooks/useArrayFormFields.jsx b/views/hooks/useArrayFormFields.jsx new file mode 100644 index 00000000..f8d6c927 --- /dev/null +++ b/views/hooks/useArrayFormFields.jsx @@ -0,0 +1,16 @@ +import { useFieldArray } from 'react-hook-form' + +function useArrayFormFields({ control, name, defaultFieldValue }) { + const { fields, append, remove } = useFieldArray({ control, name }) + const addNewField = (fieldValues) => append(fieldValues || defaultFieldValue) + + const removeField = (fieldIndex) => remove(fieldIndex) + + return { + fields, + addNewField, + removeField, + } +} + +export default useArrayFormFields diff --git a/views/hooks/useChartsList.jsx b/views/hooks/useChartsList.jsx new file mode 100644 index 00000000..506a0835 --- /dev/null +++ b/views/hooks/useChartsList.jsx @@ -0,0 +1,173 @@ +import { useState, useEffect } from 'react' + +import { useForm } from 'react-hook-form' +import { useOutletContext } from 'react-router-dom' + +import useTableSort from './useTableSort' +import api from '../api' + +const NULL_CHART = {} +const title = 'title' + +export default function useChartsList() { + const { setNotification, setUser, user, users } = useOutletContext() + const { onSort, sortDirection, sortBy } = useTableSort(title) + + const { uid, favoriteCharts } = user + const favoriteChartsSet = new Set(favoriteCharts) + + const [chartToShare, setChartToShare] = useState(NULL_CHART) + const [chartList, setChartList] = useState([]) + const [sharedWithOptions, setSharedWithOptions] = useState([]) + + const { + handleSubmit, + control: shareFormControl, + reset, + watch, + getValues, + } = useForm({ + defaultValues: { + chart_id: chartToShare._id, + sharedWith: chartToShare.sharedWith || [], + }, + }) + const [shareFormValues, setShareFormValues] = useState(getValues()) + + useEffect(() => { + const subscription = watch((value) => { + setShareFormValues(value) + }) + + return () => subscription.unsubscribe() + }, [watch, setShareFormValues]) + + const closeDialog = () => setChartToShare(NULL_CHART) + const onShare = (chart) => { + setChartToShare(chart) + reset({ + chart_id: chart._id, + sharedWith: chart.sharedWith, + }) + } + const clearSelectedUsers = () => { + reset({ + chart_id: chartToShare._id, + sharedWith: [], + }) + } + const selectAllUsers = () => { + reset({ + chart_id: chartToShare._id, + sharedWith: sharedWithOptions.map(({ value }) => value), + }) + } + const shareWithUsers = handleSubmit(async ({ chart_id, sharedWith }) => { + try { + await api.charts.chartsShare.create(chart_id, sharedWith) + + const updatedChart = { ...chartToShare, sharedWith } + const updatedChartList = chartList.map((chart) => + chart._id === updatedChart._id ? updatedChart : chart + ) + + setChartList(updatedChartList) + setChartToShare(NULL_CHART) + setNotification({ open: true, message: 'Shared chart with user' }) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + }) + const onDelete = async (chart) => { + try { + await api.charts.chart.destroy(chart._id) + + await loadCharts() + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + const onDuplicate = async (chart) => { + try { + await api.charts.chartsDuplicate.create(chart._id) + + await loadCharts() + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + const onFavorite = async (chart) => { + try { + const isChartInSet = favoriteChartsSet.has(chart._id) + + if (isChartInSet) { + favoriteChartsSet.delete(chart._id) + } else { + favoriteChartsSet.add(chart._id) + } + + const updatedUser = await api.users.update(uid, { + ...user, + favoriteCharts: Array.from(favoriteChartsSet), + }) + + setUser(updatedUser) + + await loadCharts() + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + const loadCharts = async (queryParams) => { + try { + const params = { + ...(queryParams ? queryParams : {}), + ...(sortBy ? { sortBy } : {}), + ...(sortDirection ? { sortDirection } : {}), + } + const data = await api.charts.chart.all(params) + + setChartList(data) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + const handleSearch = async (formData) => await loadCharts(formData) + + useEffect(() => { + loadCharts() + }, [sortBy, sortDirection]) + + useEffect(() => { + const apiUsernames = users + .filter(({ uid }) => uid !== user.uid) + .map(({ uid, display_name }) => ({ + value: uid, + label: display_name, + })) + + setSharedWithOptions(apiUsernames) + }, [users]) + + return { + charts: chartList, + chartToShare, + closeDialog, + handleSearch, + onFavorite, + onShare, + onSort, + onDelete, + onDuplicate, + shareWithUsers, + sortDirection, + sortBy, + user, + sharedWithOptions, + shareFormControl, + shareFormValues, + selectAllUsers, + clearSelectedUsers, + } +} diff --git a/views/hooks/useParticipantsList.jsx b/views/hooks/useParticipantsList.jsx new file mode 100644 index 00000000..6c5ef173 --- /dev/null +++ b/views/hooks/useParticipantsList.jsx @@ -0,0 +1,122 @@ +import React, { useEffect, useState } from 'react' + +import { useOutletContext } from 'react-router-dom' + +import useTableSort from './useTableSort' +import api from '../api' + +const participant = 'participant' + +export default function useParticipantsList() { + const { user, setNotification, setUser } = useOutletContext() + const { onSort, sortDirection, sortBy } = useTableSort(participant) + const { uid, preferences, access } = user + + const [initialLoad, setInitialLoad] = useState(true) + const [loading, setLoading] = useState(true) + const [participants, setParticipants] = useState([]) + const [formFilters, setFormFilters] = useState({ + searchParticipants: [], + studies: [], + status: undefined, + }) + const [searchOptions, setSearchOptions] = useState({ + participants: [], + studies: access.map((study) => ({ label: study, value: study })), + }) + + const fetchParticipants = React.useCallback(async () => { + const sortParams = { + ...(sortBy ? { sortBy } : {}), + ...(sortDirection ? { sortDirection } : {}), + ...(formFilters.searchParticipants?.length + ? { + searchParticipants: normalizeSearchParticipants( + formFilters.searchParticipants + ), + } + : {}), + ...(formFilters?.status || formFilters?.status === 0 + ? { status: formFilters.status } + : {}), + ...(formFilters.studies?.length ? { studies: formFilters.studies } : {}), + } + + return await api.participants.all(sortParams) + }, [sortBy, sortDirection, formFilters]) + + const onStar = async (e) => { + try { + const { name, value } = e.target + const [key, study] = name.split('-') + const values = preferences[key] || {} + + if (values[study]) { + if (values[study].includes(value)) { + values[study] = values[study].filter( + (participant) => participant !== value + ) + } else values[study].push(value) + } else values[study] = [value] + const userAttributes = { + ...user, + preferences: { ...preferences, [key]: values }, + } + const updatedUser = await api.users.update(uid, userAttributes) + const participantsList = await fetchParticipants() + + setUser(updatedUser) + setParticipants(participantsList) + setNotification({ open: true, message: 'User updated successfully.' }) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + const handleSearch = async (formData) => { + const { studies, participants, status } = formData + + setFormFilters({ + searchParticipants: participants, + studies, + status, + }) + setLoading(true) + } + + const normalizeSearchParticipants = (searchParticipants) => + searchParticipants.map(({ value }) => value) + + useEffect(() => { + fetchParticipants().then((participantsList) => { + if (initialLoad) { + const dropDownOptions = participantsList.map( + ({ study, participant }) => ({ + value: `${participant}`, + label: `${participant} in ${study}`, + }) + ) + setSearchOptions((prevState) => ({ + ...prevState, + participants: dropDownOptions, + })) + setInitialLoad(false) + } + + setParticipants(participantsList) + setLoading(false) + }) + }, [fetchParticipants, setParticipants, setSearchOptions]) + + return { + formFilters, + handleSearch, + loading, + onStar, + onSort, + participants, + sortDirection, + sortBy, + searchOptions, + } +} diff --git a/views/hooks/useTableSort.jsx b/views/hooks/useTableSort.jsx new file mode 100644 index 00000000..93d9e5e9 --- /dev/null +++ b/views/hooks/useTableSort.jsx @@ -0,0 +1,19 @@ +import { useState } from 'react' + +import { SORT_DIRECTION } from '../../constants' + +export default function useTableSort(initialSortBy) { + const [sortDirection, setDirection] = useState(SORT_DIRECTION.ASC) + const [sortBy, setSortBy] = useState(initialSortBy) + + const onSort = (newSortBy, newSortDirection) => { + if (newSortBy) setSortBy(newSortBy) + if (newSortDirection) setDirection(newSortDirection) + } + + return { + onSort, + sortDirection, + sortBy, + } +} diff --git a/views/hooks/useTableSort.test.jsx b/views/hooks/useTableSort.test.jsx new file mode 100644 index 00000000..03e733f3 --- /dev/null +++ b/views/hooks/useTableSort.test.jsx @@ -0,0 +1,21 @@ +import { renderHook, act } from '@testing-library/react' + +import useTableSort from './useTableSort' + +describe('useTableSort', () => { + it('returns an initial sort direction and sort property', () => { + const { result } = renderHook(() => useTableSort('title')) + + expect(result.current.sortDirection).toBe('ASC') + expect(result.current.sortBy).toBe('title') + }) + it('updates the sort direction and property when onSort is called', () => { + const { result } = renderHook(() => useTableSort('title')) + act(() => { + result.current.onSort('date', 'DESC') + }) + + expect(result.current.sortDirection).toBe('DESC') + expect(result.current.sortBy).toBe('date') + }) +}) diff --git a/views/index.js b/views/index.js new file mode 100644 index 00000000..e8b4165a --- /dev/null +++ b/views/index.js @@ -0,0 +1,8 @@ +import React from 'react' + +import ReactDOM from 'react-dom/client' + +import App from './App' + +const root = ReactDOM.createRoot(document.getElementById('root')) +root.render() diff --git a/views/layouts/HeroLayout/HeroLayout.test.jsx b/views/layouts/HeroLayout/HeroLayout.test.jsx new file mode 100644 index 00000000..3f123457 --- /dev/null +++ b/views/layouts/HeroLayout/HeroLayout.test.jsx @@ -0,0 +1,32 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import HeroLayout from '.' + +describe('HeroLayout', () => { + beforeEach(() => { + render( + + + + ) + }) + + test('it renders the hero image', () => { + const heroImage = screen.getByRole('img') + + expect(heroImage).toBeInTheDocument() + }) + + test('it renders the hero content description and link', () => { + const heroContent = screen.getByText( + 'DPDash is a Deep/Digital Phenotyping Dashboard designed to manage and visualize multiple data streams coming in continuously over extended periods of time in individuals.' + ) + const learnMoreLink = screen.getByText('Learn More') + + expect(heroContent).toBeInTheDocument() + expect(learnMoreLink).toBeInTheDocument() + }) +}) diff --git a/views/layouts/HeroLayout/index.jsx b/views/layouts/HeroLayout/index.jsx new file mode 100644 index 00000000..278127d6 --- /dev/null +++ b/views/layouts/HeroLayout/index.jsx @@ -0,0 +1,87 @@ +import React from 'react' + +import { Box, Grid } from '@mui/material' +import { Outlet } from 'react-router-dom' + +import HeroCard from '../../components/HeroCard' +import HeroFooter from '../../components/HeroFooter' + +const HeroLayout = () => { + return ( + + + + + + + + + + + + + + ) +} + +export default HeroLayout diff --git a/views/layouts/MainLayout/MainLayout.css b/views/layouts/MainLayout/MainLayout.css new file mode 100644 index 00000000..6bc3a90c --- /dev/null +++ b/views/layouts/MainLayout/MainLayout.css @@ -0,0 +1,18 @@ +.MainLayout_container { + display: flex; +} + +.MainLayout_main { + flex-shrink: 0; + flex: 1; +} +@media screen and (max-width: 900px) { + .MainLayout_main { + margin-top: 50px; + } +} +@media screen and (min-width: 900px) { + .MainLayout_main { + margin-left: 253px; + } +} diff --git a/views/layouts/MainLayout/index.jsx b/views/layouts/MainLayout/index.jsx new file mode 100644 index 00000000..666e0272 --- /dev/null +++ b/views/layouts/MainLayout/index.jsx @@ -0,0 +1,82 @@ +import React, { useState, useEffect, useContext } from 'react' + +import { Menu } from '@mui/icons-material' +import { IconButton, useMediaQuery } from '@mui/material' +import { Outlet, useNavigate } from 'react-router-dom' + +import api from '../../api' +import Sidebar from '../../components/Sidebar' +import { AuthContext, NotificationContext } from '../../contexts' +import { routes } from '../../routes/routes' +import './MainLayout.css' + +const MainLayout = () => { + const isMobile = useMediaQuery('(max-width:900px)') + const [, setNotification] = useContext(NotificationContext) + const [user, setUser] = useContext(AuthContext) + const [users, setUsers] = useState([]) + const [drawerOpen, setDrawerOpen] = useState(false) + const navigate = useNavigate() + const fetchUsers = async () => { + try { + const usersList = await api.users.loadAll() + setUsers(usersList) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + const handleLogout = async () => { + try { + await api.auth.logout() + + setUser(null) + navigate(routes.signin) + } catch (error) { + alert(error.message) + } + } + const handleDrawerOpen = () => setDrawerOpen(!drawerOpen) + const handleClose = () => setDrawerOpen(false) + + useEffect(() => { + fetchUsers() + }, []) + + return ( +
+ {isMobile && ( + + + + )} + + +
+ +
+
+ ) +} +export default MainLayout diff --git a/views/models/ChartFiltersModel/index.js b/views/models/ChartFiltersModel/index.js new file mode 100644 index 00000000..29cc8146 --- /dev/null +++ b/views/models/ChartFiltersModel/index.js @@ -0,0 +1,33 @@ +const ChartFiltersModel = { + filtersToFormValues: (filters) => { + const filterKeys = Object.keys(filters) + + return filterKeys.reduce((formValues, filterKey) => { + formValues[filterKey] = Object.values(filters[filterKey]) + .filter(({ value }) => value === 1) + .map(({ label }) => label) + + return formValues + }, {}) + }, + formValuesToRequestFilters: (formValues, filters) => { + const filterCategories = Object.keys(filters) + + return filterCategories.reduce((selectedCategories, categoryFields) => { + selectedCategories[categoryFields] = Object.keys( + filters[categoryFields] + ).reduce((selectedFields, fieldKey) => { + selectedFields[fieldKey] = { + label: fieldKey, + value: formValues[categoryFields].includes(fieldKey) ? 1 : 0, + } + + return selectedFields + }, {}) + + return selectedCategories + }, {}) + }, +} + +export default ChartFiltersModel diff --git a/views/models/ChartModel/ChartModel.test.js b/views/models/ChartModel/ChartModel.test.js new file mode 100644 index 00000000..b7d08017 --- /dev/null +++ b/views/models/ChartModel/ChartModel.test.js @@ -0,0 +1,20 @@ +import ChartModel from '.' +import { createChart, createUser } from '../../../test/fixtures' + +describe('ChartModel', () => { + describe(ChartModel.isOwnedByUser, () => { + it('return true when the user owns the chart', () => { + const user = createUser({ uid: 'user' }) + const chart = createChart({ owner: user.uid }) + + expect(ChartModel.isOwnedByUser(chart, user)).toBe(true) + }) + + it('return false when the user does not own the chart', () => { + const user = createUser({ uid: 'user' }) + const chart = createChart({ owner: 'foo' }) + + expect(ChartModel.isOwnedByUser(chart, user)).toBe(false) + }) + }) +}) diff --git a/views/models/ChartModel/index.js b/views/models/ChartModel/index.js new file mode 100644 index 00000000..dd8b3d07 --- /dev/null +++ b/views/models/ChartModel/index.js @@ -0,0 +1,5 @@ +const ChartModel = { + isOwnedByUser: (chart, user) => chart.owner === user.uid, +} + +export default ChartModel diff --git a/views/models/FileModel/index.js b/views/models/FileModel/index.js new file mode 100644 index 00000000..f5641b05 --- /dev/null +++ b/views/models/FileModel/index.js @@ -0,0 +1,26 @@ +const FileModel = { + fromDataURL: (dateURL, fileName) => { + const arr = dateURL.split(','), + mime = arr[0].match(/:(.*?);/)[1], + bstr = atob(arr[arr.length - 1]), + u8arr = new Uint8Array(n) + let n = bstr.length + while (n--) { + u8arr[n] = bstr.charCodeAt(n) + } + return new File([u8arr], fileName, { type: mime }) + }, + toDataURL: async (file) => { + return new Promise((resolve, reject) => { + const reader = new FileReader() + + reader.readAsDataURL(file) + reader.onload = async (e) => { + resolve(e.target.result) + } + reader.onerror = (e) => reject(e) + }) + }, +} + +export default FileModel diff --git a/views/models/StudiesModel/index.js b/views/models/StudiesModel/index.js new file mode 100644 index 00000000..c924dd5c --- /dev/null +++ b/views/models/StudiesModel/index.js @@ -0,0 +1,6 @@ +const StudiesModel = { + dropdownSelectOptions: (studies) => + studies.map((study) => ({ value: study, label: study })), +} + +export default StudiesModel diff --git a/views/models/StudiesModel/studiesModel.test.js b/views/models/StudiesModel/studiesModel.test.js new file mode 100644 index 00000000..1891838b --- /dev/null +++ b/views/models/StudiesModel/studiesModel.test.js @@ -0,0 +1,14 @@ +import StudiesModel from '.' + +describe('Studies Model', () => { + it('Creates a list of options from a list of studies', () => { + const studies = ['study1', 'study2', 'study3'] + const options = StudiesModel.dropdownSelectOptions(studies) + + expect(options).toEqual([ + { value: 'study1', label: 'study1' }, + { value: 'study2', label: 'study2' }, + { value: 'study3', label: 'study3' }, + ]) + }) +}) diff --git a/views/models/UrlModel/index.js b/views/models/UrlModel/index.js new file mode 100644 index 00000000..2bcc2cbf --- /dev/null +++ b/views/models/UrlModel/index.js @@ -0,0 +1,13 @@ +import { SAFE_URL_PATTERN, DATA_URL_PATTERN } from '../../../constants' + +const UrlModel = { + sanitizeUrl: (url) => { + url = String(url) + + if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN)) return url + + return `data:,Unsafe%20Image` + }, +} + +export default UrlModel diff --git a/views/models/UserConfigModel/UserConfigModel.test.js b/views/models/UserConfigModel/UserConfigModel.test.js new file mode 100644 index 00000000..b2cc8f61 --- /dev/null +++ b/views/models/UserConfigModel/UserConfigModel.test.js @@ -0,0 +1,138 @@ +import UserConfigModel, { findCategoryColor } from '.' +import { createColorList } from '../../../test/fixtures' + +describe('Models - User Config', () => { + const colors = [ + { + value: 221, + label: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99'], + }, + ] + + describe(UserConfigModel.processNewConfig, () => { + const formValues = UserConfigModel.defaultFormValues({ + readers: [ + { label: 'fang', value: 'fang' }, + { label: 'talon', value: 'talon' }, + { label: 'mabel', value: 'mabel' }, + ], + config: [ + UserConfigModel.defaultConfigValues, + UserConfigModel.defaultConfigValues, + ], + public: false, + }) + + it('returns config form values as user config object', () => { + const newUserConfig = UserConfigModel.publishConfig( + formValues, + colors, + 'owl' + ) + + expect(newUserConfig).toEqual({ + config: { + 0: [ + { + analysis: '', + category: '', + color: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99'], + label: '', + range: ['0', '1'], + variable: '', + text: true, + }, + { + analysis: '', + category: '', + + color: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99'], + label: '', + range: ['0', '1'], + variable: '', + text: true, + }, + ], + }, + description: '', + name: '', + owner: 'owl', + readers: ['fang', 'talon', 'mabel'], + type: 'matrix', + public: false, + status: 1, + }) + }) + }) + + describe(UserConfigModel.processConfigToFormFields, () => { + it('returns a current configuration into form values', async () => { + const currentConfiguration = { + config: { + 0: [ + { + analysis: '', + category: '', + color: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99'], + label: '', + range: ['0', '1'], + variable: '', + text: true, + }, + { + analysis: '', + category: '', + color: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99'], + label: '', + range: ['0', '1'], + variable: '', + text: true, + }, + ], + }, + name: '', + owner: 'owl', + readers: ['fang', 'talon', 'owl'], + type: 'matrix', + public: true, + } + const formFields = await UserConfigModel.processConfigToFormFields( + currentConfiguration, + colors + ) + + expect(formFields).toEqual( + UserConfigModel.defaultFormValues({ + owner: 'owl', + readers: [ + { label: 'fang', value: 'fang' }, + { label: 'talon', value: 'talon' }, + ], + config: [ + UserConfigModel.defaultConfigValues, + UserConfigModel.defaultConfigValues, + ], + public: true, + }) + ) + }) + }) +}) + +describe('findCategoryColor', () => { + it('finds the correct color value from color list', () => { + const colorList = createColorList() + const categoryColors = [ + '#ffffcc', + '#d9f0a3', + '#addd8e', + '#78c679', + '#31a354', + '#006837', + ] + expect(findCategoryColor(categoryColors, colorList)).toEqual({ + label: ['#ffffcc', '#d9f0a3', '#addd8e', '#78c679', '#31a354', '#006837'], + value: 3, + }) + }) +}) diff --git a/views/models/UserConfigModel/index.js b/views/models/UserConfigModel/index.js new file mode 100644 index 00000000..21338468 --- /dev/null +++ b/views/models/UserConfigModel/index.js @@ -0,0 +1,104 @@ +const defaultColorValue = 221 +const UserConfigModel = { + defaultConfigValues: { + category: '', + analysis: '', + variable: '', + label: '', + color: defaultColorValue, + min: '0', + max: '1', + text: true, + }, + defaultFormValues: (overrides = {}) => ({ + configName: '', + configType: 'matrix', + description: '', + readers: [], + config: [], + public: false, + ...overrides, + }), + publishConfig: (formValues, colors, owner) => ({ + ...processConfigAssessment(formValues, colors, owner), + status: 1, + }), + saveAsDraft: (formValues, colors, owner) => ({ + ...processConfigAssessment(formValues, colors, owner), + status: 0, + }), + processConfigToFormFields: (currentConfig, colors) => { + const { + config, + description, + name, + owner, + public: publicConfig, + readers, + type, + updatedAt, + status, + } = currentConfig + const configKey = Object.keys(config)[0] + const configCategoryFields = config[configKey].map( + ({ category, analysis, variable, label, range, color, text }) => { + const [min, max] = range + const loadColor = findCategoryColor(color, colors) + + return { + analysis, + category, + color: loadColor ? loadColor.value : defaultColorValue, + label, + min, + max, + text, + variable, + } + } + ) + return { + configName: name, + configType: type, + description: description || '', + owner, + readers: readers + .map((reader) => ({ + value: reader, + label: reader, + })) + .filter(({ label }) => label !== owner), + config: configCategoryFields, + public: publicConfig, + updatedAt, + status, + } + }, + isActive: (configuration, property) => + configuration[property] === 1 || !Object.hasOwn(configuration, property), +} + +export const findCategoryColor = (categoryColors, colors) => + colors.find(({ label }) => categoryColors.every((el, i) => el === label[i])) + +const processConfigAssessment = (formValues, colors, owner) => { + return { + config: { + 0: formValues.config.map(({ min, max, color, ...rest }) => { + return { + color: colors.find(({ value }) => value === color).label, + range: [min, max], + ...rest, + } + }), + }, + description: formValues.description, + name: formValues.configName, + public: formValues.public, + owner, + readers: formValues.readers.map(({ value }) => value), + type: formValues.configType, + } +} + +export default UserConfigModel diff --git a/views/models/UsersModel/UsersModel.test.js b/views/models/UsersModel/UsersModel.test.js new file mode 100644 index 00000000..2e1028a6 --- /dev/null +++ b/views/models/UsersModel/UsersModel.test.js @@ -0,0 +1,63 @@ +import UsersModel from '.' +import { createUser } from '../../../test/fixtures' + +describe('Models - UsersModel', () => { + describe(UsersModel.createUserFriendList, () => { + it('returns a user list with label, value, and isFixed properties', () => { + const user = createUser() + + const users = [ + user, + createUser({ uid: 'user2' }), + createUser({ uid: 'user3' }), + ] + const selectUsersList = UsersModel.createUserFriendList(users, user.uid) + + expect(selectUsersList).toEqual([ + { + isFixed: true, + label: 'user-uid', + value: 'user-uid', + }, + { + isFixed: false, + label: 'user2', + value: 'user2', + }, + { + isFixed: false, + label: 'user3', + value: 'user3', + }, + ]) + }) + }) + describe(UsersModel.userFromFormValues, () => { + it('returns a user to be updated in the database from a form', () => { + const updatedUser = createUser({ + access: [ + { value: 'CA', label: 'CA' }, + { value: 'YA', label: 'YA' }, + ], + role: { value: 'admin' }, + }) + const user = createUser({ access: ['CA', 'YA'], role: 'admin' }) + + expect(UsersModel.userFromFormValues(updatedUser)).toEqual(user) + }) + }) + describe(UsersModel.formValuesFromUser, () => { + it('returns a user to be used as form values', () => { + const user = createUser({ access: ['CA', 'YA'], role: 'admin' }) + const formValues = createUser({ + access: [ + { value: 'CA', label: 'CA' }, + { value: 'YA', label: 'YA' }, + ], + role: { value: 'admin' }, + }) + + expect(UsersModel.formValuesFromUser(user)).toEqual(formValues) + }) + }) +}) diff --git a/views/models/UsersModel/index.js b/views/models/UsersModel/index.js new file mode 100644 index 00000000..c0442c89 --- /dev/null +++ b/views/models/UsersModel/index.js @@ -0,0 +1,35 @@ +const UsersModel = { + createUserFriendList: (users, owner) => { + return users.map(({ uid }) => ({ + label: uid, + value: uid, + isFixed: uid === owner, + })) + }, + createOptionsFromReaders: (readers, owner) => + readers.map((reader) => ({ + label: reader, + value: reader, + isFixed: reader === owner, + })), + createReadersList: (readers) => readers.map(({ value }) => value), + userAccessDropdownOptions: (access) => + access.map((site) => ({ + label: site, + value: site, + })), + userFromFormValues: (user) => ({ + ...user, + role: user.role.value, + access: user.access.map(({ value }) => value), + }), + formValuesFromUser(user) { + return { + ...user, + role: { value: user.role }, + access: this.userAccessDropdownOptions(user.access), + } + }, +} + +export default UsersModel diff --git a/views/models/index.js b/views/models/index.js new file mode 100644 index 00000000..f63a31c0 --- /dev/null +++ b/views/models/index.js @@ -0,0 +1,17 @@ +import ChartFiltersModel from './ChartFiltersModel' +import ChartModel from './ChartModel' +import FileModel from './FileModel' +import StudiesModel from './StudiesModel' +import UrlModel from './UrlModel' +import UserConfigModel from './UserConfigModel' +import UsersModel from './UsersModel' + +export { + ChartModel, + ChartFiltersModel, + StudiesModel, + UserConfigModel, + UrlModel, + UsersModel, + FileModel, +} diff --git a/views/pages/AccountPage/AccountPage.css b/views/pages/AccountPage/AccountPage.css new file mode 100644 index 00000000..c94e25ec --- /dev/null +++ b/views/pages/AccountPage/AccountPage.css @@ -0,0 +1,21 @@ +.AccountPage { + display: flex; + flex-grow: 1; + flex-direction: column; + padding: 35px; + margin: 0; +} +.AccountPageBanner { + display: flex; + justify-content: space-between; +} + +.AccountLink { + align-self: flex-start; + color: var(--text-secondary); +} +@media screen and (min-width: 900px) { + .AccountPage { + padding: 70px 125px 70px 24px; + } +} diff --git a/views/pages/AccountPage/AccountPage.test.jsx b/views/pages/AccountPage/AccountPage.test.jsx new file mode 100644 index 00000000..8645c9a1 --- /dev/null +++ b/views/pages/AccountPage/AccountPage.test.jsx @@ -0,0 +1,38 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import AccountPage from '.' + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useOutletContext: () => { + return { + user: { + display_name: 'Owl', + icon: 'data:image/png;base64,SGVsbG8sIFdvcmxkIQ==', + iconFileName: 'profileImage.png', + mail: 'mail@mail.com', + title: 'MR', + }, + setUser: jest.fn(), + setNotification: jest.fn(), + } + }, +})) +describe('AccountPage', () => { + test('it renders the page and the form sections', () => { + render(, { wrapper: MemoryRouter }) + + const accountPageBanner = screen.getByText('Profile') + const accountFormProfileImage = screen.getByText('Upload Profile Photo') + const accountFormInputs = screen.getByRole('textbox', { name: 'Full name' }) + const resetPasswordButton = screen.getByText('Request password change') + + expect(accountPageBanner).toBeInTheDocument() + expect(accountFormProfileImage).toBeInTheDocument() + expect(accountFormInputs).toBeInTheDocument() + expect(resetPasswordButton).toBeInTheDocument() + }) +}) diff --git a/views/pages/AccountPage/AccountPageHeader.jsx b/views/pages/AccountPage/AccountPageHeader.jsx new file mode 100644 index 00000000..cd9ba664 --- /dev/null +++ b/views/pages/AccountPage/AccountPageHeader.jsx @@ -0,0 +1,51 @@ +import React from 'react' + +import { ArrowForwardOutlined } from '@mui/icons-material' +import { Typography, Button } from '@mui/material' +import { useNavigate } from 'react-router-dom' + +import { borderRadius, fontSize, lineHeight } from '../../../constants' +import { routes } from '../../routes/routes' + +const AccountPageHeader = () => { + const navigate = useNavigate() + + return ( + <> + + Profile + + + + ) +} +export default AccountPageHeader diff --git a/views/pages/AccountPage/AccountPageHeader.test.jsx b/views/pages/AccountPage/AccountPageHeader.test.jsx new file mode 100644 index 00000000..5ad2f1cc --- /dev/null +++ b/views/pages/AccountPage/AccountPageHeader.test.jsx @@ -0,0 +1,18 @@ +import React from 'react' + +import { screen, render } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import AccountPageHeader from './AccountPageHeader' + +describe('AccountPageHeader', () => { + it('renders the banner', () => { + render(, { wrapper: MemoryRouter }) + + const title = screen.getByText('Profile') + const logOut = screen.getByRole('button') + + expect(title).toBeInTheDocument() + expect(logOut).toBeInTheDocument() + }) +}) diff --git a/views/pages/AccountPage/index.jsx b/views/pages/AccountPage/index.jsx new file mode 100644 index 00000000..0814d8cf --- /dev/null +++ b/views/pages/AccountPage/index.jsx @@ -0,0 +1,85 @@ +import React from 'react' + +import { Button } from '@mui/material' +import { useOutletContext, Link } from 'react-router-dom' + +import AccountPageHeader from './AccountPageHeader' +import { borderRadius, fontSize } from '../../../constants' +import api from '../../api' +import UserProfileForm from '../../forms/UserProfileForm' +import FileModel from '../../models/FileModel' +import { routes } from '../../routes/routes' + +import './AccountPage.css' + +const AccountPage = () => { + const { user, setUser, setNotification } = useOutletContext() + const { display_name, icon, iconFileName, mail, title, preferences } = user + const iconFile = + !!icon && !!iconFileName + ? FileModel.fromDataURL(icon, iconFileName) + : undefined + + const onSubmit = async (userProfileValues) => { + try { + const { iconFile, ...formData } = userProfileValues + const icon = iconFile ? await FileModel.toDataURL(iconFile) : '' + const iconFileName = iconFile ? iconFile.name : '' + const updatedUser = await api.users.update(user.uid, { + ...formData, + preferences, + icon, + iconFileName, + }) + + setUser(updatedUser) + setNotification(() => ({ + open: true, + message: 'User has been updated.', + })) + } catch (error) { + setNotification({ + open: true, + message: error.message, + }) + } + } + + return ( +
+
+ +
+ + + + Request password change + +
+ ) +} + +export default AccountPage diff --git a/views/pages/AdminPage/AdminCheck.jsx b/views/pages/AdminPage/AdminCheck.jsx new file mode 100644 index 00000000..c532db3d --- /dev/null +++ b/views/pages/AdminPage/AdminCheck.jsx @@ -0,0 +1,13 @@ +import { Navigate, useOutletContext } from 'react-router-dom' + +import { ADMIN_ROLE } from '../../../constants' +import { routes } from '../../routes/routes' + +const AdminCheck = ({ children }) => { + const { user } = useOutletContext() + const role = user.role + + return role !== ADMIN_ROLE ? : children +} + +export default AdminCheck diff --git a/views/pages/AdminPage/AdminPage.test.jsx b/views/pages/AdminPage/AdminPage.test.jsx new file mode 100644 index 00000000..fd3810ba --- /dev/null +++ b/views/pages/AdminPage/AdminPage.test.jsx @@ -0,0 +1,36 @@ +import { screen } from '@testing-library/react' + +import AdminPage from '.' +import { createUser } from '../../../test/fixtures' +import renderPage from '../../../test/PageRenderer' + +const mockUser = createUser() +const mockUsers = [createUser(), createUser()] + +jest.mock( + 'react-router-dom', + () => { + return { + ...jest.requireActual('react-router-dom'), + useOutletContext: () => { + return { + user: mockUser, + users: mockUsers, + setNotification: jest.fn(), + } + }, + } + }, + {} +) +describe('Admin Page', () => { + it('renders the page', () => { + renderPage(AdminPage) + + const pageTitle = screen.getByText('Admin') + + expect(pageTitle).toBeInTheDocument() + expect(screen.getByRole('combobox')).toBeInTheDocument() + expect(screen.getByRole('table')).toBeInTheDocument() + }) +}) diff --git a/views/pages/AdminPage/index.jsx b/views/pages/AdminPage/index.jsx new file mode 100644 index 00000000..c969ec0e --- /dev/null +++ b/views/pages/AdminPage/index.jsx @@ -0,0 +1,263 @@ +import React, { useEffect, useState } from 'react' + +import { + Box, + Button, + Modal, + ListItemText, + MenuItem, + Divider, +} from '@mui/material' +import { useForm } from 'react-hook-form' +import { useOutletContext } from 'react-router-dom' + +import { ROLE_OPTIONS } from '../../../constants' +import api from '../../api' +import PageHeader from '../../components/PageHeader' +import { AdminUsersSearchForm } from '../../forms/AdminUsersSearchForm' +import ControlledMultiSelect from '../../forms/ControlledMultiSelect' +import ControlledSelectInput from '../../forms/ControlledSelect' +import { UsersModel, StudiesModel } from '../../models' +import AdminUsersTable from '../../tables/AdminUsersTable' + +const modalStyle = { + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 720, + bgcolor: 'background.paper', + border: '2px solid #000', + boxShadow: 24, + p: 4, +} + +const AdminPage = () => { + const { setNotification, users, setUsers } = useOutletContext() + + const [searchOptions, setSearchOptions] = useState([]) + const [studies, setStudies] = useState([]) + const [searchOptionsValue, setSearchOptionsValue] = useState([]) + const [openResetKeyModal, setOpenResetKeyModal] = useState(false) + const [resetKeyValue, setResetKeyValue] = useState('') + const [currentRowIndex, setCurrentRowIndex] = useState(null) + const [openAccessModal, setOpenAccessModal] = useState(false) + + const { handleSubmit, control, reset } = useForm({ + defaultValues: { + access: [], + role: '', + }, + mode: 'onChange', + }) + + const filteredUsers = (searchOptionsValue || []).length + ? users.filter((user) => + searchOptionsValue + .map((searchOption) => searchOption.value) + .includes(user.uid) + ) + : users + + const updateUsers = (newUser) => { + const newUserIndex = users.findIndex((u) => u.uid === newUser.uid) + if (newUserIndex === -1) return + + const updatedUsers = users + .slice(0, newUserIndex) + .concat([newUser]) + .concat(users.slice(newUserIndex + 1)) + + setUsers(updatedUsers) + } + + const handleNotification = (message) => + setNotification({ open: true, message }) + const handleUserRemove = async (rowIndex) => { + try { + const userId = filteredUsers[rowIndex].uid + + await api.admin.users.destroy(userId) + + const usersList = await api.users.loadAll() + + setUsers(usersList) + handleNotification('User has been deleted') + } catch (error) { + handleNotification(error.message) + } + } + + const handleResetPassword = async (rowIndex) => { + try { + const resetKey = crypto.randomUUID() + const userValues = filteredUsers[rowIndex] + const { uid } = userValues + const userAttributes = { + ...userValues, + force_reset_pw: true, + reset_key: resetKey, + } + const updatedUser = await api.admin.users.update(uid, userAttributes) + updateUsers(updatedUser) + setResetKeyValue(resetKey) + setOpenResetKeyModal(true) + handleNotification('Reset Key has been applied successfully') + } catch (error) { + handleNotification(error.message) + } + } + + const handleUserAccess = (rowIndex) => { + setCurrentRowIndex(rowIndex) + setOpenAccessModal(true) + reset({ + access: filteredUsers[rowIndex].access.map((study) => ({ + label: study, + value: study, + })), + role: filteredUsers[rowIndex].role, + }) + } + + const handleUpdateUserAccess = async (formValues) => { + try { + formValues.access = formValues.access.map(({ value }) => value) + + const userValues = filteredUsers[currentRowIndex] + const { uid } = userValues + const userAttributes = { + ...userValues, + ...formValues, + } + const updatedUser = await api.admin.users.update(uid, userAttributes) + + updateUsers(updatedUser) + setOpenAccessModal(false) + reset({ access: [], role: '' }) + handleNotification('User access has been applied successfully') + } catch (error) { + handleNotification(error.message) + } + } + + const handleUserBlock = async (rowIndex) => { + try { + const userValues = filteredUsers[rowIndex] + + const userId = userValues.uid + const updatedUser = await api.admin.users.update(userId, { + ...userValues, + blocked: !userValues.blocked, + }) + + updateUsers(updatedUser) + + handleNotification('User updated successfully') + } catch (error) { + handleNotification(error.message) + } + } + const fetchStudies = async () => { + try { + const listOfStudies = await api.admin.studies.all() + const studyOptions = StudiesModel.dropdownSelectOptions(listOfStudies) + + setStudies(studyOptions) + } catch (error) { + handleNotification(error.message) + } + } + + const handleChangeAccountExpiration = async (rowIndex, value) => { + try { + const userValues = filteredUsers[rowIndex] + const { uid } = userValues + const userAttributes = { + ...userValues, + account_expires: value.toISOString(), + } + const updatedUser = await api.admin.users.update(uid, userAttributes) + + updateUsers(updatedUser) + handleNotification('Account expiration has been applied successfully') + } catch (error) { + handleNotification(error.message) + } + } + + useEffect(() => { + fetchStudies() + }, []) + + useEffect(() => { + const searchOptionsFromUsers = UsersModel.createUserFriendList(users) + setSearchOptions(searchOptionsFromUsers) + }, [users, searchOptionsValue]) + + return ( + + + + + + setOpenResetKeyModal(false)} + > + +

Reset Key

+

{resetKeyValue}

+
+
+ + setOpenAccessModal(false)} + > + +
+ + + + + + {ROLE_OPTIONS.map(({ value, label }) => ( + + {label} + + ))} + + + + +
+
+
+ ) +} + +export default AdminPage diff --git a/views/pages/ChartsPage.jsx b/views/pages/ChartsPage.jsx new file mode 100644 index 00000000..c796a5e1 --- /dev/null +++ b/views/pages/ChartsPage.jsx @@ -0,0 +1,85 @@ +import React from 'react' + +import { Box, Button } from '@mui/material' +import { Link, useOutletContext } from 'react-router-dom' + +import PageHeader from '../components/PageHeader' +import ChartShareForm from '../forms/ChartShareForm' +import ChartsSearchForm from '../forms/ChartsSearchForm' +import useChartsList from '../hooks/useChartsList' +import { routes } from '../routes/routes' +import ChartsTable from '../tables/ChartsTable' + +const ChartsPage = () => { + const { user } = useOutletContext() + const { + charts, + handleSearch, + onDelete, + onDuplicate, + onFavorite, + onShare, + onSort, + sortDirection, + sortBy, + chartToShare, + closeDialog, + shareWithUsers, + sharedWithOptions, + shareFormControl, + shareFormValues, + clearSelectedUsers, + selectAllUsers, + } = useChartsList() + + return ( + + + New chart + + } + form={ + + } + /> + + + + ) +} + +export default ChartsPage diff --git a/views/pages/ConfigurationsPage/ConfigurationsPage.css b/views/pages/ConfigurationsPage/ConfigurationsPage.css new file mode 100644 index 00000000..ae885e75 --- /dev/null +++ b/views/pages/ConfigurationsPage/ConfigurationsPage.css @@ -0,0 +1,5 @@ +.ConfigurationsPageActions { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; +} diff --git a/views/pages/ConfigurationsPage/index.jsx b/views/pages/ConfigurationsPage/index.jsx new file mode 100644 index 00000000..bed0902e --- /dev/null +++ b/views/pages/ConfigurationsPage/index.jsx @@ -0,0 +1,220 @@ +import React, { useState, useEffect } from 'react' + +import { Add, UploadFile } from '@mui/icons-material' +import { Box, Button, useMediaQuery } from '@mui/material' +import { useOutletContext, Link } from 'react-router-dom' + +import { fontSize } from '../../../constants' +import api from '../../api' +import PageHeader from '../../components/PageHeader' +import ShareConfigurationForm from '../../forms/ShareConfigurationForm' +import { UsersModel } from '../../models' +import { routes } from '../../routes/routes' +import ConfigurationsTable from '../../tables/ConfigurationsTable' + +import './ConfigurationsPage.css' + +const ConfigurationsPage = () => { + const isMobile = useMediaQuery('(max-width:900px)') + const { navigate, setNotification, setUser, user, users } = useOutletContext() + const { uid, preferences } = user + const [configurations, setConfigurations] = useState([]) + const [configuration, setConfiguration] = useState(null) + const open = !!configuration?._id + const options = + configuration?.readers && configuration?.owner + ? UsersModel.createUserFriendList(users, configuration.owner) + : [] + const initialValues = + configuration?.readers && configuration?.owner + ? { + readers: UsersModel.createOptionsFromReaders( + configuration.readers, + configuration.owner + ), + } + : { readers: [] } + + const handleNotification = (message) => + setNotification({ open: true, message }) + const onSubmit = async (data) => { + try { + const configAttributes = { + readers: UsersModel.createReadersList(data.readers), + } + await api.userConfigurations.update( + uid, + configuration._id, + configAttributes + ) + + await loadAllConfigurations(uid) + + closeForm() + } catch (error) { + handleNotification(error.message) + } + } + const loadAllConfigurations = async (userId) => { + try { + const configurations = await api.userConfigurations.all(userId) + + setConfigurations(configurations) + } catch (error) { + handleNotification(error.message) + } + } + + const closeForm = () => setConfiguration(null) + + const handleFormModal = async (config) => setConfiguration(config) + + const handleDefaultConfiguration = async (configurationId) => { + try { + const userAttributes = { + ...user, + preferences: { + ...preferences, + config: preferences.config === configurationId ? '' : configurationId, + }, + } + const updatedUser = await api.users.update(uid, userAttributes) + + setUser(updatedUser) + } catch (error) { + handleNotification(error.message) + } + } + const handleEditConfig = (configurationId) => + navigate(routes.editConfiguration(configurationId)) + const handleDeleteConfig = async (configurationId) => { + try { + await api.userConfigurations.destroy(uid, configurationId) + + await loadAllConfigurations(uid) + + if (preferences.config === configurationId) + handleDefaultConfiguration(configurationId) + } catch (error) { + handleNotification(error.message) + } + } + const handleDuplicateConfiguration = async (configuration) => { + try { + const { _id, ...configAttributes } = configuration + const newConfig = { + ...configAttributes, + owner: uid, + readers: [uid], + status: 1, + } + + await api.userConfigurations.create(uid, newConfig) + await loadAllConfigurations(uid) + } catch (error) { + handleNotification(error.message) + } + } + + const handleConfigurationUpload = (e) => { + try { + const file = e.target.files ? e.target.files[0] : '' + + new Response(file).json().then(async ({ name, config }) => { + const newConfigurationAttributes = { + config: { + 0: config, + }, + name, + owner: user.uid, + readers: [user.uid], + type: 'matrix', + status: 1, + } + + await api.userConfigurations.create( + user.uid, + newConfigurationAttributes + ) + await loadAllConfigurations(uid) + + handleNotification('New configuration added') + }) + } catch (error) { + handleNotification(error.message) + } + } + + useEffect(() => { + loadAllConfigurations(uid) + }, []) + return ( + + + + + + } + /> + + {configuration?._id && ( + + )} + + ) +} + +export default ConfigurationsPage diff --git a/views/pages/DashboardPage/DashboardPage.css b/views/pages/DashboardPage/DashboardPage.css new file mode 100644 index 00000000..79773edc --- /dev/null +++ b/views/pages/DashboardPage/DashboardPage.css @@ -0,0 +1,3 @@ +.DashboardPageSection { + padding-top: 56px; +} diff --git a/views/pages/DashboardPage/DashboardPage.test.jsx b/views/pages/DashboardPage/DashboardPage.test.jsx new file mode 100644 index 00000000..06667404 --- /dev/null +++ b/views/pages/DashboardPage/DashboardPage.test.jsx @@ -0,0 +1,91 @@ +import { screen, within, waitFor } from '@testing-library/react' + +import DashboardPage from '.' +import { + createParticipantList, + createUser, + createChart, +} from '../../../test/fixtures' +import renderPage from '../../../test/PageRenderer' + +const mockUser = createUser({ access: ['AA', 'BB', 'CC'] }) +const mockParticipants = createParticipantList() +const mockedUsers = [ + mockUser, + createUser({ uid: 'foo' }), + createUser({ uid: 'bar' }), +] +const mockedCharts = [ + createChart({ chartOwner: { display_name: 'Jane' } }), + createChart({ + title: 'chart two', + owner: 'foo', + chartOwner: { display_name: 'Jack' }, + }), + createChart({ + title: 'bar chart', + owner: 'bar', + chartOwner: { display_name: 'Bert' }, + }), +] + +jest.mock( + 'react-router-dom', + () => { + return { + ...jest.requireActual('react-router-dom'), + useOutletContext: () => { + return { + user: mockUser, + setNotification: jest.fn(), + users: mockedUsers, + } + }, + } + }, + {} +) + +jest.mock('../../api', () => { + return { + participants: { + all: () => Promise.resolve(mockParticipants), + }, + charts: { + chart: { + all: () => mockedCharts, + }, + }, + } +}) +describe('Dashboard Page', () => { + test('Dashboard Page renders', async () => { + renderPage(DashboardPage) + + await waitFor(() => { + expect(screen.getByText('Dashboard')).toBeInTheDocument() + }) + }) + + test('Dashboard Page shows 5 rows of Participants', async () => { + renderPage(DashboardPage) + + await waitFor(() => { + const participantRows = within( + screen.getAllByRole('table')[0] + ).getAllByRole('row') + expect(participantRows.length).toBe(6) + }) + }) + + test('Renders Charts table', async () => { + renderPage(DashboardPage) + + await waitFor(() => { + const chartsTableRows = within( + screen.getAllByRole('table')[1] + ).getAllByRole('row') + expect(chartsTableRows.length).toBe(4) + }) + }) +}) diff --git a/views/pages/DashboardPage/DashboardPageSectionHeader.jsx b/views/pages/DashboardPage/DashboardPageSectionHeader.jsx new file mode 100644 index 00000000..2ad2699f --- /dev/null +++ b/views/pages/DashboardPage/DashboardPageSectionHeader.jsx @@ -0,0 +1,28 @@ +import React from 'react' + +import { Typography } from '@mui/material' +import { Link } from 'react-router-dom' + +import { fontSize } from '../../../constants' + +const DashboardPageSectionHeader = ({ title, to }) => { + return ( + + + {title} + + + View All + + + ) +} + +export default DashboardPageSectionHeader diff --git a/views/pages/DashboardPage/DashboardPageSectionHeader.test.jsx b/views/pages/DashboardPage/DashboardPageSectionHeader.test.jsx new file mode 100644 index 00000000..c8ddaaad --- /dev/null +++ b/views/pages/DashboardPage/DashboardPageSectionHeader.test.jsx @@ -0,0 +1,18 @@ +import { render, screen } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import DashboardPageSectionHeader from './DashboardPageSectionHeader' + +describe('DashboardPageSectionHeader', () => { + it('renders a header with a title and a View All text with an href property', () => { + render(, { + wrapper: MemoryRouter, + }) + + const viewAll = screen.getByText('View All') + const title = screen.getByText('Section') + + expect(title).toBeInTheDocument() + expect(viewAll).toHaveAttribute('href', '/some-route') + }) +}) diff --git a/views/pages/DashboardPage/index.jsx b/views/pages/DashboardPage/index.jsx new file mode 100644 index 00000000..73c41d84 --- /dev/null +++ b/views/pages/DashboardPage/index.jsx @@ -0,0 +1,88 @@ +import React from 'react' + +import { Box } from '@mui/material' +import { useOutletContext } from 'react-router-dom' + +import DashboardPageSectionHeader from './DashboardPageSectionHeader' +import PageHeader from '../../components/PageHeader' +import ChartShareForm from '../../forms/ChartShareForm' +import useChartsList from '../../hooks/useChartsList' +import useParticipantsList from '../../hooks/useParticipantsList' +import { routes } from '../../routes/routes' +import ChartsTable from '../../tables/ChartsTable' +import ParticipantsTable from '../../tables/ParticipantsTable' + +import './DashboardPage.css' + +const DashboardPage = () => { + const { user } = useOutletContext() + const { participants, onSort, onStar, sortBy, sortDirection } = + useParticipantsList() + const { + charts, + onDelete, + onDuplicate, + onFavorite, + onShare, + onSort: onChartSort, + sortDirection: chartSortDirection, + sortBy: chartSortBy, + chartToShare, + closeDialog, + shareWithUsers, + sharedWithOptions, + shareFormControl, + shareFormValues, + clearSelectedUsers, + selectAllUsers, + } = useChartsList() + + return ( + + +
+ + +
+
+ + +
+ +
+ ) +} + +export default DashboardPage diff --git a/views/pages/EditChartPage.jsx b/views/pages/EditChartPage.jsx new file mode 100644 index 00000000..6ae9773c --- /dev/null +++ b/views/pages/EditChartPage.jsx @@ -0,0 +1,54 @@ +import React, { useState, useEffect } from 'react' + +import { Box } from '@mui/material' +import { useParams, useOutletContext } from 'react-router-dom' + +import api from '../api' +import ChartForm from '../forms/ChartForm' +import { routes } from '../routes/routes' + +const EditChartPage = () => { + const { chart_id } = useParams() + const { user, navigate, setNotification } = useOutletContext() + const [loading, setLoading] = useState(true) + const [initialValues, setInitialValues] = useState(null) + + const handleSubmit = async (formValues) => { + try { + const data = await api.charts.chart.update(chart_id, formValues) + + navigate(routes.viewChart(data._id)) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + const getChart = async () => { + try { + return await api.charts.chart.show(chart_id) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + useEffect(() => { + getChart().then((chartValues) => { + setInitialValues(chartValues) + setLoading(false) + }) + }, []) + + if (loading) return
Loading...
+ + return ( + + + + ) +} + +export default EditChartPage diff --git a/views/pages/EditConfigPage.jsx b/views/pages/EditConfigPage.jsx new file mode 100644 index 00000000..cf071d56 --- /dev/null +++ b/views/pages/EditConfigPage.jsx @@ -0,0 +1,119 @@ +import React, { useState, useEffect } from 'react' + +import { Box, Typography } from '@mui/material' +import dayjs from 'dayjs' +import { useParams, useOutletContext } from 'react-router-dom' + +import api from '../api' +import PageHeader from '../components/PageHeader' +import { colorList } from '../fe-utils/colorList' +import ConfigForm from '../forms/ConfigForm' +import { UserConfigModel } from '../models' + +const colors = colorList() + +const EditConfigPage = () => { + const { user, setNotification, users } = useOutletContext() + const [assessmentOptions, setAssessmentOptions] = useState([]) + const [initialValues, setInitialValues] = useState({}) + const [loading, setLoading] = useState(true) + const { config_id } = useParams() + const friendsList = users + .map(({ uid }) => ({ label: uid, value: uid })) + .filter(({ label }) => label !== user.uid) + const { uid } = user + + const handleSubmitPublish = async (formValues) => { + try { + const updatedConfiguration = UserConfigModel.publishConfig( + formValues, + colors, + uid + ) + await api.userConfigurations.update(uid, config_id, updatedConfiguration) + + setNotification({ + open: true, + message: 'Configuration Added', + }) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + const fetchCurrentConfig = async () => { + try { + const data = await api.userConfigurations.findOne(uid, config_id) + + return UserConfigModel.processConfigToFormFields(data, colors) + } catch (error) { + setNotification({ + open: true, + message: error.message, + }) + } + } + const handleAssessmentSearch = async (e) => { + const assessments = await api.assessments.loadAll({ + search: e.target.value, + }) + const assessmentMenuOptions = assessments.map(({ name }) => name) + + setAssessmentOptions(assessmentMenuOptions) + } + + const handleClearAssessments = async () => setAssessmentOptions([]) + const handleSubmitDraft = async (formValues) => { + const newConfigurationAttributes = UserConfigModel.saveAsDraft( + formValues, + colors, + uid + ) + await api.userConfigurations.update( + uid, + config_id, + newConfigurationAttributes + ) + + setNotification({ + open: true, + message: 'Draft saved', + }) + } + + useEffect(() => { + fetchCurrentConfig().then((values) => { + setInitialValues(values) + setLoading(false) + }) + }, []) + + if (loading) return
Depending on the size, this may take a while...
+ + return ( + + + Saved as draft: {dayjs(initialValues.updatedAt).format('llll')} + + ) : null + } + isDescription + /> + + + ) +} + +export default EditConfigPage diff --git a/views/pages/GraphPage.jsx b/views/pages/GraphPage.jsx new file mode 100644 index 00000000..b09c7303 --- /dev/null +++ b/views/pages/GraphPage.jsx @@ -0,0 +1,105 @@ +import React, { useEffect, useState } from 'react' + +import { Box, Divider } from '@mui/material' +import { useOutletContext, useParams } from 'react-router-dom' + +import api from '../api' +import { Graph } from '../components/Graph' +import PageHeader from '../components/PageHeader' +import SelectConfigurationForm from '../forms/SelectConfigurationsForm' + +const GraphPage = () => { + const { user, theme, setUser, setNotification } = useOutletContext() + const [configurations, setConfigurations] = useState([]) + const { study, subject } = useParams() + const [participants, setParticipants] = useState([]) + const { preferences } = user + + const fetchParticipants = async () => { + if (subject) { + setParticipants([subject]) + } else { + const participantsRes = await api.participants.all({ + sortBy: 'participant', + sortDirection: 'ASC', + studies: [study], + }) + const participants = participantsRes.map((p) => p.participant) + setParticipants(participants) + } + } + const loadActiveConfigurations = async () => { + const queryParams = { status: 'active' } + const configurations = await api.userConfigurations.all( + user.uid, + queryParams + ) + + setConfigurations(configurations) + } + const handleSubmit = async (formValues) => { + try { + const { uid } = user + const userAttributes = { + ...user, + preferences: { + ...user.preferences, + config: formValues.config, + }, + } + const updatedUser = await api.users.update(uid, userAttributes) + + setUser(updatedUser) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + useEffect(() => { + loadActiveConfigurations() + }, []) + + useEffect(() => { + fetchParticipants() + }, [study, subject]) + + return ( + + + + {configurations.length ? ( + + ) : null} + + {participants.map((participant) => { + return ( + + + + + ) + })} + + ) +} + +export default GraphPage diff --git a/views/pages/NewChartPage.jsx b/views/pages/NewChartPage.jsx new file mode 100644 index 00000000..af27d418 --- /dev/null +++ b/views/pages/NewChartPage.jsx @@ -0,0 +1,40 @@ +import React from 'react' + +import { Box } from '@mui/material' +import { useOutletContext } from 'react-router-dom' + +import api from '../api' +import ChartForm from '../forms/ChartForm' +import { routes } from '../routes/routes' + +const NewChartPage = () => { + const { user, navigate, setNotification } = useOutletContext() + + const handleSubmit = async (formValues) => { + try { + const data = await api.charts.chart.create(formValues) + + navigate(routes.viewChart(data.chart_id)) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + return ( + + + + ) +} + +export default NewChartPage diff --git a/views/pages/NewConfigPage.jsx b/views/pages/NewConfigPage.jsx new file mode 100644 index 00000000..9fe70315 --- /dev/null +++ b/views/pages/NewConfigPage.jsx @@ -0,0 +1,88 @@ +import React, { useState } from 'react' + +import { Box } from '@mui/material' +import { useOutletContext } from 'react-router-dom' + +import api from '../api' +import PageHeader from '../components/PageHeader' +import { colorList } from '../fe-utils/colorList' +import ConfigForm from '../forms/ConfigForm' +import { UserConfigModel } from '../models' + +const colors = colorList() + +const NewConfigPage = () => { + const { user, users, setNotification } = useOutletContext() + const [assessmentOptions, setAssessmentOptions] = useState([]) + const { uid } = user + const defaultValues = UserConfigModel.defaultFormValues({ + readers: [], + owner: uid, + }) + const friendsList = users + .map(({ uid }) => ({ label: uid, value: uid })) + .filter(({ label }) => label !== user.uid) + + const handleSubmitPublish = async (formValues) => { + try { + const newConfigurationAttributes = UserConfigModel.publishConfig( + formValues, + colors, + uid + ) + + await api.userConfigurations.create(uid, newConfigurationAttributes) + + setNotification({ + open: true, + message: 'Configuration Added', + }) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + const handleAssessmentSearch = async (e) => { + const assessments = await api.assessments.loadAll({ + search: e.target.value, + }) + const assessmentMenuOptions = assessments.map(({ name }) => name) + + setAssessmentOptions(assessmentMenuOptions) + } + + const handleClear = async () => setAssessmentOptions([]) + + const handleSubmitDraft = async (formValues) => { + const newConfigurationAttributes = UserConfigModel.saveAsDraft( + formValues, + colors, + uid + ) + + await api.userConfigurations.create(uid, newConfigurationAttributes) + + setNotification({ + open: true, + message: 'Draft saved', + }) + } + + return ( + + + + + ) +} + +export default NewConfigPage diff --git a/views/pages/ParticipantsPage.jsx b/views/pages/ParticipantsPage.jsx new file mode 100644 index 00000000..b9ad792e --- /dev/null +++ b/views/pages/ParticipantsPage.jsx @@ -0,0 +1,56 @@ +import React from 'react' + +import { Box, Typography } from '@mui/material' + +import PageHeader from '../components/PageHeader' +import ParticipantsSearchForm from '../forms/ParticipantsSearchForm' +import useParticipantsList from '../hooks/useParticipantsList' +import ParticipantsTable from '../tables/ParticipantsTable' + +const ParticipantsPage = () => { + const { + handleSearch, + formFilters, + loading, + onSort, + onStar, + participants, + searchOptions, + sortBy, + sortDirection, + } = useParticipantsList() + + return ( + + + } + /> + + {loading ? ( + Loading... + ) : ( + + )} + + ) +} + +export default ParticipantsPage diff --git a/views/pages/RegistrationPage/RegistrationPage.css b/views/pages/RegistrationPage/RegistrationPage.css new file mode 100644 index 00000000..26ed5ade --- /dev/null +++ b/views/pages/RegistrationPage/RegistrationPage.css @@ -0,0 +1,4 @@ +.RegistrationPageSignInLink { + color: var(--primary-main); + padding-left: 3px; +} diff --git a/views/pages/RegistrationPage/RegistrationPage.test.jsx b/views/pages/RegistrationPage/RegistrationPage.test.jsx new file mode 100644 index 00000000..30de31f8 --- /dev/null +++ b/views/pages/RegistrationPage/RegistrationPage.test.jsx @@ -0,0 +1,27 @@ +import React from 'react' + +import { screen, render } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import RegistrationPage from '.' +import { NotificationContext } from '../../contexts' +import { routes } from '../../routes/routes' + +describe('Registration Page', () => { + test('renders the page', () => { + render( + + + , + { wrapper: MemoryRouter } + ) + + const pageTitle = screen.getByText('Sign up') + const signInLink = screen.getByText('Sign in') + const formInputs = screen.getAllByRole('textbox') + + expect(pageTitle).toBeInTheDocument() + expect(signInLink).toHaveAttribute('href', routes.signin) + expect(formInputs.length).toBe(3) + }) +}) diff --git a/views/pages/RegistrationPage/index.jsx b/views/pages/RegistrationPage/index.jsx new file mode 100644 index 00000000..24617af4 --- /dev/null +++ b/views/pages/RegistrationPage/index.jsx @@ -0,0 +1,63 @@ +import React, { useContext } from 'react' + +import { Typography } from '@mui/material' +import { Link } from 'react-router-dom' + +import { fontSize } from '../../../constants' +import api from '../../api' +import { NotificationContext } from '../../contexts' +import RegistrationForm from '../../forms/RegisterForm' +import { routes } from '../../routes/routes' + +import './RegistrationPage.css' + +const RegistrationPage = () => { + const [, setNotification] = useContext(NotificationContext) + const onSubmit = async (data) => { + try { + await api.auth.signup(data) + + setNotification({ + open: true, + message: + 'Account has been created, please wait for an Admin to provide access.', + }) + } catch (error) { + setNotification({ + open: true, + message: error.message, + }) + } + } + return ( + <> + + Sign Up + + + Already have a DPDash account? + + Sign in + + + + + ) +} + +export default RegistrationPage diff --git a/views/pages/ResetPasswordPage.jsx b/views/pages/ResetPasswordPage.jsx new file mode 100644 index 00000000..97dd1b9c --- /dev/null +++ b/views/pages/ResetPasswordPage.jsx @@ -0,0 +1,47 @@ +import React, { useContext } from 'react' + +import { Typography } from '@mui/material' +import { useNavigate } from 'react-router-dom' + +import api from '../api' +import { NotificationContext } from '../contexts' +import ResetPasswordForm from '../forms/ResetPasswordForm' +import { routes } from '../routes/routes' + +const ResetPasswordPage = () => { + const [, setNotification] = useContext(NotificationContext) + const navigate = useNavigate() + const onSubmit = async (resetAttributes) => { + try { + await api.auth.resetPassword(resetAttributes) + + navigate(routes.signin) + + setNotification({ + open: true, + message: 'Password has been updated successfully.', + }) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + return ( + <> + Reset your DPDash account + + navigate(routes.signin)} + onSubmit={onSubmit} + /> + + ) +} + +export default ResetPasswordPage diff --git a/views/pages/SignInPage/SignInPage.css b/views/pages/SignInPage/SignInPage.css new file mode 100644 index 00000000..4689b977 --- /dev/null +++ b/views/pages/SignInPage/SignInPage.css @@ -0,0 +1,10 @@ +.SignInPageRegister_link { + text-decoration: none; + padding-left: 6px; + color: var(--primary-main); +} + +.SignInPageResetPW_link { + padding-top: 16px; + text-decoration: none; +} diff --git a/views/pages/SignInPage/SignInPage.test.jsx b/views/pages/SignInPage/SignInPage.test.jsx new file mode 100644 index 00000000..e6f7de78 --- /dev/null +++ b/views/pages/SignInPage/SignInPage.test.jsx @@ -0,0 +1,40 @@ +import React from 'react' + +import { render, screen } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' + +import SignInPage from '.' +import { AuthContext, NotificationContext } from '../../contexts' + +jest.mock('../../forms/SignInForm') +jest.mock('react-hook-form', () => ({ + ...jest.requireActual('react-hook-form'), + useForm: () => ({ + handleSubmit: () => jest.fn(), + }), + useFormContext: jest.fn(), +})) + +describe('SignIn Page', () => { + test('Sign In Page renders', () => { + render( + + + + + + + + ) + + const signInButton = screen.getByText('Sign In') + const registerCopy = screen.getByText('Need a DPDash Account?') + const registerLink = screen.getByText('Sign Up') + const resetPasswordLink = screen.getByText('Request Password Assistance') + + expect(signInButton).toBeInTheDocument() + expect(registerCopy).toBeInTheDocument() + expect(registerLink).toBeInTheDocument() + expect(resetPasswordLink).toBeInTheDocument() + }) +}) diff --git a/views/pages/SignInPage/index.jsx b/views/pages/SignInPage/index.jsx new file mode 100644 index 00000000..fb8b43a1 --- /dev/null +++ b/views/pages/SignInPage/index.jsx @@ -0,0 +1,53 @@ +import React, { useContext } from 'react' + +import { Typography } from '@mui/material' +import { useNavigate, Link } from 'react-router-dom' + +import api from '../../api' +import { AuthContext, NotificationContext } from '../../contexts' +import SignInForm from '../../forms/SignInForm' +import { routes } from '../../routes/routes' +import './SignInPage.css' + +const SignInPage = () => { + const navigate = useNavigate() + const [, setUser] = useContext(AuthContext) + const [, setNotification] = useContext(NotificationContext) + const onSubmit = async (data) => { + try { + const user = await api.auth.login(data) + + setUser(user) + navigate(routes.main) + } catch (error) { + setNotification({ open: true, message: error.message }) + } + } + + return ( + <> + + Sign In + + + Need a DPDash Account?{' '} + + Sign Up + + + + + Request Password Assistance + + + ) +} + +export default SignInPage diff --git a/views/pages/StudiesPage/StudiesPage.test.jsx b/views/pages/StudiesPage/StudiesPage.test.jsx new file mode 100644 index 00000000..97ea6e82 --- /dev/null +++ b/views/pages/StudiesPage/StudiesPage.test.jsx @@ -0,0 +1,38 @@ +import React from 'react' + +import { render, screen, waitFor } from '@testing-library/react' + +import StudiesPage from '.' +import { createStudyTableRowData } from '../../../test/fixtures' +import api from '../../api' + +describe(StudiesPage, () => { + const renderPage = () => render() + beforeEach(() => { + jest.spyOn(api.userStudies, 'loadAll').mockResolvedValueOnce([ + createStudyTableRowData({ + daysInStudy: 655, + numOfParticipants: 2, + study: 'LA', + updatedAt: '2024-01-05T06:00:00.000Z', + }), + ]) + }) + it('renders the studies page header', async () => { + renderPage() + + await waitFor(() => { + expect(screen.getByText('Studies')).toBeInTheDocument() + }) + }) + + it('renders the studies page table', async () => { + renderPage() + + const table = screen.getByRole('table') + + await waitFor(() => { + expect(table).toBeInTheDocument() + }) + }) +}) diff --git a/views/pages/StudiesPage/index.jsx b/views/pages/StudiesPage/index.jsx new file mode 100644 index 00000000..5b770b4f --- /dev/null +++ b/views/pages/StudiesPage/index.jsx @@ -0,0 +1,50 @@ +import React, { useEffect, useState } from 'react' + +import { Box } from '@mui/material' + +import { SORT_DIRECTION } from '../../../constants' +import api from '../../api' +import PageHeader from '../../components/PageHeader' +import useTableSort from '../../hooks/useTableSort' +import StudiesTable from '../../tables/StudiesTable' + +const siteName = 'siteName' +const study = 'study' + +const StudiesPage = () => { + const [studies, setStudies] = useState([]) + const { onSort, sortDirection, sortBy } = useTableSort(study) + const loadStudies = async () => { + const sortParams = { + ...(sortBy ? { sortBy: sortBy === siteName ? study : sortBy } : {}), + ...(sortDirection ? { sortDirection } : {}), + } + const data = await api.userStudies.loadAll({ sort: sortParams }) + + setStudies(data) + } + const handleRequestSort = (_event, property) => { + const isAsc = sortDirection === SORT_DIRECTION.ASC + + return onSort(property, isAsc ? SORT_DIRECTION.DESC : SORT_DIRECTION.ASC) + } + + useEffect(() => { + loadStudies() + }, [sortBy, sortDirection]) + + return ( + + + + + ) +} + +export default StudiesPage diff --git a/views/pages/ViewChartPage/ViewChartPage.css b/views/pages/ViewChartPage/ViewChartPage.css new file mode 100644 index 00000000..5aa34149 --- /dev/null +++ b/views/pages/ViewChartPage/ViewChartPage.css @@ -0,0 +1,10 @@ +.ChartPageDetails { + display: grid; + grid-template-columns: repeat(12, 1fr); + padding-bottom: 20px; +} +.ChartPageOwner { + display: flex; + grid-column-start: 4; + grid-column-end: 12; +} diff --git a/views/pages/ViewChartPage/index.jsx b/views/pages/ViewChartPage/index.jsx new file mode 100644 index 00000000..7d629ba7 --- /dev/null +++ b/views/pages/ViewChartPage/index.jsx @@ -0,0 +1,225 @@ +import React, { useEffect, useState } from 'react' + +import { Box, Typography, useMediaQuery } from '@mui/material' +import dayjs from 'dayjs' +import advanced from 'dayjs/plugin/advancedFormat' +import timezone from 'dayjs/plugin/timezone' +import utc from 'dayjs/plugin/utc' +import FileSaver from 'file-saver' +import qs from 'qs' +import { useParams, useLocation, useNavigate } from 'react-router-dom' + +import { SORT_DIRECTION, fontSize, TOTALS } from '../../../constants' +import api from '../../api' +import BarGraph from '../../components/BarGraph' +import ChartDescription from '../../components/ChartDescription' +import GraphTable from '../../components/GraphTable' +import PageHeader from '../../components/PageHeader' +import ChartFilterForm from '../../forms/ChartFilterForm' +import useTableSort from '../../hooks/useTableSort' +import { ChartFiltersModel } from '../../models' +import { apiRoutes, routes } from '../../routes/routes' + +import './ViewChartPage.css' + +dayjs.extend(utc) +dayjs.extend(timezone) +dayjs.extend(advanced) + +const tooltipWidth = 235 +const staticYPosition = 75 + +const ViewChartPage = () => { + const { search } = useLocation() + const { chart_id } = useParams() + const [graph, setGraph] = useState(null) + const [xAxisWidth, setXAxisWidth] = useState(0) + const [expanded, setExpanded] = useState(false) + const [tooltipPosition, setTooltipPosition] = useState({}) + const [displayLeft, setDisplayLeft] = useState(true) + const [page, setPage] = useState(0) + const [rowsPerPage, setRowsPerPage] = useState(5) + const shortDescription = graph?.description?.substring(0, 296) + '...' || '' + const handleDescriptionExpand = () => setExpanded(!expanded) + const navigate = useNavigate() + const { onSort, sortDirection, sortBy } = useTableSort('site') + const onSubmit = async (formValues) => { + const filters = ChartFiltersModel.formValuesToRequestFilters( + formValues, + graph.filters + ) + + const newRoute = routes.viewChart(chart_id, { filters }) + + navigate(newRoute) + } + const fetchGraph = async (chart_id, filters) => + await api.charts.chartsData.show(chart_id, { filters }) + + const fetchGraphTableCSV = async (chart_id, filters, filename) => { + const res = await fetch(apiRoutes.chartCsv.show(chart_id, { filters }), { + headers: { + 'Content-Type': 'text/csv', + }, + method: 'GET', + }) + const graphTableData = await res.blob() + + FileSaver.saveAs(graphTableData, `${filename}.csv`) + + return res + } + const handleNavigateToChartPage = () => navigate('/charts') + const handleTooltipPosition = ({ chartWidth, xCoordinate }) => { + const isXCoordinateGreater = chartWidth - tooltipWidth < xCoordinate + + if (isXCoordinateGreater) { + setTooltipPosition({ x: xCoordinate - tooltipWidth, y: staticYPosition }) + setDisplayLeft(false) + } else { + setTooltipPosition({ x: xCoordinate, y: staticYPosition }) + setDisplayLeft(true) + } + } + const graphDisplayParams = { + sm: { + isSm: useMediaQuery('(max-width:600px)'), + barsToDisplay: 3, + }, + tablet: { + isTablet: useMediaQuery('(min-width:600px) and (max-width:900px)'), + barsToDisplay: 4, + }, + md: { + isMd: useMediaQuery('(min-width:1100px) and (max-width:1500px)'), + barsToDisplay: 6, + }, + lg: { + isLg: useMediaQuery('(min-width:2000px)'), + barsToDisplay: 10, + }, + } + const handleChangePage = (_, newPage) => setPage(newPage) + const handleChangeRowsPerPage = (event) => { + setRowsPerPage(parseInt(event.target.value, 10)) + setPage(0) + } + const graphTablePredicate = (a, b) => { + if (a[sortBy] === TOTALS || b[sortBy] === TOTALS) return 1 + if (b[sortBy] < a[sortBy]) { + return sortDirection === SORT_DIRECTION.ASC ? 1 : -1 + } + if (b[sortBy] > a[sortBy]) { + return sortDirection === SORT_DIRECTION.ASC ? -1 : 1 + } + return 0 + } + const visibleRows = () => { + if (!graph) return [] + + return graph.graphTable.tableRows + .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) + .sort(graphTablePredicate) + } + + useEffect(() => { + const parsedQuery = qs.parse(search.replace(/^\?/, '')) + + fetchGraph(chart_id, parsedQuery.filters).then((newGraph) => { + setGraph(newGraph) + }) + }, [chart_id, search]) + + if (!graph) return
Loading...
+ + const shouldDisplaySiteName = () => { + if (graphDisplayParams.sm.isSm) + return graph.dataBySite.length <= graphDisplayParams.sm.barsToDisplay + if (graphDisplayParams.tablet.isTablet) + return graph.dataBySite.length <= graphDisplayParams.tablet.barsToDisplay + if (graphDisplayParams.md.isMd) + return graph.dataBySite.length <= graphDisplayParams.md.barsToDisplay + if (graphDisplayParams.lg.isLg) + return graph.dataBySite.length <= graphDisplayParams.lg.barsToDisplay + } + const useSiteName = shouldDisplaySiteName() + + return ( + + + } + /> +
+ + Last Modified: + {graph.lastModified + ? dayjs(graph.lastModified).format('MMM D YYYY @ hh:mm Z') + : ''} + + + + Created by: + + + {` ${graph.chartOwner.display_name}`} + + +
+ + + {!!graph.dataBySite.length && ( + + )} +
+ ) +} + +export default ViewChartPage diff --git a/views/routes/index.jsx b/views/routes/index.jsx new file mode 100644 index 00000000..85136846 --- /dev/null +++ b/views/routes/index.jsx @@ -0,0 +1,76 @@ +import { Routes, Route, Navigate, BrowserRouter } from 'react-router-dom' + +import { routes } from './routes' +import AuthenticatedRoute from '../hoc/AuthenticatedRoute' +import HeroLayout from '../layouts/HeroLayout' +import MainLayout from '../layouts/MainLayout' +import AccountPage from '../pages/AccountPage' +import AdminPage from '../pages/AdminPage' +import AdminCheck from '../pages/AdminPage/AdminCheck' +import ChartsPage from '../pages/ChartsPage' +import ConfigurationsPage from '../pages/ConfigurationsPage' +import DashboardPage from '../pages/DashboardPage' +import EditChartPage from '../pages/EditChartPage' +import EditConfigPage from '../pages/EditConfigPage' +import GraphPage from '../pages/GraphPage' +import NewChartPage from '../pages/NewChartPage' +import NewConfigPage from '../pages/NewConfigPage' +import ParticipantsPage from '../pages/ParticipantsPage' +import RegistrationPage from '../pages/RegistrationPage' +import ResetPasswordPage from '../pages/ResetPasswordPage' +import SignInPage from '../pages/SignInPage' +import StudiesPage from '../pages/StudiesPage' +import ViewChartPage from '../pages/ViewChartPage' + +const Router = () => { + return ( + + + }> + } + /> + } /> + } /> + } /> + + + + + + } + > + } /> + } /> + } + /> + } /> + } /> + } /> + + + + } + /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + ) +} + +export default Router diff --git a/views/routes/routes.js b/views/routes/routes.js new file mode 100644 index 00000000..084ae257 --- /dev/null +++ b/views/routes/routes.js @@ -0,0 +1,106 @@ +import qs from 'qs' + +const apiPath = '/api/v1' + +export const routes = { + admin: '/admin', + charts: '/charts', + configurations: '/configurations', + contactUs: '/contact-us', + dashboard: (study = ':study', subject = ':subject') => + `${routes.dashboards}/${study}/${subject}`, + dashboards: `/dashboard`, + editChart: (chartId) => `/charts/${chartId}/edit`, + editChartPage: '/charts/:chart_id/edit', + editConfigPage: '/config/:config_id/edit', + editConfiguration: (configId) => `/config/${configId}/edit`, + help: '/help', + home: `/`, + logout: '/logout', + main: '/main', + newChart: '/charts/new', + newConfiguration: '/configs/new', + participants: '/participants', + privacyPolicy: '/privacy-policy', + previewProfile: '/preview-profile', + termsOfUse: '/terms-of-use', + resetpw: '/reset-password', + register: '/register', + signin: '/signin', + studyDashboard: (study = ':study') => `${routes.dashboards}/${study}`, + studies: '/studies', + userAccount: '/user-account', + viewChart: (chartId, queryParams) => + queryParams + ? `/charts/${chartId}${qs.stringify(queryParams, { + addQueryPrefix: true, + })}` + : `/charts/${chartId}`, + viewChartPage: '/charts/:chart_id', + viewConfiguration: (configId) => `/u/configure?s=view&id=${configId}`, +} + +export const apiRoutes = { + admin: { + users: { + show: (uid) => `${apiPath}/admin/users/${uid}`, + }, + studies: { + all: `${apiPath}/admin/search/studies`, + }, + }, + assessments: { + index: `${apiPath}/assessments`, + }, + auth: { + login: `${apiPath}/login`, + logout: `${apiPath}/logout`, + me: `${apiPath}/me`, + resetPassword: `${apiPath}/resetpw`, + signup: `${apiPath}/signup`, + }, + chart: { + show: (chart_id) => `${apiPath}/charts/${chart_id}`, + index: `${apiPath}/charts`, + }, + chartData: { + show: (chartId) => `${apiPath}/charts/${chartId}/data`, + }, + chartCsv: { + show: (chartId, queryParams) => + queryParams + ? `${apiPath}/charts/${chartId}/data?${qs.stringify(queryParams)}` + : `${apiPath}/charts/${chartId}/data`, + }, + configurations: { + activeUserConfigurations: (uid) => `${apiPath}/users/${uid}/active-configs`, + userConfigurations: (uid) => `${apiPath}/users/${uid}/configs`, + userConfiguration: (uid, config_id) => + `${apiRoutes.configurations.userConfigurations(uid)}/${config_id}`, + configurationFileUpload: (uid) => + `${apiRoutes.configurations.userConfigurations(uid)}/file`, + }, + dashboards: { + show: (study = ':study', subject = ':subject') => + `${apiPath}/dashboards/${study}/${subject}`, + }, + duplicateChart: { + show: `${apiPath}/charts/duplicate`, + }, + participants: { + index: `${apiPath}/participants`, + }, + preferences: (uid) => `${apiPath}/users/${uid}/preferences`, + shareChart: { + show: (chart_id) => `${apiPath}/charts/${chart_id}/share`, + }, + userStudies: { + index: `${apiPath}/user-studies`, + }, + subjects: (studies) => `${apiPath}/subjects?q=${JSON.stringify(studies)}`, + subject: `${apiPath}/subjects`, + users: { + index: `${apiPath}/users`, + show: (uid) => `${apiPath}/users/${uid}`, + }, +} diff --git a/views/tables/AdminUsersTable/AdminUsersTable.test.jsx b/views/tables/AdminUsersTable/AdminUsersTable.test.jsx new file mode 100644 index 00000000..7a79c494 --- /dev/null +++ b/views/tables/AdminUsersTable/AdminUsersTable.test.jsx @@ -0,0 +1,34 @@ +import { screen } from '@testing-library/react' + +import AdminUsersTable from '.' +import { createUser } from '../../../test/fixtures' +import renderPage from '../../../test/PageRenderer' + +describe('AdminUsersTable', () => { + const users = [ + createUser({ + uid: 'user', + mail: 'test@example.com', + role: 'admin', + }), + createUser({ + uid: 'foo', + mail: 'foo@example.com', + role: 'member', + }), + ] + it('renders the table', () => { + renderPage(AdminUsersTable, { + users, + onAccess: jest.fn(), + onUserBlock: jest.fn(), + onResetPassword: jest.fn(), + onDeleteUser: jest.fn(), + onChangeAccountExpiration: jest.fn(), + }) + + expect(screen.getByRole('table')).toBeInTheDocument() + expect(screen.getByText('test@example.com')).toBeInTheDocument() + expect(screen.getByText('foo@example.com')).toBeInTheDocument() + }) +}) diff --git a/views/tables/AdminUsersTable/index.jsx b/views/tables/AdminUsersTable/index.jsx new file mode 100644 index 00000000..64518a9b --- /dev/null +++ b/views/tables/AdminUsersTable/index.jsx @@ -0,0 +1,118 @@ +import React from 'react' + +import { Settings, Clear, LockOpen } from '@mui/icons-material' +import { IconButton, Checkbox } from '@mui/material' +import { DatePicker } from '@mui/x-date-pickers/DatePicker' +import dayjs from 'dayjs' + +import Table from '../Table' + +const AdminUsersTable = (props) => { + const headers = [ + { + dataProperty: 'uid', + label: 'Username', + sortable: false, + }, + { + dataProperty: 'display_name', + label: 'Name', + sortable: false, + }, + { + dataProperty: 'mail', + label: 'Email', + sortable: false, + }, + { + dataProperty: 'role', + label: 'Role', + sortable: false, + }, + { + dataProperty: 'access', + label: 'Access', + sortable: false, + }, + { + dataProperty: 'account_expires', + label: 'Account Expiration', + sortable: false, + }, + { + dataProperty: 'force_reset_pw', + label: 'Reset Password', + sortable: false, + }, + { + dataProperty: 'blocked', + label: 'Inactive', + sortable: false, + }, + { + dataProperty: 'delete', + label: 'Delete', + sortable: false, + }, + ] + + const cellRenderer = (user, property, rowIndex) => { + switch (property) { + case 'access': + return ( +
+ props.onAccess(rowIndex)} /> +
+ ) + case 'account_expires': + return ( + + props.onChangeAccountExpiration(rowIndex, value) + } + /> + ) + case 'force_reset_pw': + return ( +
+ props.onResetPassword(rowIndex)} + > + + +
+ ) + case 'blocked': + return ( + props.onUserBlock(rowIndex)} + /> + ) + case 'delete': + return ( +
+ props.onDeleteUser(rowIndex)} + > + + +
+ ) + default: + return user[property] + } + } + + return ( +
+ ) +} + +export default AdminUsersTable diff --git a/views/tables/ChartsTable/ChartsTable.css b/views/tables/ChartsTable/ChartsTable.css new file mode 100644 index 00000000..eed3b298 --- /dev/null +++ b/views/tables/ChartsTable/ChartsTable.css @@ -0,0 +1,3 @@ +.ChartsTable_Profile { + display: flex; +} diff --git a/views/tables/ChartsTable/ChartsTable.test.jsx b/views/tables/ChartsTable/ChartsTable.test.jsx new file mode 100644 index 00000000..c63c0432 --- /dev/null +++ b/views/tables/ChartsTable/ChartsTable.test.jsx @@ -0,0 +1,214 @@ +import React from 'react' + +import { render, screen, within } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +import dayjs from 'dayjs' +import { MemoryRouter } from 'react-router-dom' + +import ChartsTable from '.' +import { DATE_FORMAT } from '../../../constants' +import { createChart, createUser } from '../../../test/fixtures' +import { routes } from '../../routes/routes' + +describe(ChartsTable, () => { + const user = createUser({ uid: 'user', favoriteCharts: ['2'] }) + + const charts = [ + createChart({ + title: 'third chart', + updatedAt: '2022-10-11T16:33:46.485Z', + owner: 'bar', + chartOwner: { + display_name: 'Jack Jackson', + }, + favorite: true, + }), + createChart({ + title: 'first chart', + updatedAt: '2023-06-28T15:43:23.789Z', + owner: user.uid, + chartOwner: { display_name: 'John Johnson' }, + favorite: false, + }), + createChart({ + title: 'second chart', + updatedAt: '2022-11-10T00:01:04.713Z', + owner: 'foo', + chartOwner: { + display_name: 'Jane Janeson', + }, + favorite: false, + }), + ] + const defaultProps = { + charts, + onDelete: () => {}, + onDuplicate: () => {}, + onShare: () => {}, + onFavorite: () => {}, + user, + } + const renderChart = (props = defaultProps) => + render( + + + + ) + const elements = { + editLink: () => screen.getByTestId('edit'), + deleteBtn: () => screen.getByText('Delete'), + duplicateBtn: () => screen.getByText('Duplicate'), + shareBtn: () => screen.getByText('Share'), + favoriteCheckbox: (chart) => + screen.getByRole('checkbox', { name: chart._id }), + tableRow: (tableRow) => screen.getByTestId(`row-${tableRow}`), + } + const actions = { + openTableRowMenu: async (chart) => + await userEvent.click(screen.getByTestId(chart._id)), + deleteChart: async (chart) => { + await actions.openTableRowMenu(chart) + await userEvent.click(elements.deleteBtn()) + }, + duplicateChart: async (chart) => { + await actions.openTableRowMenu(chart) + await userEvent.click(elements.duplicateBtn()) + }, + shareChart: async (chart) => { + await actions.openTableRowMenu(chart) + await userEvent.click(elements.shareBtn()) + }, + favoriteChart: async () => { + await userEvent.click(elements.tableRow(2)).getByRole('checkbox') + }, + } + + it('renders charts', () => { + renderChart() + + expect( + within(elements.tableRow(0)).getByText(charts[0].title) + ).toBeInTheDocument() + expect( + within(elements.tableRow(0)).getByText(charts[0].chartOwner.display_name) + ).toBeInTheDocument() + expect( + within(elements.tableRow(0)).getByText( + dayjs(charts[0].updatedAt).format(DATE_FORMAT) + ) + ).toBeInTheDocument() + expect(within(elements.tableRow(0)).getByRole('checkbox')).toBeChecked() + + expect( + within(elements.tableRow(1)).getByText(charts[1].title) + ).toBeInTheDocument() + expect( + within(elements.tableRow(1)).getByText(charts[1].chartOwner.display_name) + ).toBeInTheDocument() + expect( + within(elements.tableRow(1)).getByText( + dayjs(charts[1].updatedAt).format(DATE_FORMAT) + ) + ).toBeInTheDocument() + expect(within(elements.tableRow(1)).getByRole('checkbox')).not.toBeChecked() + + expect( + within(elements.tableRow(2)).getByText(charts[2].title) + ).toBeInTheDocument() + expect( + within(elements.tableRow(2)).getByText(charts[2].chartOwner.display_name) + ).toBeInTheDocument() + expect( + within(elements.tableRow(2)).getByText( + dayjs(charts[2].updatedAt).format(DATE_FORMAT) + ) + ).toBeInTheDocument() + expect(within(elements.tableRow(2)).getByRole('checkbox')).not.toBeChecked() + }) + + it('renders a menu of chart actions', async () => { + renderChart() + + await actions.openTableRowMenu(charts[1]) + + expect(elements.editLink()).toHaveAttribute( + 'href', + routes.editChart(charts[1]._id) + ) + expect(elements.deleteBtn()).toBeInTheDocument() + expect(elements.duplicateBtn()).toBeInTheDocument() + expect(elements.shareBtn()).toBeInTheDocument() + }) + + describe('when the user is the chart owner', () => { + it('calls the onDelete prop when "delete" is clicked', async () => { + const props = { ...defaultProps, onDelete: jest.fn() } + + renderChart(props) + await actions.deleteChart(charts[1]) + + expect(props.onDelete).toHaveBeenCalledWith(charts[1]) + }) + + it('calls the onDuplicate prop when "duplicate" is clicked', async () => { + const props = { ...defaultProps, onDuplicate: jest.fn() } + + renderChart(props) + await actions.duplicateChart(charts[1]) + + expect(props.onDuplicate).toHaveBeenCalledWith(charts[1]) + }) + + it('calls the onShare prop when "share" is clicked', async () => { + const props = { ...defaultProps, onShare: jest.fn() } + + renderChart(props) + await actions.shareChart(charts[0]) + + expect(props.onShare).toHaveBeenCalledWith(charts[0]) + }) + }) + + describe('when the user is not the chart owner', () => { + it('does not call the onDelete prop when "delete" is clicked', async () => { + expect.assertions(1) + const props = { ...defaultProps, onDelete: jest.fn() } + + renderChart(props) + + try { + await actions.deleteChart(charts[0]) + } catch { + expect(props.onDelete).not.toHaveBeenCalled() + } + }) + + it('calls the onDuplicate prop when "duplicate" is clicked', async () => { + const props = { ...defaultProps, onDuplicate: jest.fn() } + + renderChart(props) + await actions.duplicateChart(charts[1]) + + expect(props.onDuplicate).toHaveBeenCalledWith(charts[1]) + }) + + it('calls the onShare prop when "share" is clicked', async () => { + const props = { ...defaultProps, onShare: jest.fn() } + + renderChart(props) + await actions.shareChart(charts[1]) + + expect(props.onShare).toHaveBeenCalledWith(charts[1]) + }) + }) + describe('when user favorites a chart', () => { + it('calls the onFavorite prop when star icon is clicked', async () => { + const props = { ...defaultProps, onFavorite: jest.fn() } + + renderChart(props) + await userEvent.click(within(elements.tableRow(2)).getByRole('checkbox')) + + expect(props.onFavorite).toHaveBeenCalledWith(charts[2]) + }) + }) +}) diff --git a/views/tables/ChartsTable/index.jsx b/views/tables/ChartsTable/index.jsx new file mode 100644 index 00000000..3a5d6601 --- /dev/null +++ b/views/tables/ChartsTable/index.jsx @@ -0,0 +1,162 @@ +import React from 'react' + +import { + Star, + StarBorder, + ContentCopy, + Edit, + Delete, + Share, +} from '@mui/icons-material' +import { Typography, Checkbox } from '@mui/material' +import dayjs from 'dayjs' +import { Link } from 'react-router-dom' + +import { SORT_DIRECTION, DATE_FORMAT } from '../../../constants' +import { ChartModel } from '../../models/' +import { routes } from '../../routes/routes' +import Table from '../Table' +import TableMenu from '../Table/TableMenu' + +import './ChartsTable.css' + +const ChartsTable = ({ + charts, + maxRows, + onDelete, + onDuplicate, + onFavorite, + onShare, + onSort, + sortable, + sortDirection, + sortProperty, + user, +}) => { + const headers = [ + { + dataProperty: 'title', + label: 'Chart', + sortable: !!sortable, + }, + { + dataProperty: 'updatedAt', + label: 'Date Modified', + sortable: !!sortable, + }, + { + dataProperty: 'owner', + label: 'Created By', + sortable: !!sortable, + }, + { + dataProperty: 'star', + label: '', + sortable: false, + }, + { + dataProperty: 'info', + dataAlign: 'right', + label: '', + sortable: false, + }, + ] + const handleRequestSort = (_event, property) => { + const isAsc = + sortProperty === property && sortDirection === SORT_DIRECTION.ASC + + return onSort(property, isAsc ? SORT_DIRECTION.DESC : SORT_DIRECTION.ASC) + } + const cellRenderer = (chart, property) => { + switch (property) { + case 'info': { + const chartOwnedByUser = ChartModel.isOwnedByUser(chart, user) + + return ( + onDelete(chart), + disabled: !chartOwnedByUser, + text: 'Delete', + }, + { + Icon: ContentCopy, + onClick: () => onDuplicate(chart), + text: 'Duplicate', + }, + { + Icon: Share, + onClick: () => onShare(chart), + text: 'Share', + }, + ]} + /> + ) + } + case 'owner': + return ( +
+ + {chart['chartOwner'].display_name} + +
+ ) + case 'star': + return ( + } + checked={chart.favorite} + checkedIcon={} + onChange={() => onFavorite(chart)} + sx={{ + border: 1, + borderRadius: '8px', + borderColor: 'primary.light', + }} + /> + ) + case 'title': { + const viewChart = routes.viewChart(chart._id) + + return ( + + + {chart[property]} + + + ) + } + case 'updatedAt': + return chart[property] ? dayjs(chart[property]).format(DATE_FORMAT) : '' + default: + return chart[property] + } + } + + return ( +
+ ) +} + +export default ChartsTable diff --git a/views/tables/ConfigurationsTable/ConfigurationsTable.test.jsx b/views/tables/ConfigurationsTable/ConfigurationsTable.test.jsx new file mode 100644 index 00000000..8eb219ec --- /dev/null +++ b/views/tables/ConfigurationsTable/ConfigurationsTable.test.jsx @@ -0,0 +1,188 @@ +import React from 'react' + +import { render, screen, within } from '@testing-library/react' +import userEvent from '@testing-library/user-event' + +import ConfigurationsTable from '.' +import { createUser, createConfiguration } from '../../../test/fixtures' + +describe('ConfigurationsTable', () => { + const user = createUser({ uid: 'user', preferences: { config: '1' } }) + const configurations = [ + createConfiguration({ + name: 'config1', + owner: user.uid, + owner_display_name: ['User'], + readers: ['user', 'foo', 'bar'], + }), + createConfiguration({ + _id: '2', + name: 'config2', + owner: 'foo', + owner_display_name: ['Foo'], + readers: ['foo'], + }), + createConfiguration({ + _id: '3', + name: 'config3', + readers: ['user', 'bar'], + owner: 'bar', + owner_display_name: ['Bar'], + }), + ] + const defaultProps = { + configurations, + onDefaultChange: () => {}, + onDelete: () => {}, + onDuplicate: () => {}, + onEdit: () => {}, + onShare: () => {}, + user, + } + const elements = { + editBtn: () => screen.getByTestId('EditIcon'), + deleteBtn: () => screen.getByTestId('DeleteIcon'), + duplicateBtn: () => screen.getByTestId('ContentCopyIcon'), + shareBtn: () => screen.getByTestId('ShareIcon'), + setDefaultBtn: () => screen.getByTestId('SettingsApplicationsIcon'), + tableRow: (tableRow) => screen.getByTestId(`row-${tableRow}`), + } + const renderConfigurationsTable = (props = defaultProps) => + render() + const actions = { + openTableRowMenu: async (configuration) => + await userEvent.click(screen.getByTestId(configuration._id)), + deleteConfiguration: async (configuration) => { + await actions.openTableRowMenu(configuration) + await userEvent.click(elements.deleteBtn()) + }, + duplicateConfiguration: async (configuration) => { + await actions.openTableRowMenu(configuration) + await userEvent.click(elements.duplicateBtn()) + }, + shareConfiguration: async (configuration) => { + await actions.openTableRowMenu(configuration) + await userEvent.click(elements.shareBtn()) + }, + setDefaultConfiguration: async (configuration) => { + await actions.openTableRowMenu(configuration) + await userEvent.click(elements.setDefaultBtn()) + }, + } + + it('renders chart', () => { + renderConfigurationsTable() + + expect( + within(elements.tableRow(0)).getByText(configurations[0].name) + ).toBeInTheDocument() + expect( + within(elements.tableRow(0)).getByText( + configurations[0].owner_display_name[0] + ) + ).toBeInTheDocument() + expect( + within(elements.tableRow(0)).getByText('Default') + ).toBeInTheDocument() + + expect( + within(elements.tableRow(1)).getByText(configurations[1].name) + ).toBeInTheDocument() + expect( + within(elements.tableRow(1)).getByText( + configurations[1].owner_display_name[0] + ) + ).toBeInTheDocument() + + expect( + within(elements.tableRow(2)).getByText(configurations[2].name) + ).toBeInTheDocument() + expect( + within(elements.tableRow(2)).getByText( + configurations[2].owner_display_name[0] + ) + ).toBeInTheDocument() + }) + + it('renders a menu of actions', async () => { + renderConfigurationsTable() + await actions.openTableRowMenu(configurations[0]) + + expect(elements.editBtn()).toBeInTheDocument() + expect(elements.deleteBtn()).toBeInTheDocument() + expect(elements.duplicateBtn()).toBeInTheDocument() + expect(elements.shareBtn()).toBeInTheDocument() + expect(elements.setDefaultBtn()).toBeInTheDocument() + }) + + describe('when the user is the configuration owner', () => { + it('calls the onDelete prop when "delete" is clicked', async () => { + const props = { ...defaultProps, onDelete: jest.fn() } + + renderConfigurationsTable(props) + await actions.deleteConfiguration(configurations[0]) + + expect(props.onDelete).toHaveBeenCalledWith(configurations[0]._id) + }) + + it('calls the onDuplicate prop when "duplicate" is clicked', async () => { + const props = { ...defaultProps, onDuplicate: jest.fn() } + + renderConfigurationsTable(props) + await actions.duplicateConfiguration(configurations[0]) + + expect(props.onDuplicate).toHaveBeenCalledWith(configurations[0]) + }) + + it('calls the onShare prop when "share" is clicked', async () => { + const props = { ...defaultProps, onShare: jest.fn() } + + renderConfigurationsTable(props) + await actions.shareConfiguration(configurations[0]) + + expect(props.onShare).toHaveBeenCalledWith(configurations[0]) + }) + + it('calls the onDefaultChange prop when "share" is clicked', async () => { + const props = { ...defaultProps, onDefaultChange: jest.fn() } + + renderConfigurationsTable(props) + await actions.setDefaultConfiguration(configurations[0]) + + expect(props.onDefaultChange).toHaveBeenCalledWith(configurations[0]._id) + }) + }) + + describe('when the user is not the configuration owner', () => { + it('does not call the onDelete prop when "delete" is clicked', async () => { + expect.assertions(1) + const props = { ...defaultProps, onDelete: jest.fn() } + + renderConfigurationsTable(props) + + try { + await actions.deleteConfiguration(configurations[1]) + } catch { + expect(props.onDelete).not.toHaveBeenCalled() + } + }) + + it('calls the onDuplicate prop when "duplicate" is clicked', async () => { + const props = { ...defaultProps, onDuplicate: jest.fn() } + + renderConfigurationsTable(props) + await actions.duplicateConfiguration(configurations[1]) + + expect(props.onDuplicate).toHaveBeenCalledWith(configurations[1]) + }) + + it('calls the onDefaultChange when "set as default" is clicked', async () => { + const props = { ...defaultProps, onDefaultChange: jest.fn() } + + renderConfigurationsTable(props) + await actions.setDefaultConfiguration(configurations[1]) + + expect(props.onDefaultChange).toHaveBeenCalledWith(configurations[1]._id) + }) + }) +}) diff --git a/views/tables/ConfigurationsTable/index.jsx b/views/tables/ConfigurationsTable/index.jsx new file mode 100644 index 00000000..96c84875 --- /dev/null +++ b/views/tables/ConfigurationsTable/index.jsx @@ -0,0 +1,152 @@ +import React from 'react' + +import { + Share, + Delete, + ContentCopy, + Edit, + SettingsApplications, +} from '@mui/icons-material' +import { Chip } from '@mui/material' + +import { borderRadius, fontSize } from '../../../constants' +import { UserConfigModel } from '../../models' +import Table from '../Table' +import TableMenu from '../Table/TableMenu' + +const ConfigurationsTable = (props) => { + const { + configurations, + onDefaultChange, + onDelete, + onDuplicate, + onEdit, + onShare, + user, + maxRows, + } = props + const headers = [ + { dataProperty: 'name', label: 'Configuration Name', sortable: false }, + { + dataProperty: 'owner_display_name', + label: 'Created By', + sortable: false, + }, + { + dataProperty: 'status', + label: 'Status', + sortable: false, + }, + { + dataProperty: 'default', + label: '', + sortable: false, + }, + + { + dataProperty: 'info', + dataAlign: 'right', + label: '', + sortable: false, + }, + ] + + const cellRenderer = (configuration, property) => { + const currentConfiguration = user.preferences.config === configuration._id + const ownsConfig = user.uid === configuration.owner + + switch (property) { + case 'default': + return ( + currentConfiguration && ( + + ) + ) + case 'info': + return ( + onEdit(configuration._id), + Icon: Edit, + text: 'Edit', + }, + { + disabled: !ownsConfig, + onClick: () => onShare(configuration), + Icon: Share, + text: 'Share', + }, + { + disabled: !ownsConfig, + onClick: () => onDelete(configuration._id), + Icon: Delete, + text: 'Delete', + }, + { + onClick: () => onDuplicate(configuration), + Icon: ContentCopy, + text: 'Duplicate', + }, + { + onClick: () => onDefaultChange(configuration._id), + Icon: SettingsApplications, + text: 'Set as default', + }, + ]} + /> + ) + case 'status': + return UserConfigModel.isActive(configuration, property) ? ( + + ) : ( + + ) + default: + return configuration[property] + } + } + + return ( +
+ ) +} + +export default ConfigurationsTable diff --git a/views/tables/ParticipantsTable/index.jsx b/views/tables/ParticipantsTable/index.jsx new file mode 100644 index 00000000..0aa69e81 --- /dev/null +++ b/views/tables/ParticipantsTable/index.jsx @@ -0,0 +1,165 @@ +import React from 'react' + +import { Star, StarBorder } from '@mui/icons-material' +import { Checkbox, Typography, Tooltip } from '@mui/material' +import dayjs from 'dayjs' +import isToday from 'dayjs/plugin/isToday' +import isYesterday from 'dayjs/plugin/isYesterday' +import { Link } from 'react-router-dom' + +import { SORT_DIRECTION } from '../../../constants' +import { SITE_NAMES } from '../../../server/utils/siteNames' +import StatusChip from '../../components/StatusChip' +import { routes } from '../../routes/routes' +import Table from '../Table' + +dayjs.extend(isYesterday) +dayjs.extend(isToday) + +const ParticipantsTable = (props) => { + const { + onSort, + onStar, + participants, + sortable, + sortDirection, + sortProperty, + maxRows, + } = props + const handleRequestSort = (_event, property) => { + const isAsc = + sortProperty === property && sortDirection === SORT_DIRECTION.ASC + + return onSort(property, isAsc ? SORT_DIRECTION.DESC : SORT_DIRECTION.ASC) + } + const headers = [ + { + dataProperty: 'participant', + label: 'Participant ID', + sortable: !!sortable, + }, + { + dataProperty: 'study', + label: 'Study', + sortable: !!sortable, + }, + { + dataProperty: 'daysInStudy', + label: 'Days In Study', + sortable: !!sortable, + }, + { + dataProperty: 'synced', + label: 'Last synced', + sortable: !!sortable, + }, + { + dataProperty: 'Active', + label: 'Status', + sortable: !!sortable, + }, + { + dataProperty: 'star', + label: '', + sortable: false, + }, + ] + const cellRenderer = (participant, property) => { + switch (property) { + case 'synced': { + const syncedValue = participant[property] + const participantSyncedDate = dayjs(syncedValue) + + if (syncedValue && participantSyncedDate.isValid()) { + const isToday = participantSyncedDate.isToday() + const isYesterday = participantSyncedDate.isYesterday() + const isTodayOrYesterday = isToday || isYesterday + + return ( + + {isToday + ? 'Today' + : isYesterday + ? 'Yesterday' + : participantSyncedDate.format('MMM-D-YYYY')} + + ) + } + + return '' + } + case 'participant': { + const { study } = participant + + return ( + + {participant[property]} + + ) + } + case 'Active': { + const isActive = participant[property] === 1 + + return + } + case 'star': + return ( + } + checked={participant.star} + checkedIcon={} + value={participant.participant} + onChange={onStar} + sx={{ + border: 1, + borderRadius: '8px', + borderColor: 'primary.light', + }} + /> + ) + case 'study': { + const participantProperty = participant[property] + const tooltipTitle = + SITE_NAMES[participantProperty] || participantProperty + + return ( + + + {participantProperty} + + + ) + } + default: + return participant[property] + } + } + + return ( +
+ ) +} + +export default ParticipantsTable diff --git a/views/tables/StudiesTable/StudiesTable.test.jsx b/views/tables/StudiesTable/StudiesTable.test.jsx new file mode 100644 index 00000000..da795bef --- /dev/null +++ b/views/tables/StudiesTable/StudiesTable.test.jsx @@ -0,0 +1,84 @@ +import React from 'react' + +import { render, screen, within } from '@testing-library/react' + +import StudiesTable from '.' +import { SITE_NAMES } from '../../../server/utils/siteNames' +import { createStudyTableRowData } from '../../../test/fixtures' + +describe(StudiesTable, () => { + const studies = [ + createStudyTableRowData({ + daysInStudy: 655, + numOfParticipants: 2, + study: 'LA', + updatedAt: '2024-01-05T06:00:00.000Z', + }), + createStudyTableRowData({ + daysInStudy: 1005, + numOfParticipants: 2, + study: 'MA', + updatedAt: '2024-01-05T06:00:00.000Z', + }), + createStudyTableRowData({ + daysInStudy: 105, + numOfParticipants: 2, + study: 'YA', + updatedAt: '2024-01-05T06:00:00.000Z', + }), + ] + const defaultProps = { + studies, + onDelete: () => {}, + onDuplicate: () => {}, + onShare: () => {}, + onFavorite: () => {}, + } + const tableRow = (rowNum) => screen.getByTestId(`row-${rowNum}`) + const renderTable = (props = defaultProps) => + render() + + it('renders the studies table', () => { + renderTable() + + expect(within(tableRow(0)).getByText(studies[0].study)).toBeInTheDocument() + expect( + within(tableRow(0)).getByText(SITE_NAMES[studies[0].study]) + ).toBeInTheDocument() + expect( + within(tableRow(0)).getByText(studies[0].daysInStudy) + ).toBeInTheDocument() + expect( + within(tableRow(0)).getByText(studies[0].numOfParticipants) + ).toBeInTheDocument() + expect( + within(tableRow(0)).getByText(studies[0].updatedAt) + ).toBeInTheDocument() + expect(within(tableRow(1)).getByText(studies[1].study)).toBeInTheDocument() + expect( + within(tableRow(1)).getByText(SITE_NAMES[studies[1].study]) + ).toBeInTheDocument() + expect( + within(tableRow(1)).getByText(studies[1].daysInStudy) + ).toBeInTheDocument() + expect( + within(tableRow(1)).getByText(studies[1].numOfParticipants) + ).toBeInTheDocument() + expect( + within(tableRow(1)).getByText(studies[1].updatedAt) + ).toBeInTheDocument() + expect(within(tableRow(2)).getByText(studies[2].study)).toBeInTheDocument() + expect( + within(tableRow(2)).getByText(SITE_NAMES[studies[2].study]) + ).toBeInTheDocument() + expect( + within(tableRow(2)).getByText(studies[2].daysInStudy) + ).toBeInTheDocument() + expect( + within(tableRow(2)).getByText(studies[2].numOfParticipants) + ).toBeInTheDocument() + expect( + within(tableRow(2)).getByText(studies[2].updatedAt) + ).toBeInTheDocument() + }) +}) diff --git a/views/tables/StudiesTable/index.jsx b/views/tables/StudiesTable/index.jsx new file mode 100644 index 00000000..0ed2949e --- /dev/null +++ b/views/tables/StudiesTable/index.jsx @@ -0,0 +1,64 @@ +import React from 'react' + +import dayjs from 'dayjs' + +import { SITE_NAMES } from '../../../server/utils/siteNames' +import Table from '../Table' + +const StudiesTable = (props) => { + const { onSort, studies, sortable, sortDirection, sortProperty } = props + + const headers = [ + { + dataProperty: 'study', + label: 'Study', + sortable: !!sortable, + }, + { + dataProperty: 'siteName', + label: 'Site', + sortable: !!sortable, + }, + { + dataProperty: 'daysInStudy', + label: 'Days In Study', + sortable: !!sortable, + }, + { + dataProperty: 'numOfParticipants', + label: 'No. of Participants', + sortable: !!sortable, + }, + { + dataProperty: 'updatedAt', + label: 'Last Updated', + sortable: !!sortable, + }, + ] + + const cellRenderer = (study, property) => { + switch (property) { + case 'updatedAt': { + return dayjs(study[property]).toISOString() + } + case 'siteName': { + return SITE_NAMES[study['study']] + } + default: + return study[property] + } + } + + return ( +
+ ) +} + +export default StudiesTable diff --git a/views/tables/Table/TableHead.jsx b/views/tables/Table/TableHead.jsx new file mode 100644 index 00000000..3dde02c4 --- /dev/null +++ b/views/tables/Table/TableHead.jsx @@ -0,0 +1,61 @@ +import React from 'react' + +import { + TableCell, + TableHead as MuiTableHead, + TableRow, + Box, + TableSortLabel, +} from '@mui/material' +import { visuallyHidden } from '@mui/utils' + +import { SORT_DIRECTION, fontSize } from '../../../constants' + +function TableHead(props) { + const { sortDirection, sortProperty, onRequestSort, headCells } = props + const createSortHandler = (property) => (event) => { + onRequestSort(event, property) + } + + return ( + + + {headCells.map((headCell) => { + const cellIsActive = sortProperty === headCell.dataProperty + const activeSortDirection = cellIsActive + ? sortDirection?.toLowerCase() + : undefined + + return ( + + {headCell.sortable ? ( + + {headCell.label} + {cellIsActive ? ( + + {sortDirection === SORT_DIRECTION.DESC + ? 'sorted descending' + : 'sorted ascending'} + + ) : null} + + ) : ( + headCell.label + )} + + ) + })} + + + ) +} + +export default TableHead diff --git a/views/tables/Table/TableMenu.jsx b/views/tables/Table/TableMenu.jsx new file mode 100644 index 00000000..b8703818 --- /dev/null +++ b/views/tables/Table/TableMenu.jsx @@ -0,0 +1,62 @@ +import React from 'react' + +import MoreVertIcon from '@mui/icons-material/MoreVert' +import { IconButton, Menu, MenuItem, MenuList, Typography } from '@mui/material' + +const MENU_ITEM_STYLES = { display: 'flex', gap: '32px' } +const COLOR_STYLES = { color: 'black.A100' } +const TableMenu = (props) => { + const { menuItems } = props + const [menuAnchor, setMenuAnchor] = React.useState(null) + const open = Boolean(menuAnchor) + const onClose = () => setMenuAnchor(null) + + return ( + <> + setMenuAnchor(event.currentTarget)} + color="primary" + > + + + + + {menuItems.map((menuItem, idx) => ( + { + menuItem.onClick() + onClose() + }} + data-testid={menuItem.testID} + disableRipple + disabled={menuItem.disabled} + to={menuItem.to} + sx={MENU_ITEM_STYLES} + > + + {menuItem.text} + + ))} + + + + ) +} + +export default TableMenu diff --git a/views/tables/Table/index.jsx b/views/tables/Table/index.jsx new file mode 100644 index 00000000..f82c874e --- /dev/null +++ b/views/tables/Table/index.jsx @@ -0,0 +1,121 @@ +import React from 'react' + +import { + Table as MuiTable, + TableBody, + TableCell, + TableContainer, + TableRow, + TablePagination, +} from '@mui/material' + +import TableHead from './TableHead' + +const firstCellStyles = (cellIndex) => { + if (cellIndex !== 0) { + return {} + } + + return { + borderLeftWidth: 1, + borderLeftStyle: 'solid', + borderLeftColor: 'grey.100', + borderBottomLeftRadius: 4, + borderTopLeftRadius: 4, + } +} + +const lastCellStyles = (cellIndex, headers) => { + if (cellIndex !== headers.length - 1) { + return {} + } + + return { + borderRightWidth: 1, + borderRightStyle: 'solid', + borderRightColor: 'grey.100', + borderBottomRightRadius: 4, + borderTopRightRadius: 4, + } +} + +const Table = (props) => { + const { + cellRenderer, + data, + headers, + handleChangePage, + handleChangeRowsPerPage, + handleRequestSort, + maxRows, + paginate, + page, + paginationCount, + rowsPerPage, + rowsPerPageOptions, + sortDirection, + sortProperty, + } = props + + const rows = maxRows && data.length > maxRows ? data.slice(0, maxRows) : data + + return ( + <> + + + + + {rows.map((rowData, rowIndex) => ( + + {headers.map((header, cellIndex) => ( + + {cellRenderer(rowData, header.dataProperty, rowIndex)} + + ))} + + ))} + + + + {paginate ? ( + + ) : undefined} + + ) +} + +export default Table diff --git a/webpack.config.js b/webpack.config.js index f4820734..9c9b091b 100755 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,67 +1,92 @@ -var debug = process.env.NODE_ENV !== 'production'; -var webpack = require('webpack'); +require('@babel/register') +const path = require('path') + +const { CleanWebpackPlugin } = require('clean-webpack-plugin') +const CopyPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const webpack = require('webpack') + +const outputDirectory = 'public' module.exports = { - target: 'web', - devtool: 'nosources-source-map', - node : { - fs : 'empty', - net : 'empty', - tls : 'empty' - }, - entry: { - study: './views/Study.render.react.js', - admin: './views/Admin.render.react.js', - main: './views/Main.render.react.js', - login: './views/Login.render.react.js', - register: './views/Register.render.react.js', - reset: './views/Resetpw.render.react.js', - account: './views/Account.render.react.js', - editConfig: './views/EditConfig.render.react.js', - config: './views/Config.render.react.js', - deepdive: './views/DeepDive.render.react.js', - graph: './views/Graph.render.react.js' - }, - module: { - rules: [ - { - test: /\.js?$/, - exclude: /node_modules/, - use: [{ - loader: 'babel-loader', - query: { - plugins: [ - 'react-html-attrs', - '@babel/plugin-proposal-class-properties', - ['@babel/plugin-proposal-decorators', { legacy: true }], - ['@babel/plugin-transform-runtime', { legacy: true }] - ], - presets: [ - '@babel/preset-react', - '@babel/preset-env', - ] - } - }], - } - ], - }, - output: { - path: __dirname + '/public/js/', - filename: '[name].min.js', - publicPath: '/js/' - }, - resolve: { - extensions: ['.js'] - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env':{ - 'NODE_ENV': JSON.stringify('production'), - } - }), - new webpack.NoEmitOnErrorsPlugin(), - new webpack.ProvidePlugin({ - Promise: 'imports-loader?this=>global!exports-loader?global.Promise!es6-promise' - }) - ], -}; + target: 'web', + mode: process.env.NODE_ENV || 'production', + entry: './views/index.js', + watchOptions: { + ignored: ['**/node_modules', '**/server'], + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + exclude: [/node_modules/, /\.test\.(js|jsx)$/], + use: [ + { + loader: 'babel-loader', + options: { + plugins: [ + 'react-html-attrs', + '@babel/plugin-proposal-class-properties', + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { legacy: true }], + ], + presets: [ + [ + '@babel/preset-react', + { + runtime: 'automatic', + }, + ], + '@babel/preset-env', + ], + cacheDirectory: true, + }, + }, + ], + }, + { + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/resource', + generator: { + filename: 'static/[hash][ext][query]', + }, + }, + { + test: /\.css$/i, + use: ['style-loader', 'css-loader'], + }, + ], + }, + optimization: { + minimize: process.env.NODE_ENV === 'production', + }, + output: { + path: path.join(__dirname, outputDirectory), + filename: 'js/bundle.js', + publicPath: '/', + }, + resolve: { + fallback: { + fs: false, + net: false, + tls: false, + }, + extensions: ['*', '.js', '.jsx'], + }, + devtool: 'source-map', + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV), + DPDASH_VERSION: JSON.stringify(process.env.npm_package_version), + }, + }), + new CleanWebpackPlugin(), + new CopyPlugin({ + patterns: [{ from: 'assets', to: 'img' }], + }), + new HtmlWebpackPlugin({ + template: './template/template.html', + }), + ], +}