From 8f1bdcc96214b8fe8ea3605d332023d812c554fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Valli=C3=A8res?= Date: Thu, 17 Aug 2023 23:08:15 -0400 Subject: [PATCH] init. --- .dockerignore | 46 + .editorconfig | 18 + .eslintignore | 4 + .eslintrc.cjs | 26 + .eslintrc.json | 46 + .github/ISSUE_TEMPLATE/ feature-request---.md | 17 + .github/ISSUE_TEMPLATE/bug-report---.md | 26 + .github/dependabot.yml | 11 + .github/workflows/ deploy.yml | 50 + .gitignore | 42 + .prettierrc.js | 8 + Dockerfile | 30 + LICENSE | 21 + README.md | 275 + angular.json | 99 + images/logo.svg | 495 + images/screenshot.png | Bin 0 -> 144163 bytes nginx.conf | 27 + package-lock.json | 13111 ++++++++++++++++ package.json | 48 + src/app/app-routing.module.ts | 44 + src/app/app.component.html | 6 + src/app/app.component.scss | 26 + src/app/app.component.ts | 8 + src/app/app.module.ts | 62 + src/app/auth.guard.ts | 22 + src/app/common/engine/constant.ts | 1 + src/app/common/engine/coordinate.ts | 119 + .../common/engine/enumeration/gameState.ts | 10 + .../common/engine/enumeration/pieceSide.ts | 4 + .../common/engine/enumeration/pieceType.ts | 8 + .../engine/exception/gameOverException.ts | 7 + .../exception/movementNotAllowedException.ts | 7 + .../multiplePiecesFoundRuntimeException.ts | 19 + .../engine/exception/notYourTurnException.ts | 7 + .../pieceNotFoundOnGameBoardException.ts | 7 + .../exception/promotionNotAllowedException.ts | 9 + ...dPromotionPieceTypeNotProvidedException.ts | 5 + src/app/common/engine/game.ts | 427 + src/app/common/engine/internal.ts | 31 + src/app/common/engine/piece/bishop.ts | 24 + src/app/common/engine/piece/king.ts | 57 + src/app/common/engine/piece/knight.ts | 30 + src/app/common/engine/piece/pawn.ts | 198 + src/app/common/engine/piece/piece.ts | 303 + .../common/engine/piece/possibleMovement.ts | 13 + src/app/common/engine/piece/queen.ts | 30 + src/app/common/engine/piece/rook.ts | 24 + src/app/common/utils/errorUtils.ts | 23 + .../infinite-scroll-table.component.html | 13 + .../infinite-scroll-table.component.scss | 4 + .../infinite-scroll-table.component.ts | 80 + .../menu-renderer.component.html | 17 + .../menu-renderer.component.scss | 8 + .../menu-renderer/menu-renderer.component.ts | 52 + .../state-renderer.component.html | 23 + .../state-renderer.component.scss | 12 + .../state-renderer.component.ts | 47 + .../create-game-form.component.html | 13 + .../create-game-form.component.scss | 8 + .../create-game-form.component.ts | 83 + .../components/footer/footer.component.html | 23 + .../components/footer/footer.component.scss | 18 + src/app/components/footer/footer.component.ts | 15 + .../game-friendly-id-input.component.html | 31 + .../game-friendly-id-input.component.scss | 23 + .../game-friendly-id-input.component.ts | 242 + .../header-navbar.component.html | 53 + .../header-navbar.component.scss | 32 + .../header-navbar/header-navbar.component.ts | 81 + .../join-game-form.component.html | 18 + .../join-game-form.component.scss | 8 + .../join-game-form.component.ts | 80 + .../spectate-game-form.component.html | 11 + .../spectate-game-form.component.scss | 8 + .../spectate-game-form.component.ts | 76 + .../create-join-game.page.html | 12 + .../create-join-game.page.scss | 10 + .../create-join-game/create-join-game.page.ts | 38 + src/app/game-list/game-list.page.html | 8 + src/app/game-list/game-list.page.scss | 4 + src/app/game-list/game-list.page.ts | 142 + src/app/game-rules/game-rules.page.html | 131 + src/app/game-rules/game-rules.page.scss | 28 + src/app/game-rules/game-rules.page.ts | 11 + src/app/game/cell/cell.component.html | 36 + src/app/game/cell/cell.component.scss | 34 + src/app/game/cell/cell.component.ts | 67 + src/app/game/coordinate2D.ts | 82 + src/app/game/game.page.html | 48 + src/app/game/game.page.scss | 42 + src/app/game/game.page.ts | 343 + .../game/piece-list/piece-list.component.html | 5 + .../game/piece-list/piece-list.component.scss | 6 + .../game/piece-list/piece-list.component.ts | 16 + .../piece-type-dialog.dialog.html | 29 + .../piece-type-dialog.dialog.scss | 30 + .../piece-type-dialog.dialog.ts | 62 + src/app/game/piece/piece.component.html | 99 + src/app/game/piece/piece.component.scss | 17 + src/app/game/piece/piece.component.ts | 19 + src/app/game/warning/warning.component.ts | 128 + src/app/home/home.page.html | 82 + src/app/home/home.page.scss | 5 + src/app/home/home.page.ts | 11 + .../page-not-found/page-not-found.page.html | 129 + .../page-not-found/page-not-found.page.scss | 192 + src/app/page-not-found/page-not-found.page.ts | 9 + .../common/dto/enumeration/direction.ts | 4 + src/app/service/common/dto/errorDto.ts | 16 + src/app/service/common/dto/windowDto.ts | 3 + src/app/service/common/rx-stomp.service.ts | 30 + .../game/dto/enumeration/gameMessageType.ts | 5 + .../game/dto/enumeration/gameStateDto.ts | 10 + .../service/game/dto/request/gameCreateDto.ts | 3 + .../game/dto/request/gameJoinUpdateDto.ts | 3 + .../request/message/gameUpdateMessageDto.ts | 22 + src/app/service/game/dto/response/gameDto.ts | 13 + .../service/game/dto/response/gameSaveDto.ts | 15 + .../dto/response/message/gameMessageDto.ts | 44 + src/app/service/game/mapper/gameSaveMapper.ts | 23 + .../service/game/mapper/gameStateMapper.ts | 25 + src/app/service/game/restGame.service.ts | 67 + src/app/service/game/websocketGame.service.ts | 27 + src/app/service/piece/dto/coordinateDto.ts | 3 + .../piece/dto/enumeration/pieceSideDto.ts | 4 + .../piece/dto/enumeration/pieceTypeDto.ts | 8 + .../service/piece/dto/response/pieceDto.ts | 7 + .../service/piece/mapper/coordinateMapper.ts | 11 + src/app/service/piece/mapper/pieceMapper.ts | 15 + .../service/piece/mapper/pieceSideMapper.ts | 13 + .../service/piece/mapper/pieceTypeMapper.ts | 37 + src/assets/.gitkeep | 0 src/assets/images/bishop_movements.svg | 294 + src/assets/images/initial_positions.svg | 495 + src/assets/images/king_movements.svg | 294 + src/assets/images/knight_movements.svg | 295 + src/assets/images/pawn_movements.svg | 286 + src/assets/images/queen_movements.svg | 324 + src/assets/images/rook_movements.svg | 312 + src/assets/silent-check-sso.html | 7 + src/environments/environment.production.ts | 11 + src/environments/environment.ts | 15 + src/favicon.ico | Bin 0 -> 948 bytes src/index.html | 16 + src/main.ts | 7 + src/styles.scss | 24 + tsconfig.app.json | 14 + tsconfig.json | 98 + tsconfig.spec.json | 14 + 150 files changed, 21799 insertions(+) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.cjs create mode 100644 .eslintrc.json create mode 100644 .github/ISSUE_TEMPLATE/ feature-request---.md create mode 100644 .github/ISSUE_TEMPLATE/bug-report---.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/ deploy.yml create mode 100644 .gitignore create mode 100644 .prettierrc.js create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 angular.json create mode 100644 images/logo.svg create mode 100644 images/screenshot.png create mode 100644 nginx.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/app/app-routing.module.ts create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.scss create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/auth.guard.ts create mode 100644 src/app/common/engine/constant.ts create mode 100644 src/app/common/engine/coordinate.ts create mode 100644 src/app/common/engine/enumeration/gameState.ts create mode 100644 src/app/common/engine/enumeration/pieceSide.ts create mode 100644 src/app/common/engine/enumeration/pieceType.ts create mode 100644 src/app/common/engine/exception/gameOverException.ts create mode 100644 src/app/common/engine/exception/movementNotAllowedException.ts create mode 100644 src/app/common/engine/exception/multiplePiecesFoundRuntimeException.ts create mode 100644 src/app/common/engine/exception/notYourTurnException.ts create mode 100644 src/app/common/engine/exception/pieceNotFoundOnGameBoardException.ts create mode 100644 src/app/common/engine/exception/promotionNotAllowedException.ts create mode 100644 src/app/common/engine/exception/wantedPromotionPieceTypeNotProvidedException.ts create mode 100644 src/app/common/engine/game.ts create mode 100644 src/app/common/engine/internal.ts create mode 100644 src/app/common/engine/piece/bishop.ts create mode 100644 src/app/common/engine/piece/king.ts create mode 100644 src/app/common/engine/piece/knight.ts create mode 100644 src/app/common/engine/piece/pawn.ts create mode 100644 src/app/common/engine/piece/piece.ts create mode 100644 src/app/common/engine/piece/possibleMovement.ts create mode 100644 src/app/common/engine/piece/queen.ts create mode 100644 src/app/common/engine/piece/rook.ts create mode 100644 src/app/common/utils/errorUtils.ts create mode 100644 src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.html create mode 100644 src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.scss create mode 100644 src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.ts create mode 100644 src/app/components/ag-grid/menu-renderer/menu-renderer.component.html create mode 100644 src/app/components/ag-grid/menu-renderer/menu-renderer.component.scss create mode 100644 src/app/components/ag-grid/menu-renderer/menu-renderer.component.ts create mode 100644 src/app/components/ag-grid/state-renderer/state-renderer.component.html create mode 100644 src/app/components/ag-grid/state-renderer/state-renderer.component.scss create mode 100644 src/app/components/ag-grid/state-renderer/state-renderer.component.ts create mode 100644 src/app/components/create-game-form/create-game-form.component.html create mode 100644 src/app/components/create-game-form/create-game-form.component.scss create mode 100644 src/app/components/create-game-form/create-game-form.component.ts create mode 100644 src/app/components/footer/footer.component.html create mode 100644 src/app/components/footer/footer.component.scss create mode 100644 src/app/components/footer/footer.component.ts create mode 100644 src/app/components/game-friendly-id-input/game-friendly-id-input.component.html create mode 100644 src/app/components/game-friendly-id-input/game-friendly-id-input.component.scss create mode 100644 src/app/components/game-friendly-id-input/game-friendly-id-input.component.ts create mode 100644 src/app/components/header-navbar/header-navbar.component.html create mode 100644 src/app/components/header-navbar/header-navbar.component.scss create mode 100644 src/app/components/header-navbar/header-navbar.component.ts create mode 100644 src/app/components/join-game-form/join-game-form.component.html create mode 100644 src/app/components/join-game-form/join-game-form.component.scss create mode 100644 src/app/components/join-game-form/join-game-form.component.ts create mode 100644 src/app/components/spectate-game-form/spectate-game-form.component.html create mode 100644 src/app/components/spectate-game-form/spectate-game-form.component.scss create mode 100644 src/app/components/spectate-game-form/spectate-game-form.component.ts create mode 100644 src/app/create-join-game/create-join-game.page.html create mode 100644 src/app/create-join-game/create-join-game.page.scss create mode 100644 src/app/create-join-game/create-join-game.page.ts create mode 100644 src/app/game-list/game-list.page.html create mode 100644 src/app/game-list/game-list.page.scss create mode 100644 src/app/game-list/game-list.page.ts create mode 100644 src/app/game-rules/game-rules.page.html create mode 100644 src/app/game-rules/game-rules.page.scss create mode 100644 src/app/game-rules/game-rules.page.ts create mode 100644 src/app/game/cell/cell.component.html create mode 100644 src/app/game/cell/cell.component.scss create mode 100644 src/app/game/cell/cell.component.ts create mode 100644 src/app/game/coordinate2D.ts create mode 100644 src/app/game/game.page.html create mode 100644 src/app/game/game.page.scss create mode 100644 src/app/game/game.page.ts create mode 100644 src/app/game/piece-list/piece-list.component.html create mode 100644 src/app/game/piece-list/piece-list.component.scss create mode 100644 src/app/game/piece-list/piece-list.component.ts create mode 100644 src/app/game/piece-type-dialog/piece-type-dialog.dialog.html create mode 100644 src/app/game/piece-type-dialog/piece-type-dialog.dialog.scss create mode 100644 src/app/game/piece-type-dialog/piece-type-dialog.dialog.ts create mode 100644 src/app/game/piece/piece.component.html create mode 100644 src/app/game/piece/piece.component.scss create mode 100644 src/app/game/piece/piece.component.ts create mode 100644 src/app/game/warning/warning.component.ts create mode 100644 src/app/home/home.page.html create mode 100644 src/app/home/home.page.scss create mode 100644 src/app/home/home.page.ts create mode 100644 src/app/page-not-found/page-not-found.page.html create mode 100644 src/app/page-not-found/page-not-found.page.scss create mode 100644 src/app/page-not-found/page-not-found.page.ts create mode 100644 src/app/service/common/dto/enumeration/direction.ts create mode 100644 src/app/service/common/dto/errorDto.ts create mode 100644 src/app/service/common/dto/windowDto.ts create mode 100644 src/app/service/common/rx-stomp.service.ts create mode 100644 src/app/service/game/dto/enumeration/gameMessageType.ts create mode 100644 src/app/service/game/dto/enumeration/gameStateDto.ts create mode 100644 src/app/service/game/dto/request/gameCreateDto.ts create mode 100644 src/app/service/game/dto/request/gameJoinUpdateDto.ts create mode 100644 src/app/service/game/dto/request/message/gameUpdateMessageDto.ts create mode 100644 src/app/service/game/dto/response/gameDto.ts create mode 100644 src/app/service/game/dto/response/gameSaveDto.ts create mode 100644 src/app/service/game/dto/response/message/gameMessageDto.ts create mode 100644 src/app/service/game/mapper/gameSaveMapper.ts create mode 100644 src/app/service/game/mapper/gameStateMapper.ts create mode 100644 src/app/service/game/restGame.service.ts create mode 100644 src/app/service/game/websocketGame.service.ts create mode 100644 src/app/service/piece/dto/coordinateDto.ts create mode 100644 src/app/service/piece/dto/enumeration/pieceSideDto.ts create mode 100644 src/app/service/piece/dto/enumeration/pieceTypeDto.ts create mode 100644 src/app/service/piece/dto/response/pieceDto.ts create mode 100644 src/app/service/piece/mapper/coordinateMapper.ts create mode 100644 src/app/service/piece/mapper/pieceMapper.ts create mode 100644 src/app/service/piece/mapper/pieceSideMapper.ts create mode 100644 src/app/service/piece/mapper/pieceTypeMapper.ts create mode 100644 src/assets/.gitkeep create mode 100644 src/assets/images/bishop_movements.svg create mode 100644 src/assets/images/initial_positions.svg create mode 100644 src/assets/images/king_movements.svg create mode 100644 src/assets/images/knight_movements.svg create mode 100644 src/assets/images/pawn_movements.svg create mode 100644 src/assets/images/queen_movements.svg create mode 100644 src/assets/images/rook_movements.svg create mode 100644 src/assets/silent-check-sso.html create mode 100644 src/environments/environment.production.ts create mode 100644 src/environments/environment.ts create mode 100644 src/favicon.ico create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/styles.scss create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..17c7c71 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db + +.git +.gitignore +.editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..953654e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single +semi = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e1cbe63 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +.eslintrc.cjs +*.config.js +*.config.ts +dist diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..a099b54 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,26 @@ +module.exports = { + root: true, + extends: [ + 'eslint:recommended', + 'plugin:@angular-eslint/recommended', + 'plugin:@angular-eslint/template/process-inline-templates', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:prettier/recommended', + ], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'prettier'], + parserOptions: { + project: ['tsconfig.*?.json'], + }, + rules: { + 'prettier/prettier': 'error', + '@typescript-eslint/unbound-method': 'error', + '@typescript-eslint/no-empty-function': ['error', { allow: ['private-constructors'] }], + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + }, +}; diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..c7a3034 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,46 @@ +{ + "root": true, + "ignorePatterns": [ + "projects/**/*" + ], + "overrides": [ + { + "files": [ + "*.ts" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ] + } + }, + { + "files": [ + "*.html" + ], + "extends": [ + "plugin:@angular-eslint/template/recommended" + ], + "rules": {} + } + ] +} diff --git a/.github/ISSUE_TEMPLATE/ feature-request---.md b/.github/ISSUE_TEMPLATE/ feature-request---.md new file mode 100644 index 0000000..9a700c1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ feature-request---.md @@ -0,0 +1,17 @@ +--- +name: "Feature request \U0001F680" +about: Suggest an idea +labels: enhancement +--- + +## Summary + +Brief explanation of the feature. + +### Basic example + +Include a basic example or links here. + +### Motivation + +Why are we doing this? What use cases does it support? What is the expected outcome? diff --git a/.github/ISSUE_TEMPLATE/bug-report---.md b/.github/ISSUE_TEMPLATE/bug-report---.md new file mode 100644 index 0000000..7b00e2c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report---.md @@ -0,0 +1,26 @@ +--- +name: "Bug report \U0001F41E" +about: Create a bug report +labels: bug +--- + +## Describe the bug + +A clear and concise description of what the bug is. + +### Steps to reproduce + +Steps to reproduce the behavior. + +### Expected behavior + +A clear and concise description of what you expected to happen. + +### Environment + +- OS: [e.g. Arch Linux] +- Other details that you think may affect. + +### Additional context + +Add any other context about the problem here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..000d73e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/.github/workflows/ deploy.yml b/.github/workflows/ deploy.yml new file mode 100644 index 0000000..f79e99a --- /dev/null +++ b/.github/workflows/ deploy.yml @@ -0,0 +1,50 @@ +name: Build & Deploy + +on: + release: + types: [published] + workflow_dispatch: + +jobs: + build_and_push: + name: Build & Push to DockerHub + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Docker Build and Push to DockerHub + uses: docker/build-push-action@v3 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: sisimomo/hexagonal-chess-frontend:latest , sisimomo/hexagonal-chess-frontend:${{ github.event.release.tag_name }} + + deploy_to_vm: + name: Deploy to VM + runs-on: ubuntu-latest + needs: build_and_push + steps: + - name: Connect with SSH and Deploy + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + cd ~/deployments/hexagonalChess/prod + docker pull sisimomo/hexagonal-chess-frontend:latest + docker compose up -d --force-recreate hexagonalChess_frontend diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0711527 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..9480b95 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,8 @@ +module.exports = { + tabWidth: 2, + semi: true, + singleQuote: true, + printWidth: 120, + trailingComma: 'es5', + arrowParens: 'always', +}; diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c79ac26 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +# Source: https://dev.to/oneofthedevs/docker-angular-nginx-37e4 + +### STAGE 1:BUILD ### +# Defining a node image to be used as giving it an alias of "build" +# Which version of Node image to use depends on project dependencies +# This is needed to build and compile our code +# while generating the docker image +FROM node:18-alpine AS build +# Create a Virtual directory inside the docker image +WORKDIR /dist/src/app +# Copy files to virtual directory +# COPY package.json package-lock.json ./ +# Run command in Virtual directory +RUN npm cache clean --force +# Copy files from local machine to virtual directory in docker image +COPY . . +RUN npm install +RUN npm run build + + +### STAGE 2:RUN ### +# Defining nginx image to be used +FROM nginx:alpine AS ngi +# Copying compiled code and nginx config to different folder +# NOTE: This path may change according to your project's output folder +COPY --from=build /dist/src/app/dist/hexagonal-chess-frontend /usr/share/nginx/html +COPY ./nginx.conf /etc/nginx/conf.d/default.conf +# Exposing a port, here it means that inside the container +# the app will be using Port 80 while running +EXPOSE 80 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d356a81 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Simon Vallières + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1ab4869 --- /dev/null +++ b/README.md @@ -0,0 +1,275 @@ + + +[![Forks][forks-shield]][forks-url] +[![Stargazers][stars-shield]][stars-url] +[![Issues][issues-shield]][issues-url] +[![MIT License][license-shield]][license-url] +[![LinkedIn][linkedin-shield]][linkedin-url] + + +
+
+ + Logo + + +

Hexagonal Chess - Frontend

+ +

+ Immerse yourself in the strategic world of Gliński's variant chess with my project. The Frontend is powered by Angular, showcasing my expertise in web development. +
+
+ Live website + · + Report Bug + · + Request Feature +

+
+ + +
+ Table of Contents +
    +
  1. + About The Project + +
  2. +
  3. + Getting Started + +
  4. +
  5. Usage
  6. +
  7. Roadmap
  8. +
  9. License
  10. +
  11. Contact
  12. +
+
+ + + +## About The Project + +
+ + Logo + +
+ +As a passionate web developer, I constantly seek out intriguing challenges. Inspired by a +[YouTube video by C.G.P. Grey titled 'Can Chess, with Hexagons?'](https://youtu.be/bgR3yESAEVE), I +dove into the world of hexagonal chess and was immediately captivated by its unique complexity and +possibilities. This fascination drove me to create a digital version of the Gliński's variant, +blending my love for coding with my newfound interest for this chess variant. + +

(back to top)

+ +### Built With + +- [![Visual Studio Code][vscode-shield]](https://code.visualstudio.com/) +- [Keycloak](https://www.keycloak.org/) +- [![Angular][Angular-shield]](https://angular.io/) +- [![TypeScript][TypeScript-shield]](https://www.typescriptlang.org/) +- [![NPM][npm-shield]](https://www.npmjs.com/) +- [Angular Material UI component library](https://material.angular.io/) +- [![RXJS][rxjs-shield]](https://rxjs.dev/) +- [keycloak angular](https://github.com/mauriciovigolo/keycloak-angular) +- [AG Grid](https://www.ag-grid.com/) +- [ngx-toastr](https://github.com/scttcper/ngx-toastr) +- [![Jest][Jest-shield]](https://jestjs.io/) + +

(back to top)

+ + + +## Local development environment + +To get a local copy up and running, follow these simple steps. + +### Prerequisites + +Before diving into the installation section, make sure your system meets the following +prerequisites: + +- [Git](https://git-scm.com/) +- [Docker](https://www.docker.com/) +- [Docker Compose](https://docs.docker.com/compose/) +- [Java 17](https://www.java.com) +- [IntelliJ IDEA](https://www.jetbrains.com/idea/) +- [npm](https://www.npmjs.com/) +- [Angular CLI](https://cli.angular.io/) + +### Installation + +#### 1. Get Local Docker Compose Running + +1.1. **Clone the Docker Compose Repository:** + +Start by cloning the Docker Compose repository using the following command: + +```sh +git clone https://github.com/sisimomo/hexagonalChess-docker-compose.git +``` + +1.2. **Navigate to the Local Folder:** + +Move into the local folder within the cloned repository: + +```sh +cd ./hexagonalChess-docker-compose/local +``` + +1.3. **Configure Environment Variables:** + +Duplicate the `.env.sample` file and rename it to `.env`: + +```sh +cp ./.env.sample ./.env +``` + +Customize the variables in the `.env` file to your preferences. + +1.4. **Initiate Docker Compose:** + +Start docker containers using Docker Compose: + +```sh +docker-compose up -d +``` + +#### 2. Get the frontend Running + +2.1. **Clone the Backend Repository:** + +Clone the backend repository using the following command: + +```sh +git clone https://github.com/sisimomo/hexagonalChess-backend.git +``` + +2.2. **Open in IntelliJ:** + +Open the cloned repository folder using IntelliJ IDEA. + +2.3. **Update Environment Variables:** + +Adjust the environment variables according to your `.env` modifications in the "Run/Debug +configuration" named "HexagonalChessApplication" located in the `.run` folder within the cloned +repository. + +2.4. **Start the Application:** + +Launch the application using the "Run/Debug configuration" named "HexagonalChessApplication" in +IntelliJ. + +#### 3. Get the Frontend Running + +3.1. **Clone the Frontend Repository:** + +Clone the frontend repository using the following command: + +```sh + git clone https://github.com/sisimomo/hexagonalChess-frontend.git +``` + +3.2. **Navigate to the Frontend Folder:** + +Change your working directory to the frontend folder: + +```sh +cd ./hexagonalChess-frontend +``` + +3.3. **Install Dependencies:** + +Install project dependencies using npm: + +```sh +npm install +``` + +3.4. **Run the Project:** + +Start the project using Angular CLI: + +```sh +ng serve +``` + +#### 4. Enjoy! + +Feel free to explore the code and provide suggestions for enhancement by creating feature requests +through new GitHub issues. + +

(back to top)

+ + + +## Roadmap + +- [ ] Fix Websocket (STOMP) authentification issue when page is open for a long period of time. +- [ ] Add a way to surrender a game. +- [ ] Complete Chess Engine unit tests. + - [ ] Coordinate class. + - [ ] Piece abstract class. + - [ ] Pawn class. + - [ ] King class. + - [ ] Game class. +- [ ] Hexagonal Chess calculator to allow player to play against a bot locally. +- [ ] Add a list of game with missing player in the game list page. +- [ ] Add a list of previously played games in the game list page. +- [ ] Add a way to visualize previous moves in the game page. +- [ ] Add a way to spectate a game. +- [ ] Add a chat in the game page. + +See the [open issues](https://github.com/sisimomo/hexagonalChess-frontend/issues) for a full list of +proposed features (and known issues). + +

(back to top)

+ + + +## License + +Distributed under the MIT License. See `LICENSE.txt` for more information. + +

(back to top)

+ + + +## Contact + +[![LinkedIn][linkedin-shield]][linkedin-url] + +Project Urls: + +- [frontend](https://hexagonalchess-api.zucchi.dev/) +- [Frontend](https://hexagonalchess.zucchi.dev/) +- [Identity provider](https://hexagonalchess-auth.zucchi.dev/realms/HexagonalChess/account/) + +

(back to top)

+ + + + +[forks-shield]: https://img.shields.io/github/forks/sisimomo/hexagonalChess-frontend.svg?style=for-the-badge +[forks-url]: https://github.com/sisimomo/hexagonalChess-frontend/network/members +[stars-shield]: https://img.shields.io/github/stars/sisimomo/hexagonalChess-frontend.svg?style=for-the-badge +[stars-url]: https://github.com/sisimomo/hexagonalChess-frontend/stargazers +[issues-shield]: https://img.shields.io/github/issues/sisimomo/hexagonalChess-frontend.svg?style=for-the-badge +[issues-url]: https://github.com/sisimomo/hexagonalChess-frontend/issues +[license-shield]: https://img.shields.io/github/license/sisimomo/hexagonalChess-frontend.svg?style=for-the-badge +[license-url]: https://github.com/sisimomo/hexagonalChess-frontend/blob/master/LICENSE.txt +[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 +[linkedin-url]: https://linkedin.com/in/simon-vallieres-358555187 +[Angular-shield]: https://img.shields.io/badge/angular-%23DD0031.svg?style=for-the-badge&logo=angular&logoColor=white +[TypeScript-shield]: https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge&logo=typescript&logoColor=white +[npm-shield]: https://img.shields.io/badge/NPM-%23CB3837.svg?style=for-the-badge&logo=npm&logoColor=white +[rxjs-shield]: https://img.shields.io/badge/rxjs-%23B7178C.svg?style=for-the-badge&logo=reactivex&logoColor=white +[Jest-shield]: https://img.shields.io/badge/-jest-%23C21325?style=for-the-badge&logo=jest&logoColor=white +[vscode-shield]: https://img.shields.io/badge/Visual%20Studio%20Code-0078d7.svg?style=for-the-badge&logo=visual-studio-code&logoColor=white diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..0652a24 --- /dev/null +++ b/angular.json @@ -0,0 +1,99 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "hexagonal-chess-frontend": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/hexagonal-chess-frontend", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + "@angular/material/prebuilt-themes/purple-green.css", + "src/styles.scss", + "node_modules/ngx-toastr/toastr.css", + "node_modules/ag-grid-community/styles/ag-grid.css", + "node_modules/ag-grid-community/styles/ag-theme-alpine.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "3mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all", + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.production.ts" + } + ] + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "hexagonal-chess-frontend:build:production" + }, + "development": { + "browserTarget": "hexagonal-chess-frontend:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "hexagonal-chess-frontend:build" + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] + } + } + } + } + }, + "cli": { + "analytics": "7edfc59f-0b49-4eab-bf83-6c2bf826dd65" + } +} diff --git a/images/logo.svg b/images/logo.svg new file mode 100644 index 0000000..d80ce26 --- /dev/null +++ b/images/logo.svg @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/screenshot.png b/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6d24a6e97bc2362b54bf7962c355443471f2d05e GIT binary patch literal 144163 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∋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 + diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 0000000..86f5af4 --- /dev/null +++ b/src/app/app.component.scss @@ -0,0 +1,26 @@ +.container { + min-height: calc(100vh - 64px); + display: flex; + flex-direction: column; +} + +app-footer { + margin-top: auto; +} + +::ng-deep router-outlet + * { + display: flex; + flex-direction: column; + align-items: center; + width: fit-content; + margin: 0 auto; + margin-top: 16px; + width: 75vw; +} + +@media only screen and (max-width: 768px) { + /* For mobile phones: */ + ::ng-deep router-outlet + * { + width: 95vw; + } +} diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..ba8e2e0 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'], +}) +export class AppComponent {} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..4bc27e4 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,62 @@ +import { HttpClientModule } from '@angular/common/http'; +import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { AgGridModule } from 'ag-grid-angular'; +import { KeycloakAngularModule, KeycloakService } from 'keycloak-angular'; +import { ToastrModule } from 'ngx-toastr'; +import { environment } from 'src/environments/environment'; +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { FooterComponent } from './components/footer/footer.component'; +import { HeaderNavbarComponent } from './components/header-navbar/header-navbar.component'; + +function initializeKeycloak(keycloak: KeycloakService) { + return () => + keycloak.init({ + config: { + url: environment.identityProvider.baseURL, + realm: environment.identityProvider.realm, + clientId: environment.identityProvider.clientId, + }, + initOptions: { + onLoad: 'check-sso', + silentCheckSsoRedirectUri: window.location.origin + '/assets/silent-check-sso.html', + checkLoginIframe: true, + }, + shouldAddToken: (request) => { + return request.url.startsWith(environment.api.baseURL); + }, + shouldUpdateToken(request) { + const temp = !request.headers.get('token-update') === false; + return temp; + }, + }); +} + +@NgModule({ + declarations: [AppComponent], + imports: [ + BrowserModule, + ReactiveFormsModule, + AppRoutingModule, + HttpClientModule, + BrowserAnimationsModule, + HeaderNavbarComponent, + FooterComponent, + ToastrModule.forRoot(), + KeycloakAngularModule, + AgGridModule, + ], + providers: [ + { + provide: APP_INITIALIZER, + useFactory: initializeKeycloak, + multi: true, + deps: [KeycloakService], + }, + ], + bootstrap: [AppComponent], +}) +export class AppModule {} diff --git a/src/app/auth.guard.ts b/src/app/auth.guard.ts new file mode 100644 index 0000000..b0ef9f6 --- /dev/null +++ b/src/app/auth.guard.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; +import { KeycloakAuthGuard, KeycloakService } from 'keycloak-angular'; + +@Injectable({ + providedIn: 'root', +}) +export class AuthGuard extends KeycloakAuthGuard { + constructor(protected override readonly router: Router, protected readonly keycloak: KeycloakService) { + super(router, keycloak); + } + + public async isAccessAllowed(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + // Force the user to log in if currently unauthenticated. + if (!this.authenticated) { + await this.keycloak.login({ + redirectUri: window.location.origin + state.url, + }); + } + return this.authenticated; + } +} diff --git a/src/app/common/engine/constant.ts b/src/app/common/engine/constant.ts new file mode 100644 index 0000000..8dc2655 --- /dev/null +++ b/src/app/common/engine/constant.ts @@ -0,0 +1 @@ +export const BOARD_SIDE_LENGTH = 6; diff --git a/src/app/common/engine/coordinate.ts b/src/app/common/engine/coordinate.ts new file mode 100644 index 0000000..938870d --- /dev/null +++ b/src/app/common/engine/coordinate.ts @@ -0,0 +1,119 @@ +export class Coordinate { + public static readonly ORIGIN = new Coordinate(0, 0, 0); + + public static readonly DIRECTION_VECTORS = [ + new Coordinate(1, 0, -1), + new Coordinate(1, -1, 0), + new Coordinate(0, -1, 1), + new Coordinate(-1, 0, 1), + new Coordinate(-1, 1, 0), + new Coordinate(0, 1, -1), + ]; + + public static readonly DIAGONAL_VECTORS = [ + new Coordinate(2, -1, -1), + new Coordinate(1, -2, 1), + new Coordinate(-1, -1, 2), + new Coordinate(-2, 1, 1), + new Coordinate(-1, 2, -1), + new Coordinate(1, 1, -2), + ]; + + private readonly _q; + private readonly _r; + private readonly _s; + + constructor(q: number, r: number, s: number) { + this._q = q; + this._r = r; + this._s = s; + } + + /** + * Generates a list of {@link Coordinate}s in a hexagonal ring shape around a given center + * coordinate. + * Source + * + * @param center The center of the ring. + * @param radius The distance from the center coordinate to the outermost coordinates in the ring. + * @return A List of {@link Coordinate} objects. + */ + public static ring(center: Coordinate, radius: number): Coordinate[] { + const results: Coordinate[] = []; + let hex = center.add(Coordinate.DIRECTION_VECTORS[4].multiply(radius)); + for (let i = 0; i < 6; i++) { + for (let j = 0; j < radius; j++) { + results.push(hex); + hex = hex.add(Coordinate.DIRECTION_VECTORS[i]); + } + } + return results; + } + + /** + * A list of {@link Coordinate}s in a spiral pattern, starting from a given center coordinate and + * expanding outwards up to a specified radius. + * Source + * + * @param center The center of the ring. + * @param radius The distance from the center coordinate to the outermost coordinates in the spiral. + * @return The method is returning a List of Coordinate objects. + */ + public static spiral(center: Coordinate, radius: number): Coordinate[] { + const results: Coordinate[] = []; + results.push(center); + for (let i = 1; i <= radius; i++) { + results.push(...Coordinate.ring(center, i)); + } + return results; + } + + public get q(): number { + return this._q; + } + + public get r(): number { + return this._r; + } + + public get s(): number { + return this._s; + } + + public add(coordinate: Coordinate): Coordinate { + return new Coordinate(this._q + coordinate.q, this._r + coordinate.r, this._s + coordinate.s); + } + + public subtract(coordinate: Coordinate): Coordinate { + return new Coordinate(this._q - coordinate.q, this._r - coordinate.r, this._s - coordinate.s); + } + + public multiply(multiplier: number): Coordinate { + return new Coordinate(this._q * multiplier, this._r * multiplier, this._s * multiplier); + } + + public horizontalReflection(): Coordinate { + return new Coordinate(this._q, this._s, this._r); + } + + public verticalReflection(): Coordinate { + return new Coordinate(this._q * -1, this._s * -1, this._r * -1); + } + + public distance(coordinate: Coordinate): number { + const vec = this.subtract(coordinate); + return (Math.abs(vec.q) + Math.abs(vec.r) + Math.abs(vec.s)) / 2; + } + + public equals(coordinate: Coordinate | undefined): boolean { + if (coordinate == null || coordinate == undefined) { + return false; + } + return this._q == coordinate.q && this._r == coordinate.r && this._s == coordinate.s; + } +} + +export interface LastMove { + from: Coordinate; + to: Coordinate; +} diff --git a/src/app/common/engine/enumeration/gameState.ts b/src/app/common/engine/enumeration/gameState.ts new file mode 100644 index 0000000..f86a64e --- /dev/null +++ b/src/app/common/engine/enumeration/gameState.ts @@ -0,0 +1,10 @@ +export enum GameState { + IN_PROGRESS, + WHITE_IN_CHECK, + BLACK_IN_CHECK, + WHITE_WON, + BLACK_WON, + DRAW_STALEMATE, + DRAW_INSUFFICIENT_MATERIAL, + DRAW_THREEFOLD_REPETITION, +} diff --git a/src/app/common/engine/enumeration/pieceSide.ts b/src/app/common/engine/enumeration/pieceSide.ts new file mode 100644 index 0000000..a5cc450 --- /dev/null +++ b/src/app/common/engine/enumeration/pieceSide.ts @@ -0,0 +1,4 @@ +export enum PieceSide { + WHITE, + BLACK, +} diff --git a/src/app/common/engine/enumeration/pieceType.ts b/src/app/common/engine/enumeration/pieceType.ts new file mode 100644 index 0000000..6c6d978 --- /dev/null +++ b/src/app/common/engine/enumeration/pieceType.ts @@ -0,0 +1,8 @@ +export enum PieceType { + BISHOP = 'B', + KING = 'K', + KNIGHT = 'N', + PAWN = 'P', + QUEEN = 'Q', + ROOK = 'R', +} diff --git a/src/app/common/engine/exception/gameOverException.ts b/src/app/common/engine/exception/gameOverException.ts new file mode 100644 index 0000000..d6d3da9 --- /dev/null +++ b/src/app/common/engine/exception/gameOverException.ts @@ -0,0 +1,7 @@ +import { GameState } from '../internal'; + +export class GameOverException extends Error { + constructor(gameState: GameState) { + super(`The game is over [${GameState[gameState]}].`); + } +} diff --git a/src/app/common/engine/exception/movementNotAllowedException.ts b/src/app/common/engine/exception/movementNotAllowedException.ts new file mode 100644 index 0000000..0c61f1e --- /dev/null +++ b/src/app/common/engine/exception/movementNotAllowedException.ts @@ -0,0 +1,7 @@ +import { Coordinate, Piece } from '../internal'; + +export class MovementNotAllowedException extends Error { + constructor(piece: Piece, coordinate: Coordinate) { + super(`The Piece[${JSON.stringify(piece)}] is not allowed to move to Coordinate[${JSON.stringify(coordinate)}].`); + } +} diff --git a/src/app/common/engine/exception/multiplePiecesFoundRuntimeException.ts b/src/app/common/engine/exception/multiplePiecesFoundRuntimeException.ts new file mode 100644 index 0000000..28ffb0c --- /dev/null +++ b/src/app/common/engine/exception/multiplePiecesFoundRuntimeException.ts @@ -0,0 +1,19 @@ +import { Coordinate, Piece, PieceSide, PieceType } from '../internal'; + +export class MultiplePiecesFoundRuntimeException extends Error { + constructor( + pieces: Piece[], + type: PieceType | undefined, + side: PieceSide | undefined, + coordinate: Coordinate | undefined + ) { + super( + `Multiple pieces was found with search parameters [type: ${type}, side: ${side}, coordinate: ${coordinate}]\n${pieces.filter( + (piece) => + (side === undefined || piece.side === side) && + (type == null || piece.type === type) && + (coordinate == null || piece.coordinate.equals(coordinate)) + )}` + ); + } +} diff --git a/src/app/common/engine/exception/notYourTurnException.ts b/src/app/common/engine/exception/notYourTurnException.ts new file mode 100644 index 0000000..0a956be --- /dev/null +++ b/src/app/common/engine/exception/notYourTurnException.ts @@ -0,0 +1,7 @@ +import { PieceSide } from '../internal'; + +export class NotYourTurnException extends Error { + constructor(side: PieceSide) { + super(`It's not the ${side === PieceSide.WHITE ? 'White' : 'Black'} side turn.`); + } +} diff --git a/src/app/common/engine/exception/pieceNotFoundOnGameBoardException.ts b/src/app/common/engine/exception/pieceNotFoundOnGameBoardException.ts new file mode 100644 index 0000000..34da18e --- /dev/null +++ b/src/app/common/engine/exception/pieceNotFoundOnGameBoardException.ts @@ -0,0 +1,7 @@ +import { Coordinate } from '../internal'; + +export class PieceNotFoundOnGameBoardException extends Error { + constructor(coordinate: Coordinate) { + super(`No Piece was found at Coordinate[${JSON.stringify(coordinate)}].`); + } +} diff --git a/src/app/common/engine/exception/promotionNotAllowedException.ts b/src/app/common/engine/exception/promotionNotAllowedException.ts new file mode 100644 index 0000000..f6cc5f8 --- /dev/null +++ b/src/app/common/engine/exception/promotionNotAllowedException.ts @@ -0,0 +1,9 @@ +import { Coordinate, Piece } from '../internal'; + +export class PromotionNotAllowedException extends Error { + constructor(piece: Piece, coordinate: Coordinate) { + super( + `The Piece[${JSON.stringify(piece)}] is not allowed to be promoted at Coordinate[${JSON.stringify(coordinate)}].` + ); + } +} diff --git a/src/app/common/engine/exception/wantedPromotionPieceTypeNotProvidedException.ts b/src/app/common/engine/exception/wantedPromotionPieceTypeNotProvidedException.ts new file mode 100644 index 0000000..a6c3d64 --- /dev/null +++ b/src/app/common/engine/exception/wantedPromotionPieceTypeNotProvidedException.ts @@ -0,0 +1,5 @@ +export class WantedPromotionPieceTypeNotProvidedException extends Error { + constructor() { + super('The type of the wanted Piece for the promotion was not provided'); + } +} diff --git a/src/app/common/engine/game.ts b/src/app/common/engine/game.ts new file mode 100644 index 0000000..5587821 --- /dev/null +++ b/src/app/common/engine/game.ts @@ -0,0 +1,427 @@ +import { GameOverException } from './exception/gameOverException'; +import { + BOARD_SIDE_LENGTH, + Bishop, + Coordinate, + GameState, + King, + Knight, + LastMove, + MovementNotAllowedException, + NotYourTurnException, + Pawn, + Piece, + PieceNotFoundOnGameBoardException, + PieceSide, + PieceType, + PromotionNotAllowedException, + Queen, + Rook, + WantedPromotionPieceTypeNotProvidedException, +} from './internal'; + +export class Game { + private static readonly BOARD_TO_STRING_PIECE_SPACING = 8; + private static readonly BOARD_TO_STRING_EMPTY_CELL_PLACE_HOLDER = '*'; + + private _state: GameState; + + private _sideTurn: PieceSide; + + private _lastMove: LastMove | undefined; + + private _pieces: Piece[]; + + private _history: Piece[][]; + + public constructor( + state?: GameState, + sideTurn?: PieceSide, + lastMove?: LastMove | undefined, + pieces?: Piece[], + history?: Piece[][] + ) { + if (state !== undefined && sideTurn !== undefined && pieces !== undefined && history !== undefined) { + this._state = state; + this._sideTurn = sideTurn; + this._lastMove = lastMove; + this._pieces = Piece.clone(pieces); + this._history = history.map((h) => Piece.clone(h)); + } else { + this._state = GameState.IN_PROGRESS; + this._sideTurn = PieceSide.WHITE; + this._pieces = Game.getInitialPiecesPositions(); + this._history = []; + } + } + + public get state(): GameState { + return this._state; + } + + public get sideTurn(): PieceSide { + return this._sideTurn; + } + + public get lastMove(): LastMove | undefined { + return this._lastMove; + } + + public get pieces(): Piece[] { + return Piece.clone(this._pieces); + } + + public get history(): Piece[][] { + return this._history.map((h) => Piece.clone(h)); + } + + /** + * Get the list of captured piece types for a given side in a + * chess game. + * + * @param pieceSide The side of the captured piece types. + * @returns List of captured piece types by + * the specified piece side. + */ + public getCapturedPieceTypeList(pieceSide: PieceSide) { + const capturedPiecesType: PieceType[] = []; + for (let i = pieceSide === PieceSide.WHITE ? 2 : 1; i <= this._history.length; i += 2) { + const previous = this._history[i - 1]; + const current = i < this._history.length ? this._history[i] : this.pieces; + const previousTypes = previous.filter((piece) => piece.side === pieceSide).map((piece) => piece.type); + const currentTypes = current.filter((piece) => piece.side === pieceSide).map((piece) => piece.type); + if (previousTypes.length !== currentTypes.length) { + const missingType = previousTypes.find( + (pType) => + previousTypes.filter((type) => type === pType).length !== + currentTypes.filter((type) => type === pType).length + ); + capturedPiecesType.push(missingType!); + } + } + return capturedPiecesType; + } + + /** + * Get the list of initial positions for both white and black chess pieces. + * + * @return A list of {@link Piece} objects. + */ + private static getInitialPiecesPositions(): Piece[] { + const whites = [ + // Pawn + new Pawn(PieceSide.WHITE, new Coordinate(-4, 5, -1)), + new Pawn(PieceSide.WHITE, new Coordinate(-3, 4, -1)), + new Pawn(PieceSide.WHITE, new Coordinate(-2, 3, -1)), + new Pawn(PieceSide.WHITE, new Coordinate(-1, 2, -1)), + new Pawn(PieceSide.WHITE, new Coordinate(0, 1, -1)), + new Pawn(PieceSide.WHITE, new Coordinate(1, 1, -2)), + new Pawn(PieceSide.WHITE, new Coordinate(2, 1, -3)), + new Pawn(PieceSide.WHITE, new Coordinate(3, 1, -4)), + new Pawn(PieceSide.WHITE, new Coordinate(4, 1, -5)), + // Bishop + new Bishop(PieceSide.WHITE, new Coordinate(0, 5, -5)), + new Bishop(PieceSide.WHITE, new Coordinate(0, 4, -4)), + new Bishop(PieceSide.WHITE, new Coordinate(0, 3, -3)), + // Knight + new Knight(PieceSide.WHITE, new Coordinate(-2, 5, -3)), + new Knight(PieceSide.WHITE, new Coordinate(2, 3, -5)), + // Rook + new Rook(PieceSide.WHITE, new Coordinate(-3, 5, -2)), + new Rook(PieceSide.WHITE, new Coordinate(3, 2, -5)), + // King + new King(PieceSide.WHITE, new Coordinate(-1, 5, -4)), + // Queen + new Queen(PieceSide.WHITE, new Coordinate(1, 4, -5)), + ]; + const blacks = Piece.clone(whites); + blacks.forEach((piece) => { + piece.side = PieceSide.BLACK; + piece.coordinate = piece.coordinate.horizontalReflection(); + }); + return [...whites, ...blacks]; + } + + /** + * Moves a piece from one coordinate to another, performing necessary checks and updates. + * + * @param from The current {@link Coordinate} of the {@link Piece} that needs to be moved. + * @param to The destination {@link Coordinate} where the {@link Piece} is being moved to. + * @param wantedPromotionPieceType The type of piece that the pawn wants to be promoted to. + */ + public movePiece(from: Coordinate, to: Coordinate, wantedPromotionPieceType: PieceType | undefined): void { + if (this.isEnded()) { + throw new GameOverException(this._state); + } + let piece = Piece.findPiece(this._pieces, undefined, undefined, from); + if (piece === undefined) { + throw new PieceNotFoundOnGameBoardException(from); + } + if (piece.side !== this._sideTurn) { + throw new NotYourTurnException(piece.side); + } + if (!piece.isMoveValid(to, this._pieces, this._lastMove)) { + throw new MovementNotAllowedException(piece, to); + } + if (piece instanceof Pawn && Pawn.getPossibleCoordinatesToPromote(piece.side).some((c) => c.equals(to))) { + piece = this.promotesPawn(piece, wantedPromotionPieceType); + } else if (wantedPromotionPieceType != null) { + throw new PromotionNotAllowedException(piece, to); + } else { + this.addCurrentPiecesToHistory(); + } + this.removeCapturedPiece(piece, to); + piece.coordinate = to; + this._lastMove = { from, to } as LastMove; + this.updateGameState(); + this._sideTurn = this._sideTurn === PieceSide.WHITE ? PieceSide.BLACK : PieceSide.WHITE; + } + + /** + * Promotes a pawn to a desired piece type and returns the new piece. + * + * @param pawn Represents the pawn piece that needs to be promoted. + * @param wantedPromotionPieceType Represents the type of piece that the pawn wants to be promoted + * to. + * @return The newly created {@link Piece}. + */ + private promotesPawn(pawn: Pawn, wantedPromotionPieceType: PieceType | undefined): Piece { + if (wantedPromotionPieceType === undefined) { + throw new WantedPromotionPieceTypeNotProvidedException(); + } + this.addCurrentPiecesToHistory(); + this._pieces = this._pieces.filter((p) => !p.equals(pawn)); + const newPiece = Piece.createPiece(wantedPromotionPieceType!, pawn.side, pawn.coordinate); + this._pieces.push(newPiece); + return newPiece; + } + + /** + * Set and determines the current state of the game. + */ + private updateGameState() { + const king = Piece.findPiece( + this._pieces, + PieceType.KING, + this._sideTurn === PieceSide.WHITE ? PieceSide.BLACK : PieceSide.WHITE, + undefined + )! as King; + if (king.isCheck(this._pieces, undefined)) { + this.updateGameStateCheck(); + } else if (this.isDrawStalemate()) { + this._state = GameState.DRAW_STALEMATE; + } else if (this.isDrawInsufficientMaterial()) { + this._state = GameState.DRAW_INSUFFICIENT_MATERIAL; + } else if (this.isDrawThreefoldRepetition()) { + this._state = GameState.DRAW_THREEFOLD_REPETITION; + } else { + this._state = GameState.IN_PROGRESS; + } + } + + /** + * Set and determines the game state to indicate whether the white or black side has won, or if + * either side is in check. + */ + private updateGameStateCheck() { + const king = Piece.findPiece( + this._pieces, + PieceType.KING, + this._sideTurn === PieceSide.WHITE ? PieceSide.BLACK : PieceSide.WHITE, + undefined + )! as King; + if (king.isCheckMate(this._pieces, undefined)) { + this._state = king.side === PieceSide.WHITE ? GameState.BLACK_WON : GameState.WHITE_WON; + } else { + this._state = king.side === PieceSide.WHITE ? GameState.WHITE_IN_CHECK : GameState.BLACK_IN_CHECK; + } + } + + private isEnded() { + return !( + this._state === GameState.IN_PROGRESS || + this._state === GameState.WHITE_IN_CHECK || + this._state === GameState.BLACK_IN_CHECK + ); + } + + /** + * Checks if there is a stalemate in the game. + * + * @return A boolean value. + */ + private isDrawStalemate(): boolean { + return Piece.findPieces( + this._pieces, + undefined, + this._sideTurn === PieceSide.WHITE ? PieceSide.BLACK : PieceSide.WHITE + ).every((piece) => piece.allPossibleMoves(this._pieces, this._lastMove, true).length === 0); + } + + /** + * Checks if there is insufficient material in the game. + * + * @return A boolean value. + */ + private isDrawInsufficientMaterial(): boolean { + return this.isDrawInsufficientMaterialSide(PieceSide.WHITE) && this.isDrawInsufficientMaterialSide(PieceSide.BLACK); + } + + /** + * Checks if a given side is insufficient material in the game. + * + * @param side Represents the side of the chessboard for which we want to check if there is + * insufficient material. + * @return A boolean value. + */ + private isDrawInsufficientMaterialSide(side: PieceSide): boolean { + const sidePieces = Piece.findPieces(this._pieces, undefined, side); + return ( + sidePieces.length <= 2 && + !sidePieces.some((piece) => piece.type === PieceType.PAWN) && + sidePieces.filter((piece) => [PieceType.KING, PieceType.BISHOP, PieceType.KNIGHT].includes(piece.type)).length == + sidePieces.length + ); + } + + /** + * Checks if there is a threefold repetition in a game of chess. + * + * @return A boolean value. + */ + private isDrawThreefoldRepetition(): boolean { + if (this._history.length > 3) { + let count = 0; + for (let i = this._history.length - 1; i > 0; i--) { + if (Piece.listEquals(this._history.at(-1)!, this._history.at(i)!)) { + count++; + } + } + return count >= 3; + } + return false; + } + + /** + * Adds a clone of the current pieces to the history list. + */ + private addCurrentPiecesToHistory() { + this._history.push(Piece.clone(this._pieces)); + } + + /** + * Removes the captured piece from the game based on the type of piece and the move made. + * + * @param piece Represents the chess piece that is being moved. + * @param to Represents the coordinate where the piece is being moved to. + */ + private removeCapturedPiece(piece: Piece, to: Coordinate) { + let pieceCoordinateToRemove: Coordinate; + if ( + piece.type === PieceType.PAWN && // En Passant + to.equals((piece as Pawn).enPassantMove(this._pieces, this._lastMove, true)) + ) { + pieceCoordinateToRemove = to.add( + piece.side === PieceSide.WHITE ? Coordinate.DIRECTION_VECTORS[5] : Coordinate.DIRECTION_VECTORS[2] + ); + } else { + pieceCoordinateToRemove = to; + } + this._pieces = this._pieces.filter((p) => !p.coordinate.equals(pieceCoordinateToRemove)); + } + + /** + * Generates a string representation of the game object, including its state, side turn, last move, + * pieces, and the game board. + * + * @return A string. + */ + public toString(): string { + return `Game(state=${this._state}, sideTurn=${this._sideTurn}, lastMove=${JSON.stringify( + this._lastMove + )}, pieces=${JSON.stringify(this._pieces)})\n\n${this.gameBoardToString()}`; + } + + /** + * Generates a string representation of a game board. + * + * @return A string representation of the game board. + */ + public gameBoardToString(): string { + let str = ''; + + let lastRowStartingCoordinate = new Coordinate(1, BOARD_SIDE_LENGTH * -1, BOARD_SIDE_LENGTH - 1); + // Top + let piecesInRow = 1; + for (; piecesInRow < BOARD_SIDE_LENGTH + 1; piecesInRow++) { + str += this.rowToString(piecesInRow, lastRowStartingCoordinate, 1); + lastRowStartingCoordinate = lastRowStartingCoordinate.add(this.getGrowingDirectionVector(1)); + } + // Middle + piecesInRow = BOARD_SIDE_LENGTH; + for (let row = 1; row < BOARD_SIDE_LENGTH * 2 - 2; row++) { + const growingDirection = row % 2 == 0 ? 1 : -1; + piecesInRow += growingDirection; + str += this.rowToString(piecesInRow, lastRowStartingCoordinate, growingDirection); + lastRowStartingCoordinate = lastRowStartingCoordinate.add(this.getGrowingDirectionVector(growingDirection)); + } + // Bottom + for (piecesInRow = BOARD_SIDE_LENGTH; piecesInRow > 0; piecesInRow--) { + const growingDirection = piecesInRow == BOARD_SIDE_LENGTH ? 1 : -1; + str += this.rowToString(piecesInRow, lastRowStartingCoordinate, growingDirection); + lastRowStartingCoordinate = lastRowStartingCoordinate.add(this.getGrowingDirectionVector(growingDirection)); + } + return str; + } + + private getGrowingDirectionVector(growingDirection: number): Coordinate { + return growingDirection == 1 ? Coordinate.DIRECTION_VECTORS[4] : Coordinate.DIRECTION_VECTORS[0]; + } + + /** + * Generates a string representation of a row of the game board. + * + * @param piecesInRow Represents the number of pieces in the row. + * @param lastRowStartingCoordinate Represents the starting coordinate of the last row. + * @param growingDirection The `growingDirection` parameter represents the direction in which the + * row is growing. + * @return A string representation of a row of the game board. + */ + private rowToString(piecesInRow: number, lastRowStartingCoordinate: Coordinate, growingDirection: number): string { + const row: (Piece | undefined)[] = []; + lastRowStartingCoordinate = lastRowStartingCoordinate.add(this.getGrowingDirectionVector(growingDirection)); + for (let i = 0; i < piecesInRow; i++) { + row.push(this._pieces.find((piece) => piece.coordinate.equals(lastRowStartingCoordinate))); + lastRowStartingCoordinate = lastRowStartingCoordinate.add(Coordinate.DIAGONAL_VECTORS[0]); + } + return this.rowPiecesToString(row) + '\n'; + } + + /** + * A helper method to generates a string representation of a row of the game board. + * + * @param pieces A list of Piece objects representing the pieces in a row on a chessboard. + * @return A string representation of a row of the game board. + */ + private rowPiecesToString(pieces: (Piece | undefined)[]): string { + const width = (BOARD_SIDE_LENGTH - 1) * Game.BOARD_TO_STRING_PIECE_SPACING + BOARD_SIDE_LENGTH; + const padding = (width - (pieces.length - 1) * Game.BOARD_TO_STRING_PIECE_SPACING) / 2; + const row = pieces.map((piece) => { + if (piece === undefined) { + return Game.BOARD_TO_STRING_EMPTY_CELL_PLACE_HOLDER; + } + let str = ''; + if (this._lastMove !== undefined && piece.coordinate.equals(this._lastMove.to)) { + str += '\x1B[1m'; + } + if (piece.side === PieceSide.WHITE) { + str += '\x1B[107m' + '\x1B[30m'; + } else { + str += '\x1B[97m' + '\x1B[40m'; + } + str += piece.type + '\x1B[0m'; + return str; + }); + return ' '.repeat(padding) + row.join(' '.repeat(Game.BOARD_TO_STRING_PIECE_SPACING)); + } +} diff --git a/src/app/common/engine/internal.ts b/src/app/common/engine/internal.ts new file mode 100644 index 0000000..6d2dc2d --- /dev/null +++ b/src/app/common/engine/internal.ts @@ -0,0 +1,31 @@ +/* +The only reason for this file to exist is pure horror: +Without it rollup can make the bundling fail at any point in time; when it rolls up the files in the wrong order +it will cause undefined errors (for example because super classes or local variables not being hoisted). +With this file that will still happen, +but at least in this file we can magically reorder the imports with trial and error until the build succeeds again. + +See: +https://medium.com/visual-development/how-to-fix-nasty-circular-dependency-issues-once-and-for-all-in-javascript-typescript-a04c987cf0de#9afb +*/ + +export * from './enumeration/gameState'; +export * from './enumeration/pieceSide'; +export * from './enumeration/pieceType'; +export * from './exception/movementNotAllowedException'; +export * from './exception/multiplePiecesFoundRuntimeException'; +export * from './exception/notYourTurnException'; +export * from './exception/pieceNotFoundOnGameBoardException'; +export * from './exception/promotionNotAllowedException'; +export * from './exception/wantedPromotionPieceTypeNotProvidedException'; +export * from './constant'; +export * from './coordinate'; +export * from './piece/possibleMovement'; +export * from './piece/piece'; +export * from './piece/king'; +export * from './piece/bishop'; +export * from './piece/knight'; +export * from './piece/pawn'; +export * from './piece/queen'; +export * from './piece/rook'; +export * from './game'; diff --git a/src/app/common/engine/piece/bishop.ts b/src/app/common/engine/piece/bishop.ts new file mode 100644 index 0000000..9ad2b18 --- /dev/null +++ b/src/app/common/engine/piece/bishop.ts @@ -0,0 +1,24 @@ +import { Coordinate, LastMove, Piece, PieceSide, PieceType, PossibleMovement } from '../internal'; + +export class Bishop extends Piece { + private static readonly POSSIBLE_MOVES: PossibleMovement[] = [ + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[1], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[0], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[5], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[4], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[3], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[2], Number.MAX_SAFE_INTEGER), + ]; + + public constructor(side: PieceSide, coordinate: Coordinate) { + super(PieceType.BISHOP, side, coordinate); + } + + public allPossibleMoves( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[] { + return this.extractPlayableMoves(Bishop.POSSIBLE_MOVES, piecesOnGameBoard, lastMove, checkForSelfCheck); + } +} diff --git a/src/app/common/engine/piece/king.ts b/src/app/common/engine/piece/king.ts new file mode 100644 index 0000000..ff5be88 --- /dev/null +++ b/src/app/common/engine/piece/king.ts @@ -0,0 +1,57 @@ +import { Coordinate, LastMove, Piece, PieceSide, PieceType, PossibleMovement } from '../internal'; + +export class King extends Piece { + private static readonly POSSIBLE_MOVES: PossibleMovement[] = [ + new PossibleMovement(Coordinate.DIRECTION_VECTORS[2], 1), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[1], 1), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[0], 1), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[5], 1), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[4], 1), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[3], 1), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[1], 1), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[0], 1), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[5], 1), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[4], 1), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[3], 1), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[2], 1), + ]; + + public constructor(side: PieceSide, coordinate: Coordinate) { + super(PieceType.KING, side, coordinate); + } + + public allPossibleMoves( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[] { + return this.extractPlayableMoves(King.POSSIBLE_MOVES, piecesOnGameBoard, lastMove, checkForSelfCheck); + } + + public isCheck(piecesOnGameBoard: Piece[], lastMove: LastMove | undefined): boolean { + return piecesOnGameBoard + .filter((piece) => piece.side !== this._side) + .some((piece) => + piece.allPossibleMoves(piecesOnGameBoard, lastMove, false).some((c) => this._coordinate.equals(c)) + ); + } + + public isCheckMate(piecesOnGameBoard: Piece[], lastMove: LastMove | undefined): boolean { + if (!this.isCheck(piecesOnGameBoard, lastMove)) { + return false; + } + return !piecesOnGameBoard + .filter((piece) => piece.side === this._side) + .some((piece) => + piece.allPossibleMoves(piecesOnGameBoard, lastMove, false).some((c) => { + const newBoard = Piece.clone(piecesOnGameBoard); + const pieceOfNewBoard = newBoard.find((p) => piece.equals(p))!; + pieceOfNewBoard.coordinate = c; + return !(Piece.findPiece(newBoard, this.type, this.side, undefined) as King).isCheck(newBoard, { + from: piece.coordinate, + to: c, + } as LastMove); + }) + ); + } +} diff --git a/src/app/common/engine/piece/knight.ts b/src/app/common/engine/piece/knight.ts new file mode 100644 index 0000000..b2b2454 --- /dev/null +++ b/src/app/common/engine/piece/knight.ts @@ -0,0 +1,30 @@ +import { Coordinate, LastMove, Piece, PieceSide, PieceType, PossibleMovement } from '../internal'; + +export class Knight extends Piece { + private static readonly POSSIBLE_MOVES: PossibleMovement[] = [ + new PossibleMovement(new Coordinate(3, -2, -1), 1), + new PossibleMovement(new Coordinate(3, -1, -2), 1), + new PossibleMovement(new Coordinate(2, 1, -3), 1), + new PossibleMovement(new Coordinate(1, 2, -3), 1), + new PossibleMovement(new Coordinate(-2, 3, -1), 1), + new PossibleMovement(new Coordinate(-1, 3, -2), 1), + new PossibleMovement(new Coordinate(-3, 1, 2), 1), + new PossibleMovement(new Coordinate(-3, 2, 1), 1), + new PossibleMovement(new Coordinate(-1, -2, 3), 1), + new PossibleMovement(new Coordinate(-2, -1, 3), 1), + new PossibleMovement(new Coordinate(1, -3, 2), 1), + new PossibleMovement(new Coordinate(2, -3, 1), 1), + ]; + + public constructor(side: PieceSide, coordinate: Coordinate) { + super(PieceType.KNIGHT, side, coordinate); + } + + public allPossibleMoves( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[] { + return this.extractPlayableMoves(Knight.POSSIBLE_MOVES, piecesOnGameBoard, lastMove, checkForSelfCheck); + } +} diff --git a/src/app/common/engine/piece/pawn.ts b/src/app/common/engine/piece/pawn.ts new file mode 100644 index 0000000..fbc84eb --- /dev/null +++ b/src/app/common/engine/piece/pawn.ts @@ -0,0 +1,198 @@ +import { BOARD_SIDE_LENGTH, Coordinate, King, LastMove, Piece, PieceSide, PieceType } from '../internal'; + +export class Pawn extends Piece { + private static readonly FORWARD_2_ALLOWED_CELLS = [ + new Coordinate(-4, 5, -1), + new Coordinate(-3, 4, -1), + new Coordinate(-2, 3, -1), + new Coordinate(-1, 2, -1), + new Coordinate(0, 1, -1), + new Coordinate(1, 1, -2), + new Coordinate(2, 1, -3), + new Coordinate(3, 1, -4), + new Coordinate(4, 1, -5), + ]; + + public constructor(side: PieceSide, coordinate: Coordinate) { + super(PieceType.PAWN, side, coordinate); + } + + /** + * Get a list of valid {@link Coordinate}s for promoting a pawn. + * + * @param side Represents the side of the chessboard for which we want to get the possible + * coordinates to promote a pawn. + * @return A List of {@link Coordinate} objects. + */ + public static getPossibleCoordinatesToPromote(side: PieceSide): Coordinate[] { + const diagonals = [Coordinate.DIRECTION_VECTORS[4], Coordinate.DIRECTION_VECTORS[0]]; + const top = new Coordinate(0, (BOARD_SIDE_LENGTH - 1) * -1, BOARD_SIDE_LENGTH - 1); + const result = diagonals.flatMap((diagonal) => { + const coordinates: Coordinate[] = []; + for (let i = 0; i < BOARD_SIDE_LENGTH - 1; i++) { + coordinates.push((coordinates.length < 1 ? top : coordinates.at(-1))!.add(diagonal)); + } + return coordinates; + }); + result.push(top); + return side === PieceSide.WHITE ? result : result.map((c) => c.horizontalReflection()); + } + + public allPossibleMoves( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[] { + const allPossibleMovements: (Coordinate | undefined)[] = []; + allPossibleMovements.push(this.forward1Move(piecesOnGameBoard, lastMove, checkForSelfCheck)); + allPossibleMovements.push(this.forward2Move(piecesOnGameBoard, lastMove, checkForSelfCheck)); + allPossibleMovements.push(...this.captureMoves(piecesOnGameBoard, lastMove, checkForSelfCheck)); + allPossibleMovements.push(this.enPassantMove(piecesOnGameBoard, lastMove, checkForSelfCheck)); + return allPossibleMovements.filter((m) => m !== undefined) as Coordinate[]; + } + + /** + * Checks if the pawn can move forward one spaces on a game board. + * + * @param piecesOnGameBoard The list of {@link Piece}s currently on the game board. + * @param checkForSelfCheck If it is set to true, the method should consider the possibility of the + * move resulting in a check condition for the player making the move. + * @return An {@link Optional} object that contains a {@link Coordinate} representing the possible + * move. + */ + private forward1Move( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate | undefined { + const forwardVector = this.reflectIfBlack(Coordinate.DIRECTION_VECTORS[2]); + const forward = this._coordinate.add(forwardVector); + if ( + piecesOnGameBoard.some((piece) => piece.coordinate.equals(forward)) || + (checkForSelfCheck && this.checkIfMoveCauseSelfCheck(forward, piecesOnGameBoard, lastMove)) + ) { + return undefined; + } + return forward; + } + + /** + * Checks if the Pawn can move forward two spaces on a game board. + * + * @param piecesOnGameBoard The list of {@link Piece}s currently on the game board. + * @param checkForSelfCheck If it is set to true, the method should consider the possibility of the + * move resulting in a check condition for the player making the move. + * @return An {@link Optional} object that contains a {@link Coordinate} representing the possible + * move. + */ + private forward2Move( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate | undefined { + if (!this.reflectListIfBlack(Pawn.FORWARD_2_ALLOWED_CELLS).find((c) => c.equals(this._coordinate))) { + return undefined; + } + const forwardVector = this.reflectIfBlack(Coordinate.DIRECTION_VECTORS[2]); + const forward = this._coordinate.add(forwardVector); + const forward2 = this._coordinate.add(forwardVector.multiply(2)); + if ( + piecesOnGameBoard.some((piece) => piece.coordinate.equals(forward) || piece.coordinate.equals(forward2)) || + (checkForSelfCheck && this.checkIfMoveCauseSelfCheck(forward2, piecesOnGameBoard, lastMove)) + ) { + return undefined; + } + return forward2; + } + + /** + * Checks if the Pawn can eat other pieces on a game board. + * + * @param piecesOnGameBoard The list of {@link Piece}s currently on the game board. + * @param checkForSelfCheck If it is set to true, the method should consider the possibility of the + * move resulting in a check condition for the player making the move. + * @return A list of {@link Coordinate}s representing possible moves. + */ + private captureMoves( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[] { + const diagonalVectors = [Coordinate.DIRECTION_VECTORS[1], Coordinate.DIRECTION_VECTORS[3]].map((c) => + this.reflectIfBlack(c) + ); + return diagonalVectors + .map((v) => this._coordinate.add(v)) + .filter( + (c) => + piecesOnGameBoard.some((piece) => piece.coordinate.equals(c) && piece.side !== this._side) && + (!checkForSelfCheck || !this.checkIfMoveCauseSelfCheck(c, piecesOnGameBoard, lastMove)) + ); + } + + /** + * Checks if the Pawn can eat other pieces on a game board using the "en passant" move. + * + * @param piecesOnGameBoard The list of {@link Piece}s currently on the game board. + * @param lastMove Represents the last move made in the game. + * @param checkForSelfCheck If it is set to true, the method should consider the possibility of the + * move resulting in a check condition for the player making the move. + * @return An {@link Optional} object that contains a {@link Coordinate} representing the possible + * move. + */ + public enPassantMove( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate | undefined { + if (lastMove == null) { + return undefined; + } + const lastMovePiece = Piece.findPiece( + piecesOnGameBoard, + undefined, + this._side === PieceSide.WHITE ? PieceSide.BLACK : PieceSide.WHITE, + lastMove.to + ); + if (lastMovePiece === undefined) { + return undefined; + } + if (lastMovePiece.type !== PieceType.PAWN || lastMove.from.distance(lastMove.to) != 2) { + return undefined; + } + const diagonalDownVectors = [Coordinate.DIRECTION_VECTORS[0], Coordinate.DIRECTION_VECTORS[4]].map((c) => + this.reflectIfBlack(c) + ); + return diagonalDownVectors + .filter( + (v) => + this._coordinate.add(v).equals(lastMove.to) && + (!checkForSelfCheck || !this.checkIfMoveCauseSelfCheck(this._coordinate.add(v), piecesOnGameBoard, lastMove)) + ) + .map((v) => this._coordinate.add(v.horizontalReflection()))[0]; + } + + protected override checkIfMoveCauseSelfCheck( + to: Coordinate, + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined + ): boolean { + let newBoard = Piece.clone(piecesOnGameBoard); + const newPiece = newBoard.find((p) => p.equals(this))! as Pawn; + const newLastMove = { from: newPiece.coordinate, to: to }; + let pieceCoordinateToRemove: Coordinate; + if (to.equals(newPiece.enPassantMove(piecesOnGameBoard, lastMove, false))) { + pieceCoordinateToRemove = to.add( + this.side === PieceSide.WHITE ? Coordinate.DIRECTION_VECTORS[5] : Coordinate.DIRECTION_VECTORS[2] + ); + } else { + pieceCoordinateToRemove = to; + } + newBoard = newBoard.filter((piece) => !piece.coordinate.equals(pieceCoordinateToRemove)); + newPiece.coordinate = to; + return (newBoard.find((piece) => piece.side === this._side && piece.type === PieceType.KING)! as King).isCheck( + newBoard, + newLastMove + ); + } +} diff --git a/src/app/common/engine/piece/piece.ts b/src/app/common/engine/piece/piece.ts new file mode 100644 index 0000000..d018ecf --- /dev/null +++ b/src/app/common/engine/piece/piece.ts @@ -0,0 +1,303 @@ +import { + BOARD_SIDE_LENGTH, + Bishop, + Coordinate, + Game, + King, + Knight, + LastMove, + MultiplePiecesFoundRuntimeException, + Pawn, + PieceSide, + PieceType, + PossibleMovement, + Queen, + Rook, +} from '../internal'; + +export abstract class Piece { + protected constructor( + protected readonly _type: PieceType, + protected _side: PieceSide, + protected _coordinate: Coordinate + ) {} + + public get type(): PieceType { + return this._type; + } + + public get side(): PieceSide { + return this._side; + } + + public set side(side: PieceSide) { + this._side = side; + } + + public get coordinate(): Coordinate { + return this._coordinate; + } + + public set coordinate(coordinate: Coordinate) { + this._coordinate = coordinate; + } + + /** + * Takes a list of {@link Piece} objects and returns a new list containing clones of each object. + * + * @param pieces The list of {@link Piece}s. + * @return A new list of cloned {@link Piece}s. + */ + public static clone(pieces: Piece[]): Piece[] { + return pieces.map((p) => p.clone()); + } + + /** + * The function creates a new instance of a chess piece based on the given piece type, side, and + * coordinate. + * + * @param type The type of the chess piece that needs to be created. + * @param side The side/color of the piece. + * @param coordinate The position of the piece on a chessboard. + * @return A new {@link Piece} object. + */ + public static createPiece(type: PieceType, side: PieceSide, coordinate: Coordinate): Piece { + switch (type) { + case PieceType.BISHOP: + return new Bishop(side, coordinate); + case PieceType.KING: + return new King(side, coordinate); + case PieceType.KNIGHT: + return new Knight(side, coordinate); + case PieceType.PAWN: + return new Pawn(side, coordinate); + case PieceType.QUEEN: + return new Queen(side, coordinate); + case PieceType.ROOK: + return new Rook(side, coordinate); + } + } + + /** + * Finds a {@link Piece} by a specific coordinate, type and/or side. + * + * @param pieces A list of {@link Piece} objects. + * @param type The type of the piece you are looking for. + * @param side The side of the piece you are looking for. + * @param coordinate The coordinate of the piece you are looking for. + * @return A {@link Piece} object or undefined. + */ + public static findPiece( + pieces: Piece[], + type: PieceType | undefined, + side: PieceSide | undefined, + coordinate: Coordinate | undefined + ): Piece | undefined { + const p = Piece.findPieces(pieces, type, side).filter( + (piece) => coordinate === undefined || piece.coordinate.equals(coordinate) + ); + if (p.length > 1) { + throw new MultiplePiecesFoundRuntimeException(pieces, type, side, coordinate); + } + return p.length > 0 ? p.at(0) : undefined; + } + + /** + * Finds a list of {@link Piece}s by a specific type and/or side. + * + * @param pieces A list of {@link Piece} objects. + * @param type The type of the piece you are looking for. + * @param side The side of the piece you are looking for. + * @return A {@link List} of {@link Piece} objects. + */ + public static findPieces(pieces: Piece[], type: PieceType | undefined, side: PieceSide | undefined): Piece[] { + return pieces.filter( + (piece) => (side === undefined || piece.side === side) && (type === undefined || piece.type === type) + ); + } + + /** + * Checks if two lists of {@link Piece}s are equal. + * + * @param piecesA A list of {@link Piece} objects. + * @param piecesB A second list of {@link Piece} objects. + * @return A boolean value. + */ + public static listEquals(piecesA: Piece[], piecesB: Piece[]): boolean { + if (piecesA.length != piecesB.length) { + return false; + } + const sortFn = (a: Piece, b: Piece) => { + if (a.coordinate.q != b.coordinate.q) { + return a.coordinate.q - b.coordinate.q; + } else if (a.coordinate.r != b.coordinate.r) { + return a.coordinate.r - b.coordinate.r; + } else if (a.coordinate.s != b.coordinate.s) { + return a.coordinate.s - b.coordinate.s; + } + return 0; + }; + const sortedPiecesA = Piece.clone(piecesA); + sortedPiecesA.sort(sortFn); + const sortedPiecesB = Piece.clone(piecesB); + sortedPiecesB.sort(sortFn); + + for (let i = 0; i < sortedPiecesA.length; i++) { + if (!Piece.equals(sortedPiecesA[i], sortedPiecesB[i])) { + return false; + } + } + return true; + } + + /** + * Checks if two {@link Piece} objects are equal. + * + * @param piecesA A {@link Piece} object. + * @param piecesB A second {@link Piece} object. + * @return A boolean value. + */ + public static equals(piecesA: Piece, piecesB: Piece): boolean { + return piecesA == piecesB || (piecesA != null && piecesA.equals(piecesB)); + } + + /** + * The function checks if a given move is valid using {@link #allPossibleMoves}. + * + * @param to Represents the coordinate where the player wants to move a piece to on the game board. + * @param piecesOnGameBoard The list of {@link Piece}s currently on the game board. + * @param lastMove Represents the last move made in the game. + * @return The method is returning a boolean value. + */ + public isMoveValid(to: Coordinate, piecesOnGameBoard: Piece[], lastMove: LastMove | undefined): boolean { + return this.allPossibleMoves(piecesOnGameBoard, lastMove, true).some((c) => c.equals(to)); + } + + /** + * Checks all the possible movements the piece can do on a game board. + * + * @param game The {@link Game}. + * @param checkForSelfCheck If it is set to true, the method should consider the possibility of the move + * resulting in a check condition for the player making the move. + * @return A list of {@link Coordinate}s representing possible moves. + */ + public allPossibleMovesFromGame(game: Game, checkForSelfCheck: boolean): Coordinate[] { + return this.allPossibleMoves(game.pieces, game.lastMove, checkForSelfCheck); + } + + /** + * Checks all the possible movements the piece can do on a game board. + * + * @param piecesOnGameBoard The list of {@link Piece}s currently on the game board. + * @param lastMove Represents the last move made in the game. + * @param checkForSelfCheck If it is set to true, the method should consider the possibility of the move + * resulting in a check condition for the player making the move. + * @return A list of {@link Coordinate}s representing possible moves. + */ + public abstract allPossibleMoves( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[]; + + /** + * The function checks if a move would cause the player's own king to be in check. + * + * @param to The coordinate where the piece is being moved to on the game board. + * @param piecesOnGameBoard The list of {@link Piece}s currently on the game board. + * @return {@code true} if the move would cause the player's own king to be in check. + */ + protected checkIfMoveCauseSelfCheck( + to: Coordinate, + piecesOnGameBoard: Piece[], + // eslint-disable-next-line @typescript-eslint/no-unused-vars + lastMove: LastMove | undefined + ): boolean { + let newBoard = Piece.clone(piecesOnGameBoard); + const newPiece = newBoard.find((p) => p.equals(this))!; + const newLastMove = { from: newPiece.coordinate, to: to }; + newBoard = newBoard.filter((piece) => !piece.coordinate.equals(to)); + newPiece.coordinate = to; + return (newBoard.find((piece) => piece.side === this._side && piece.type === PieceType.KING)! as King).isCheck( + newBoard, + newLastMove + ); + } + + /** + * Extracts a list of playable moves from a list of possible movements, given the pieces on the game + * board. + * + * @param possibleMovements A list of {@link PossibleMovement} objects, which represent the possible + * movements that the piece can make. + * @param piecesOnGameBoard The list of {@link Piece}s currently on the game board. + * @param lastMove Represents the last move made in the game. + * @param checkForSelfCheck If it is set to true, the method should consider the possibility of the + * move resulting in a check condition for the player making the move. + * @return The method is returning a List of {@link Coordinate}. + */ + protected extractPlayableMoves( + possibleMovements: PossibleMovement[], + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[] { + return possibleMovements.flatMap((possibleMovement) => { + const moves: Coordinate[] = []; + const vector = this.reflectIfBlack(possibleMovement.vector); + let c = this._coordinate; + for (let i = 0; i < Math.min(possibleMovement.maxRange, (BOARD_SIDE_LENGTH - 1) * 2); i++) { + c = c.add(vector); + if (c.distance(Coordinate.ORIGIN) < BOARD_SIDE_LENGTH) { + const piece = piecesOnGameBoard.find((piece) => piece.coordinate.equals(c)); + if (piece !== undefined) { + if ( + piece.side !== this._side && + (!checkForSelfCheck || !this.checkIfMoveCauseSelfCheck(c, piecesOnGameBoard, lastMove)) + ) { + moves.push(c); + } + break; + } + if (!checkForSelfCheck || !this.checkIfMoveCauseSelfCheck(c, piecesOnGameBoard, lastMove)) { + moves.push(c); + } + } + } + return moves; + }); + } + + /** + * Reflects the {@link Coordinate} if the {@link Piece#side piece side} is black. + * + * @param coordinate The {@link Coordinate} to reflect. + * @return The {@link Coordinate} possibly reflected. + */ + protected reflectIfBlack(coordinate: Coordinate): Coordinate { + return this._side === PieceSide.WHITE ? coordinate : coordinate.horizontalReflection(); + } + + /** + * Reflects the {@link Coordinate}s if the {@link Piece#side piece side} is black. + * + * @param coordinates The {@link Coordinate}s to reflect. + * @return The {@link Coordinate}s possibly reflected. + */ + protected reflectListIfBlack(coordinates: Coordinate[]): Coordinate[] { + return coordinates.map((c) => this.reflectIfBlack(c)); + } + + /** + * Create a clone of an {@link Piece} by using the specific copy constructor of the Piece. + * + * @return A clone of the {@link Piece} object. + */ + public clone(): Piece { + return Piece.createPiece(this._type, this._side, this._coordinate); + } + + public equals(piece: Piece): boolean { + return this._type === piece.type && this._side === piece.side && this._coordinate.equals(piece.coordinate); + } +} diff --git a/src/app/common/engine/piece/possibleMovement.ts b/src/app/common/engine/piece/possibleMovement.ts new file mode 100644 index 0000000..9823e28 --- /dev/null +++ b/src/app/common/engine/piece/possibleMovement.ts @@ -0,0 +1,13 @@ +import { Coordinate } from '../internal'; + +export class PossibleMovement { + constructor(private _vector: Coordinate, private _maxRange: number) {} + + public get vector(): Coordinate { + return this._vector; + } + + public get maxRange(): number { + return this._maxRange; + } +} diff --git a/src/app/common/engine/piece/queen.ts b/src/app/common/engine/piece/queen.ts new file mode 100644 index 0000000..7e3e638 --- /dev/null +++ b/src/app/common/engine/piece/queen.ts @@ -0,0 +1,30 @@ +import { Coordinate, LastMove, Piece, PieceSide, PieceType, PossibleMovement } from '../internal'; + +export class Queen extends Piece { + private static readonly POSSIBLE_MOVES: PossibleMovement[] = [ + new PossibleMovement(Coordinate.DIRECTION_VECTORS[2], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[1], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[0], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[5], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[4], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[3], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[1], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[0], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[5], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[4], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[3], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIAGONAL_VECTORS[2], Number.MAX_SAFE_INTEGER), + ]; + + public constructor(side: PieceSide, coordinate: Coordinate) { + super(PieceType.QUEEN, side, coordinate); + } + + public allPossibleMoves( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[] { + return this.extractPlayableMoves(Queen.POSSIBLE_MOVES, piecesOnGameBoard, lastMove, checkForSelfCheck); + } +} diff --git a/src/app/common/engine/piece/rook.ts b/src/app/common/engine/piece/rook.ts new file mode 100644 index 0000000..6a582b4 --- /dev/null +++ b/src/app/common/engine/piece/rook.ts @@ -0,0 +1,24 @@ +import { Coordinate, LastMove, Piece, PieceSide, PieceType, PossibleMovement } from '../internal'; + +export class Rook extends Piece { + private static readonly POSSIBLE_MOVES: PossibleMovement[] = [ + new PossibleMovement(Coordinate.DIRECTION_VECTORS[2], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[1], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[0], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[5], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[4], Number.MAX_SAFE_INTEGER), + new PossibleMovement(Coordinate.DIRECTION_VECTORS[3], Number.MAX_SAFE_INTEGER), + ]; + + public constructor(side: PieceSide, coordinate: Coordinate) { + super(PieceType.ROOK, side, coordinate); + } + + public allPossibleMoves( + piecesOnGameBoard: Piece[], + lastMove: LastMove | undefined, + checkForSelfCheck: boolean + ): Coordinate[] { + return this.extractPlayableMoves(Rook.POSSIBLE_MOVES, piecesOnGameBoard, lastMove, checkForSelfCheck); + } +} diff --git a/src/app/common/utils/errorUtils.ts b/src/app/common/utils/errorUtils.ts new file mode 100644 index 0000000..4bbe2e4 --- /dev/null +++ b/src/app/common/utils/errorUtils.ts @@ -0,0 +1,23 @@ +import { HttpErrorResponse } from '@angular/common/http'; +import { ToastrService } from 'ngx-toastr'; +import { ErrorDto } from 'src/app/service/common/dto/errorDto'; + +export function onError(toastr: ToastrService, httpErrorResponse: HttpErrorResponse, msg?: string) { + console.error('error', httpErrorResponse); + if (httpErrorResponse.error !== null) { + const error = httpErrorResponse.error as ErrorDto; + msg = (msg !== undefined ? msg + '

' : '') + error.msg + '.'; + const title = error.errorId !== undefined ? 'ERROR ID: ' + error.errorId : undefined; + showErrorToast(toastr, msg, title); + } else { + showErrorToast(toastr, msg !== undefined ? msg : 'An error occurred'); + } +} + +export function showErrorToast(toastr: ToastrService, msg: string, title?: string, timeOut: number = 15000) { + toastr.error(msg, title, { + closeButton: true, + timeOut, + enableHtml: true, + }); +} diff --git a/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.html b/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.html new file mode 100644 index 0000000..71997a0 --- /dev/null +++ b/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.html @@ -0,0 +1,13 @@ + + diff --git a/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.scss b/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.scss new file mode 100644 index 0000000..5098d2e --- /dev/null +++ b/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.scss @@ -0,0 +1,4 @@ +::ng-deep .ag-cell-focus, +::ng-deep .ag-cell-no-focus { + border: none !important; +} diff --git a/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.ts b/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.ts new file mode 100644 index 0000000..2deec12 --- /dev/null +++ b/src/app/components/ag-grid/infinite-scroll-table/infinite-scroll-table.component.ts @@ -0,0 +1,80 @@ +import { ServerSideRowModelModule } from '@ag-grid-enterprise/server-side-row-model'; +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { AgGridModule } from 'ag-grid-angular'; +import { ColDef, GridApi, GridReadyEvent, IGetRowsParams, ModuleRegistry, RowModelType } from 'ag-grid-community'; +import { ToastrService } from 'ngx-toastr'; +import { Observable } from 'rxjs'; +import { onError } from 'src/app/common/utils/errorUtils'; +import { Direction } from 'src/app/service/common/dto/enumeration/direction'; +import { WindowDto } from 'src/app/service/common/dto/windowDto'; + +ModuleRegistry.registerModules([ServerSideRowModelModule]); + +@Component({ + selector: 'app-infinite-scroll-table', + standalone: true, + imports: [CommonModule, AgGridModule], + templateUrl: './infinite-scroll-table.component.html', + styleUrls: ['./infinite-scroll-table.component.scss'], +}) +export class InfiniteScrollTableComponent { + @Input() public getData: (direction: Direction, maxResults: number, cursor?: string) => Observable>; + @Input() public columnDefs: ColDef[]; + private api: GridApi; + + protected defaultColDef: ColDef = { + sortable: false, + flex: 1, + minWidth: 100, + }; + protected rowModelType: RowModelType = 'infinite'; + protected cacheBlockSize = 10; + protected maxConcurrentDatasourceRequests = 1; + + private requestHistory: { params: IGetRowsParams; cursor?: string }[] = []; + + private window: WindowDto | undefined; + protected rowData: TData[]; + + constructor(private toastr: ToastrService) {} + + onGridReady(params: GridReadyEvent) { + this.api = params.api!; + this.api.setDatasource({ + getRows: this.getRows.bind(this), + }); + } + + public refreshAllRows() { + this.api.purgeInfiniteCache(); + } + + private getRows(params: IGetRowsParams) { + const samePreviousRequest = this.requestHistory.find( + (previousRequest) => + previousRequest.params.endRow === params.endRow && previousRequest.params.startRow === params.startRow + ); + const maxResults = params.endRow - params.startRow; + this.getData( + Direction.FORWARD, + maxResults, + samePreviousRequest !== undefined ? samePreviousRequest.cursor : this.window?.endCursor + ).subscribe({ + next: (window) => { + if (samePreviousRequest === undefined) { + this.requestHistory.push({ params, cursor: this.window?.endCursor }); + } + this.window = window; + params.successCallback( + window.content, + !window.hasNextPage ? params.endRow - (maxResults - window.content.length) : undefined + ); + }, + error: (err) => { + params.failCallback(); + onError(this.toastr, err, 'An error occurred while loading games.'); + }, + }); + } +} diff --git a/src/app/components/ag-grid/menu-renderer/menu-renderer.component.html b/src/app/components/ag-grid/menu-renderer/menu-renderer.component.html new file mode 100644 index 0000000..f2be457 --- /dev/null +++ b/src/app/components/ag-grid/menu-renderer/menu-renderer.component.html @@ -0,0 +1,17 @@ +
+ + + + + + +
diff --git a/src/app/components/ag-grid/menu-renderer/menu-renderer.component.scss b/src/app/components/ag-grid/menu-renderer/menu-renderer.component.scss new file mode 100644 index 0000000..a9c2380 --- /dev/null +++ b/src/app/components/ag-grid/menu-renderer/menu-renderer.component.scss @@ -0,0 +1,8 @@ +.container { + display: flex; + justify-content: flex-end; + align-items: center; + width: 100%; + min-width: fit-content; + height: 100%; +} diff --git a/src/app/components/ag-grid/menu-renderer/menu-renderer.component.ts b/src/app/components/ag-grid/menu-renderer/menu-renderer.component.ts new file mode 100644 index 0000000..aad823d --- /dev/null +++ b/src/app/components/ag-grid/menu-renderer/menu-renderer.component.ts @@ -0,0 +1,52 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { ICellRendererAngularComp } from 'ag-grid-angular'; +import { ICellRendererParams } from 'ag-grid-community'; + +export interface MenuRendererParams extends ICellRendererParams { + items: MenuRendererParamsItem[]; + callback: (data: TData, id: string) => void; +} + +export interface MenuRendererParamsItem { + id: string; + icon: string; + text: string; + condition?: (data: TData) => boolean; +} + +@Component({ + selector: 'menu-cell', + standalone: true, + imports: [ + CommonModule, + MatToolbarModule, + MatSidenavModule, + MatListModule, + MatIconModule, + MatButtonModule, + MatGridListModule, + MatMenuModule, + ], + templateUrl: './menu-renderer.component.html', + styleUrls: ['./menu-renderer.component.scss'], +}) +export class MenuRendererComponent implements ICellRendererAngularComp { + params!: MenuRendererParams; + + agInit(params: MenuRendererParams) { + this.params = params; + } + + refresh(params: MenuRendererParams) { + this.params = params; + return true; + } +} diff --git a/src/app/components/ag-grid/state-renderer/state-renderer.component.html b/src/app/components/ag-grid/state-renderer/state-renderer.component.html new file mode 100644 index 0000000..937da14 --- /dev/null +++ b/src/app/components/ag-grid/state-renderer/state-renderer.component.html @@ -0,0 +1,23 @@ +
+ {{ item.icon }} + {{ item.text }} +
diff --git a/src/app/components/ag-grid/state-renderer/state-renderer.component.scss b/src/app/components/ag-grid/state-renderer/state-renderer.component.scss new file mode 100644 index 0000000..f66c528 --- /dev/null +++ b/src/app/components/ag-grid/state-renderer/state-renderer.component.scss @@ -0,0 +1,12 @@ +.container { + display: flex; + align-items: center; + width: 100%; + height: 100%; + justify-content: flex-start; + min-width: fit-content; + .text { + margin-left: 5px; + font-weight: bold; + } +} diff --git a/src/app/components/ag-grid/state-renderer/state-renderer.component.ts b/src/app/components/ag-grid/state-renderer/state-renderer.component.ts new file mode 100644 index 0000000..3f5182e --- /dev/null +++ b/src/app/components/ag-grid/state-renderer/state-renderer.component.ts @@ -0,0 +1,47 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { ICellRendererAngularComp } from 'ag-grid-angular'; +import { ICellRendererParams } from 'ag-grid-community'; + +export interface StateRendererParams extends ICellRendererParams { + items: StateRendererParamsItem[]; +} + +export interface StateRendererParamsItem { + color?: string; + overwriteTextColor?: string; + backgroundColor?: string; + icon?: string; + text?: string; + condition?: (data: TData) => boolean; +} + +@Component({ + selector: 'state-cell', + standalone: true, + imports: [CommonModule, MatIconModule], + templateUrl: './state-renderer.component.html', + styleUrls: ['./state-renderer.component.scss'], +}) +export class StateRendererComponent implements ICellRendererAngularComp { + protected params: StateRendererParams; + + protected item: StateRendererParamsItem | undefined; + + agInit(params: StateRendererParams) { + this.params = params; + if (params.items) { + let item = params.items.find((item) => (item.condition !== undefined ? item.condition(params.data) : false)); + if (item === undefined) { + item = params.items.find((item) => typeof item.condition == 'undefined'); + } + this.item = item; + } + } + + refresh(params: StateRendererParams) { + this.agInit(params); + return true; + } +} diff --git a/src/app/components/create-game-form/create-game-form.component.html b/src/app/components/create-game-form/create-game-form.component.html new file mode 100644 index 0000000..40ea31e --- /dev/null +++ b/src/app/components/create-game-form/create-game-form.component.html @@ -0,0 +1,13 @@ +
+ Public game + + Password + + {{ + passwordHidden ? 'visibility_off' : 'visibility' + }} + + +
diff --git a/src/app/components/create-game-form/create-game-form.component.scss b/src/app/components/create-game-form/create-game-form.component.scss new file mode 100644 index 0000000..dfe2742 --- /dev/null +++ b/src/app/components/create-game-form/create-game-form.component.scss @@ -0,0 +1,8 @@ +.container { + display: flex; + width: fit-content; + align-items: center; + gap: 0.75em; + margin: auto; + flex-direction: column; +} diff --git a/src/app/components/create-game-form/create-game-form.component.ts b/src/app/components/create-game-form/create-game-form.component.ts new file mode 100644 index 0000000..669f311 --- /dev/null +++ b/src/app/components/create-game-form/create-game-form.component.ts @@ -0,0 +1,83 @@ +import { Component } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; + +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { Router } from '@angular/router'; +import { KeycloakService } from 'keycloak-angular'; +import { ToastrService } from 'ngx-toastr'; +import { onError } from 'src/app/common/utils/errorUtils'; +import { GameCreateDto } from 'src/app/service/game/dto/request/gameCreateDto'; +import { RestGameService } from 'src/app/service/game/restGame.service'; + +// Source: https://material.angular.io/components/form-field/examples#form-field-custom-control + +@Component({ + selector: 'app-create-game-form', + templateUrl: './create-game-form.component.html', + styleUrls: ['./create-game-form.component.scss'], + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + MatIconModule, + MatSlideToggleModule, + ], +}) +export class CreateGameFormComponent { + protected form: FormGroup; + protected authenticated: boolean; + passwordHidden = true; + + get passwordInput() { + return this.form.get('password'); + } + + constructor( + private toastr: ToastrService, + private keycloak: KeycloakService, + private restGameService: RestGameService, + private router: Router + ) { + this.init(); + } + + async init() { + this.authenticated = await this.keycloak.isLoggedIn(); + this.form = new FormGroup({ + publicGame: new FormControl(true, Validators.required), + password: new FormControl(null), + }); + if (!this.authenticated) { + this.form.disable(); + } + } + + submit() { + if (this.form.valid) { + let publicGame = this.form.get('publicGame')!.value; + let password = this.form.get('password')!.value; + password = password !== '' && password !== null ? password : undefined; + this.restGameService + .createGame({ + publicGame, + password: password, + } as GameCreateDto) + .subscribe({ + next: (gameDto) => { + this.router.navigate(['game', gameDto.friendlyId]); + }, + error: (err) => onError(this.toastr, err, 'An error occurred while creating a game.'), + }); + } + } +} diff --git a/src/app/components/footer/footer.component.html b/src/app/components/footer/footer.component.html new file mode 100644 index 0000000..26e8248 --- /dev/null +++ b/src/app/components/footer/footer.component.html @@ -0,0 +1,23 @@ +
+ +

{{ '©' + currentYear + ' Sisimomo (Simon Vallières) | All Rights Reserved' }}

+
diff --git a/src/app/components/footer/footer.component.scss b/src/app/components/footer/footer.component.scss new file mode 100644 index 0000000..7db28a9 --- /dev/null +++ b/src/app/components/footer/footer.component.scss @@ -0,0 +1,18 @@ +footer { + margin-top: 16px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.links { + display: flex; + gap: 1em; + a { + transition: 0.5s; + &:hover { + transform: translateY(-5px); + } + } +} diff --git a/src/app/components/footer/footer.component.ts b/src/app/components/footer/footer.component.ts new file mode 100644 index 0000000..8917503 --- /dev/null +++ b/src/app/components/footer/footer.component.ts @@ -0,0 +1,15 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-footer', + standalone: true, + imports: [CommonModule], + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.scss'], +}) +export class FooterComponent { + protected get currentYear() { + return new Date().getFullYear(); + } +} diff --git a/src/app/components/game-friendly-id-input/game-friendly-id-input.component.html b/src/app/components/game-friendly-id-input/game-friendly-id-input.component.html new file mode 100644 index 0000000..ec5fd46 --- /dev/null +++ b/src/app/components/game-friendly-id-input/game-friendly-id-input.component.html @@ -0,0 +1,31 @@ +
+ + + +
diff --git a/src/app/components/game-friendly-id-input/game-friendly-id-input.component.scss b/src/app/components/game-friendly-id-input/game-friendly-id-input.component.scss new file mode 100644 index 0000000..3935ddc --- /dev/null +++ b/src/app/components/game-friendly-id-input/game-friendly-id-input.component.scss @@ -0,0 +1,23 @@ +.input-container { + display: flex; +} + +.input-element { + border: none; + background: none; + color: white; + padding: 0; + outline: none; + font: inherit; + text-align: center; + text-transform: uppercase; +} + +.input-spacer { + opacity: 0; + transition: opacity 200ms; +} + +:host.floating .input-spacer { + opacity: 1; +} diff --git a/src/app/components/game-friendly-id-input/game-friendly-id-input.component.ts b/src/app/components/game-friendly-id-input/game-friendly-id-input.component.ts new file mode 100644 index 0000000..6e86c28 --- /dev/null +++ b/src/app/components/game-friendly-id-input/game-friendly-id-input.component.ts @@ -0,0 +1,242 @@ +import { FocusMonitor } from '@angular/cdk/a11y'; +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { Component, ElementRef, Inject, Input, OnDestroy, Optional, Self, ViewChild } from '@angular/core'; +import { + AbstractControl, + ControlValueAccessor, + FormBuilder, + FormControl, + FormGroup, + FormsModule, + NgControl, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { MAT_FORM_FIELD, MatFormField, MatFormFieldControl } from '@angular/material/form-field'; +import { Subject } from 'rxjs'; + +/** Data structure for holding the game friendlyId. */ +export class GameFriendlyId { + constructor(public first3: string, public last3: string) {} + + public toString(): string | undefined { + if (this.first3 && this.last3) { + return (this.first3 + '-' + this.last3).toUpperCase(); + } + return undefined; + } +} + +@Component({ + selector: 'app-game-friendly-id-input', + templateUrl: './game-friendly-id-input.component.html', + styleUrls: ['./game-friendly-id-input.component.scss'], + providers: [{ provide: MatFormFieldControl, useExisting: GameFriendlyIdInputComponent }], + host: { + '[class.floating]': 'shouldLabelFloat', + '[id]': 'id', + }, + standalone: true, + imports: [FormsModule, ReactiveFormsModule], +}) +export class GameFriendlyIdInputComponent + implements ControlValueAccessor, MatFormFieldControl, OnDestroy +{ + static nextId = 0; + @ViewChild('first3') first3Input: HTMLInputElement; + @ViewChild('last3') last3Input: HTMLInputElement; + + parts: FormGroup<{ + first3: FormControl; + last3: FormControl; + }>; + stateChanges = new Subject(); + focused = false; + touched = false; + controlType = 'app-game-friendly-id-input'; + id = `app-game-friendly-id-input-${GameFriendlyIdInputComponent.nextId++}`; + onChange = (_: any) => {}; + onTouched = () => {}; + + get empty() { + const { + value: { first3, last3 }, + } = this.parts; + + return !first3 && !last3; + } + + get shouldLabelFloat() { + return this.focused || !this.empty; + } + + @Input('aria-describedby') userAriaDescribedBy: string; + + @Input() + get placeholder(): string { + return this._placeholder; + } + set placeholder(value: string) { + this._placeholder = value; + this.stateChanges.next(); + } + private _placeholder: string; + + @Input() + get required(): boolean { + return this._required; + } + set required(value: BooleanInput) { + this._required = coerceBooleanProperty(value); + this.stateChanges.next(); + } + private _required = false; + + @Input() + get disabled(): boolean { + return this._disabled; + } + set disabled(value: BooleanInput) { + this._disabled = coerceBooleanProperty(value); + this._disabled ? this.parts.disable() : this.parts.enable(); + this.stateChanges.next(); + } + private _disabled = false; + + @Input() + get value(): GameFriendlyId | null { + if (this.parts.valid) { + const { + value: { first3, last3 }, + } = this.parts; + return new GameFriendlyId(first3!, last3!); + } + return null; + } + set value(tel: GameFriendlyId | null) { + const { first3, last3 } = tel || new GameFriendlyId('', ''); + this.parts.setValue({ first3, last3 }); + this.stateChanges.next(); + } + + get errorState(): boolean { + return this.parts.invalid && this.touched; + } + + constructor( + formBuilder: FormBuilder, + private _focusMonitor: FocusMonitor, + private _elementRef: ElementRef, + @Optional() @Inject(MAT_FORM_FIELD) public _formField: MatFormField, + @Optional() @Self() public ngControl: NgControl + ) { + if (this.ngControl != null) { + this.ngControl.valueAccessor = this; + } + + this.parts = formBuilder.group({ + first3: [ + '', + [Validators.required, Validators.minLength(3), Validators.maxLength(3), Validators.pattern('^[a-zA-Z0-9]{3}$')], + ], + last3: [ + '', + [Validators.required, Validators.minLength(3), Validators.maxLength(3), Validators.pattern('^[a-zA-Z0-9]{3}$')], + ], + }); + } + + ngOnDestroy() { + this.stateChanges.complete(); + this._focusMonitor.stopMonitoring(this._elementRef); + } + + onFocusIn(event: FocusEvent) { + if (!this.focused) { + this.focused = true; + this.stateChanges.next(); + } + } + + onFocusOut(event: FocusEvent) { + if (!this._elementRef.nativeElement.contains(event.relatedTarget as Element)) { + this.touched = true; + this.focused = false; + this.onTouched(); + this.stateChanges.next(); + } + } + + autoFocusNext(control: AbstractControl, nextElement?: HTMLInputElement): void { + if (!control.errors) { + this.focusElement(nextElement); + } + } + + focusElement(element?: HTMLInputElement): void { + if (element) { + this._focusMonitor.focusVia(element, 'program'); + this.moveCursorToTheEnd(element); + } + } + + autoFocusPrev(control: AbstractControl, prevElement: HTMLInputElement): void { + if (control.value.length < 1) { + this._focusMonitor.focusVia(prevElement, 'program'); + this.moveCursorToTheEnd(prevElement); + } + } + + moveCursorToTheEnd(input: HTMLInputElement): void { + const temp = input.value; + input.value = ''; + input.value = temp; + } + + setDescribedByIds(ids: string[]) { + const controlElement = this._elementRef.nativeElement.querySelector('.input-container')!; + controlElement.setAttribute('aria-describedby', ids.join(' ')); + } + + onContainerClick() { + if (this.parts.controls.first3.valid) { + this._focusMonitor.focusVia(this.last3Input, 'program'); + } else if (this.parts.controls.last3.valid) { + this._focusMonitor.focusVia(this.last3Input, 'program'); + } else { + this._focusMonitor.focusVia(this.first3Input, 'program'); + } + } + + writeValue(tel: GameFriendlyId | null): void { + this.value = tel; + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + } + + _handlePaste(event: ClipboardEvent) { + let clipboardData = event.clipboardData!; + let pastedText = clipboardData.getData('text').trim(); + if (pastedText.length <= 7) { + event.preventDefault(); + this.value = new GameFriendlyId(pastedText.substring(0, 3), pastedText.substring(4, 7)); + this.focusElement(this.last3Input); + this.onChange(this.value); + } + } + + _handleInput(control: AbstractControl, nextElement?: HTMLInputElement): void { + this.autoFocusNext(control, nextElement); + this.onChange(this.value); + } +} diff --git a/src/app/components/header-navbar/header-navbar.component.html b/src/app/components/header-navbar/header-navbar.component.html new file mode 100644 index 0000000..a3ddffc --- /dev/null +++ b/src/app/components/header-navbar/header-navbar.component.html @@ -0,0 +1,53 @@ +
+ + + Hexagonal Chess + + + + + + + + + + + + + + + + +
homeHome
+
+ +
videogame_assetCreate/Join Game
+
+ +
listGames List
+
+ +
ruleGame Rules
+
+
+
+ + + +
+
diff --git a/src/app/components/header-navbar/header-navbar.component.scss b/src/app/components/header-navbar/header-navbar.component.scss new file mode 100644 index 0000000..0ae8d4b --- /dev/null +++ b/src/app/components/header-navbar/header-navbar.component.scss @@ -0,0 +1,32 @@ +.container { + min-height: 100vh; + margin: 0; + display: flex; + flex-direction: column; +} + +.body { + flex: 1; + margin: 0; +} + +.toolbar-item-spacer { + flex: 1 1 auto; +} + +.sidenav { + width: 230px; +} + +.sidenav-content { + display: flex; + height: 100%; + align-items: center; + justify-content: center; +} + +.text-icon { + display: flex; + align-items: center; + column-gap: 5px; +} diff --git a/src/app/components/header-navbar/header-navbar.component.ts b/src/app/components/header-navbar/header-navbar.component.ts new file mode 100644 index 0000000..d61ba6c --- /dev/null +++ b/src/app/components/header-navbar/header-navbar.component.ts @@ -0,0 +1,81 @@ +import { CommonModule } from '@angular/common'; +import { HttpClientModule } from '@angular/common/http'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { Router, RouterModule } from '@angular/router'; +import { KeycloakService } from 'keycloak-angular'; +import { environment } from 'src/environments/environment'; +import { FooterComponent } from '../footer/footer.component'; + +@Component({ + selector: 'app-header-navbar', + standalone: true, + imports: [ + CommonModule, + RouterModule, + HttpClientModule, + MatButtonModule, + MatSidenavModule, + MatMenuModule, + MatToolbarModule, + MatIconModule, + MatListModule, + MatExpansionModule, + MatTooltipModule, + FooterComponent, + ], + templateUrl: './header-navbar.component.html', + styleUrls: ['./header-navbar.component.scss'], +}) +export class HeaderNavbarComponent implements OnInit { + @ViewChild('sidenav') sidenav: MatSidenav; + protected isExpanded: boolean; + + constructor(private keycloak: KeycloakService, protected router: Router) {} + + protected authenticated: boolean; + protected username: string; + + async ngOnInit() { + this.isExpanded = localStorage.getItem('sidenavIsExpanded') === 'true'; + this.authenticated = await this.keycloak.isLoggedIn(); + if (this.authenticated) { + await this.keycloak.loadUserProfile(); + this.username = this.keycloak.getUsername(); + } + } + + protected getCurrentPath(): string { + return window.location.pathname; + } + + toggleNavbar() { + this.isExpanded = !this.isExpanded; + localStorage.setItem('sidenavIsExpanded', String(this.isExpanded)); + this.sidenav.toggle(); + } + + onClickAccount() { + window.open( + environment.identityProvider.baseURL + '/realms/' + environment.identityProvider.realm + '/account', + '_blank' + ); + } + + async onClickSignIn() { + await this.keycloak.login({ + redirectUri: window.location.href, + }); + } + + onClickLogout() { + this.keycloak.logout(); + } +} diff --git a/src/app/components/join-game-form/join-game-form.component.html b/src/app/components/join-game-form/join-game-form.component.html new file mode 100644 index 0000000..c15d69e --- /dev/null +++ b/src/app/components/join-game-form/join-game-form.component.html @@ -0,0 +1,18 @@ +
+ + Game Friendly Id + + fingerprint + You must enter valid Game Friendly Id + + + Password + + {{ + passwordHidden ? 'visibility_off' : 'visibility' + }} + + +
diff --git a/src/app/components/join-game-form/join-game-form.component.scss b/src/app/components/join-game-form/join-game-form.component.scss new file mode 100644 index 0000000..b6f9443 --- /dev/null +++ b/src/app/components/join-game-form/join-game-form.component.scss @@ -0,0 +1,8 @@ +.container { + display: flex; + width: fit-content; + align-items: center; + gap: 0.5em; + margin: auto; + flex-direction: column; +} diff --git a/src/app/components/join-game-form/join-game-form.component.ts b/src/app/components/join-game-form/join-game-form.component.ts new file mode 100644 index 0000000..3349800 --- /dev/null +++ b/src/app/components/join-game-form/join-game-form.component.ts @@ -0,0 +1,80 @@ +import { Component } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { GameFriendlyIdInputComponent } from '../game-friendly-id-input/game-friendly-id-input.component'; + +import { NgIf } from '@angular/common'; +import { forwardRef } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { Router } from '@angular/router'; +import { KeycloakService } from 'keycloak-angular'; +import { ToastrService } from 'ngx-toastr'; +import { onError } from 'src/app/common/utils/errorUtils'; +import { GameJoinUpdateDto } from 'src/app/service/game/dto/request/gameJoinUpdateDto'; +import { RestGameService } from 'src/app/service/game/restGame.service'; + +// Source: https://material.angular.io/components/form-field/examples#form-field-custom-control + +@Component({ + selector: 'app-join-game-form', + templateUrl: './join-game-form.component.html', + styleUrls: ['./join-game-form.component.scss'], + standalone: true, + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + forwardRef(() => GameFriendlyIdInputComponent), + MatIconModule, + NgIf, + ], +}) +export class JoinGameFormComponent { + protected form: FormGroup; + protected authenticated: boolean; + passwordHidden = true; + + get passwordInput() { + return this.form.get('password'); + } + + constructor( + private toastr: ToastrService, + private keycloak: KeycloakService, + private restGameService: RestGameService, + private router: Router + ) { + this.init(); + } + + async init() { + this.authenticated = await this.keycloak.isLoggedIn(); + this.form = new FormGroup({ + gameFriendlyId: new FormControl(null, Validators.required), + password: new FormControl(null), + }); + if (!this.authenticated) { + this.form.disable(); + } + } + + submit() { + if (this.form.valid) { + const gameFriendlyId = this.form.get('gameFriendlyId')!.value.toString(); + let password = this.form.get('password')!.value; + password = password !== '' && password !== null ? password : undefined; + this.restGameService.joinGame(gameFriendlyId, new GameJoinUpdateDto(password)).subscribe({ + next: (gameDto) => { + // TODO: pass gameDto to game page + this.router.navigate(['game', gameFriendlyId]); + }, + error: (err) => onError(this.toastr, err, 'An error occurred while joining a game.'), + }); + } + } +} diff --git a/src/app/components/spectate-game-form/spectate-game-form.component.html b/src/app/components/spectate-game-form/spectate-game-form.component.html new file mode 100644 index 0000000..d0e5d07 --- /dev/null +++ b/src/app/components/spectate-game-form/spectate-game-form.component.html @@ -0,0 +1,11 @@ +
+ + Game Friendly Id + + fingerprint + You must enter valid Game Friendly Id + + +
diff --git a/src/app/components/spectate-game-form/spectate-game-form.component.scss b/src/app/components/spectate-game-form/spectate-game-form.component.scss new file mode 100644 index 0000000..b6f9443 --- /dev/null +++ b/src/app/components/spectate-game-form/spectate-game-form.component.scss @@ -0,0 +1,8 @@ +.container { + display: flex; + width: fit-content; + align-items: center; + gap: 0.5em; + margin: auto; + flex-direction: column; +} diff --git a/src/app/components/spectate-game-form/spectate-game-form.component.ts b/src/app/components/spectate-game-form/spectate-game-form.component.ts new file mode 100644 index 0000000..2e8e9de --- /dev/null +++ b/src/app/components/spectate-game-form/spectate-game-form.component.ts @@ -0,0 +1,76 @@ +import { Component } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { GameFriendlyIdInputComponent } from '../game-friendly-id-input/game-friendly-id-input.component'; + +import { NgIf } from '@angular/common'; +import { forwardRef } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { Router } from '@angular/router'; +import { KeycloakService } from 'keycloak-angular'; +import { ToastrService } from 'ngx-toastr'; +import { onError } from 'src/app/common/utils/errorUtils'; +import { RestGameService } from 'src/app/service/game/restGame.service'; + +// Source: https://material.angular.io/components/form-field/examples#form-field-custom-control + +@Component({ + selector: 'app-spectate-game-form', + templateUrl: './spectate-game-form.component.html', + styleUrls: ['./spectate-game-form.component.scss'], + standalone: true, + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + forwardRef(() => GameFriendlyIdInputComponent), + MatIconModule, + NgIf, + ], +}) +export class JoinGameFormComponent { + protected form: FormGroup; + protected authenticated: boolean; + passwordHidden = true; + + get passwordInput() { + return this.form.get('password'); + } + + constructor( + private toastr: ToastrService, + private keycloak: KeycloakService, + private restGameService: RestGameService, + private router: Router + ) { + this.init(); + } + + async init() { + this.authenticated = await this.keycloak.isLoggedIn(); + this.form = new FormGroup({ + gameFriendlyId: new FormControl(null, Validators.required), + }); + if (this.authenticated) { + this.form.disable(); + } + } + + submit() { + if (this.form.valid) { + const gameFriendlyId = this.form.get('gameFriendlyId')!.value.toString(); + this.restGameService.get(gameFriendlyId).subscribe({ + next: (gameDto) => { + // TODO: pass gameDto to game page + this.router.navigate(['game', gameFriendlyId]); + }, + error: (err) => onError(this.toastr, err, 'An error occurred while trying to spectate a game.'), + }); + } + } +} diff --git a/src/app/create-join-game/create-join-game.page.html b/src/app/create-join-game/create-join-game.page.html new file mode 100644 index 0000000..53f9f92 --- /dev/null +++ b/src/app/create-join-game/create-join-game.page.html @@ -0,0 +1,12 @@ +
+

You must be logging to be able to join or create a game.

+
+

Join an existing game

+ +
+ +
+

Create a new game

+ +
+
diff --git a/src/app/create-join-game/create-join-game.page.scss b/src/app/create-join-game/create-join-game.page.scss new file mode 100644 index 0000000..bf7c694 --- /dev/null +++ b/src/app/create-join-game/create-join-game.page.scss @@ -0,0 +1,10 @@ +.container { + display: flex; + flex-direction: column; + align-items: center; + margin: auto; + gap: 32px; + h1 { + text-align: center; + } +} diff --git a/src/app/create-join-game/create-join-game.page.ts b/src/app/create-join-game/create-join-game.page.ts new file mode 100644 index 0000000..ea81559 --- /dev/null +++ b/src/app/create-join-game/create-join-game.page.ts @@ -0,0 +1,38 @@ +import { NgIf } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { Router } from '@angular/router'; +import { KeycloakService } from 'keycloak-angular'; +import { CreateGameFormComponent } from '../components/create-game-form/create-game-form.component'; +import { JoinGameFormComponent } from '../components/join-game-form/join-game-form.component'; +import { RestGameService } from '../service/game/restGame.service'; + +@Component({ + standalone: true, + imports: [ + MatFormFieldModule, + MatInputModule, + FormsModule, + NgIf, + MatButtonModule, + MatIconModule, + JoinGameFormComponent, + CreateGameFormComponent, + ], + selector: 'app-create-join-game', + templateUrl: './create-join-game.page.html', + styleUrls: ['./create-join-game.page.scss'], +}) +export class CreateJoinGamePage implements OnInit { + protected authenticated: boolean; + + constructor(private keycloak: KeycloakService, private gameService: RestGameService, private router: Router) {} + + async ngOnInit() { + this.authenticated = await this.keycloak.isLoggedIn(); + } +} diff --git a/src/app/game-list/game-list.page.html b/src/app/game-list/game-list.page.html new file mode 100644 index 0000000..961db57 --- /dev/null +++ b/src/app/game-list/game-list.page.html @@ -0,0 +1,8 @@ +
+

Your active Games:

+ +
diff --git a/src/app/game-list/game-list.page.scss b/src/app/game-list/game-list.page.scss new file mode 100644 index 0000000..9697c5a --- /dev/null +++ b/src/app/game-list/game-list.page.scss @@ -0,0 +1,4 @@ +.container { + height: 400px; + width: 100%; +} diff --git a/src/app/game-list/game-list.page.ts b/src/app/game-list/game-list.page.ts new file mode 100644 index 0000000..51d4aa2 --- /dev/null +++ b/src/app/game-list/game-list.page.ts @@ -0,0 +1,142 @@ +import { ServerSideRowModelModule } from '@ag-grid-enterprise/server-side-row-model'; +import { CommonModule } from '@angular/common'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { ColDef, ModuleRegistry } from 'ag-grid-community'; +import { KeycloakService } from 'keycloak-angular'; +import { ToastrService } from 'ngx-toastr'; +import { onError } from '../common/utils/errorUtils'; +import { InfiniteScrollTableComponent } from '../components/ag-grid/infinite-scroll-table/infinite-scroll-table.component'; +import { MenuRendererComponent, MenuRendererParams } from '../components/ag-grid/menu-renderer/menu-renderer.component'; +import { + StateRendererComponent, + StateRendererParams, +} from '../components/ag-grid/state-renderer/state-renderer.component'; +import { Direction } from '../service/common/dto/enumeration/direction'; +import { GameDto } from '../service/game/dto/response/gameDto'; +import { RestGameService } from '../service/game/restGame.service'; + +ModuleRegistry.registerModules([ServerSideRowModelModule]); + +@Component({ + selector: 'app-game-list', + standalone: true, + imports: [CommonModule, InfiniteScrollTableComponent], + templateUrl: './game-list.page.html', + styleUrls: ['./game-list.page.scss'], +}) +export class GameListPage implements OnInit { + private userUuid: string; + protected columnDefs: ColDef[] = [ + { + colId: 'friendlyId', + field: 'friendlyId', + headerName: 'Friendly Id', + flex: 2, + }, + { + colId: 'userSide', + headerName: 'Playing', + cellRenderer: StateRendererComponent, + cellRendererParams: >{ + items: [ + { + color: 'var(--white-piece-inner)', + backgroundColor: 'var(--white-piece-stroke)', + icon: 'church', + text: 'White', + condition: (data) => (data !== undefined ? data.whiteUserUuid === this.userUuid : undefined), + }, + { + color: 'var(--black-piece-inner)', + overwriteTextColor: 'var(--white-piece-inner)', + backgroundColor: 'var(--black-piece-stroke)', + icon: 'church', + text: 'Black', + condition: (data) => (data !== undefined ? data.blackUserUuid === this.userUuid : undefined), + }, + ], + }, + flex: 1, + }, + { + colId: 'publicGame', + headerName: 'Public', + cellRenderer: StateRendererComponent, + cellRendererParams: >{ + items: [ + { + color: '#98ff75', + icon: 'public', + text: 'Public', + condition: (data) => data?.publicGame, + }, + { + color: '#ff8080', + icon: 'public_off', + text: 'Not Public', + condition: (data) => !data?.publicGame, + }, + ], + }, + flex: 1, + }, + { + colId: 'buttonCol', + suppressMovable: true, + lockPosition: 'right', + headerName: '', + cellRenderer: MenuRendererComponent, + cellRendererParams: >{ + items: [ + { + id: 'open', + icon: 'login', + text: 'Open', + condition: (data) => + data !== undefined && (data.whiteUserUuid === undefined || data.blackUserUuid === undefined), + }, + { + id: 'delete', + icon: 'delete_forever', + text: 'Delete', + condition: (data) => + data !== undefined && (data.whiteUserUuid === undefined || data.blackUserUuid === undefined), + }, + ], + callback: this.onMenuItemsClicked.bind(this), + }, + maxWidth: 17 * 2 + 48, + }, + ]; + @ViewChild('allLoggedInUserGames') public allLoggedInUserGamesTable: InfiniteScrollTableComponent; + + constructor( + private keycloak: KeycloakService, + private toastr: ToastrService, + private router: Router, + private restGameService: RestGameService + ) {} + + async ngOnInit() { + this.userUuid = (await this.keycloak.loadUserProfile()).id!; + } + + onMenuItemsClicked(data: GameDto, buttonId: string) { + if (buttonId === 'open') { + this.router.navigate(['game', data.friendlyId]); + } + if (buttonId === 'delete') { + this.restGameService.deleteGame(data.friendlyId).subscribe({ + next: () => { + this.allLoggedInUserGamesTable.refreshAllRows(); + }, + error: (err) => onError(this.toastr, err, 'An error occurred while loading the game list.'), + }); + } + } + + getData(direction: Direction, maxResults: number, cursor?: string) { + return this.restGameService.getAllLoggedInUserGames(maxResults, direction, cursor); + } +} diff --git a/src/app/game-rules/game-rules.page.html b/src/app/game-rules/game-rules.page.html new file mode 100644 index 0000000..5ba32ba --- /dev/null +++ b/src/app/game-rules/game-rules.page.html @@ -0,0 +1,131 @@ +

Gliński's Chess Rules

+ +

+ Gliński chess is a hexagonal chess variant that is played on a hexagonal grid rather than a traditional square grid. + The rules are similar to those of traditional chess, but with some adaptations to the hexagonal board. +

+ +
+

Board Setup:

+
    +
  • The game is played on a hexagonal grid consisting of 91 hexagons arranged in a honeycomb pattern.
  • +
  • + Each player has a set of pieces, including one king, one queen, two rooks, two knights, three bishops and nine + pawns. +
  • +
  • + The pieces are placed on the board as follows: +
    + +
  • +
+
+ +
+

Piece Movements:

+
+

King:

+

+ Moves one step in any of the six hexagonal directions (North, Northeast, Southeast, South, Southwest, Northwest). +

+

Moves one step diagonally along the six diagonal lines emanating from its position.

+

Can't move to a square attacked by the opponent.

+ +
+
+

Queen:

+

+ Moves any number of steps in any of the six hexagonal directions (North, Northeast, Southeast, South, Southwest, + Northwest). +

+

Moves any number of steps diagonally along the six diagonal lines emanating from its position.

+ +
+ +
+

Rook:

+

+ Moves any number of steps in any of the six hexagonal directions (North, Northeast, Southeast, South, Southwest, + Northwest). +

+ +
+ +
+

Bishop:

+

Moves any number of steps diagonally along the six diagonal lines emanating from its position.

+ +
+ +
+

Knight:

+

+ Moves in a two-step "L" shape: two hexagonal step in a straight direction followed by a hexagonal step at a 60°. +

+

Can jump over other pieces.

+ +
+ +
+

Pawn:

+
    +
  • Moves one step forward in the direction pointed by the pawn's orientation.
  • +
  • Captures at a 60° in the direction pointed by the pawn's orientation.
  • +
  • On its first move, a pawn can choose to move two steps forward instead of one.
  • +
  • + If an opponent's pawn moves two steps forward from its starting position and lands adjacent to your pawn, your + pawn can capture it en passant, moving diagonally to the square that the opponent's pawn skipped over. This + capture can only be performed on the immediately following move and must be done immediately after the + opponent's pawn has moved two steps. +
  • +
+

Pawns reaching the opponent's back row are promoted to any piece except a king.

+ +
+
+ +
+

Objective:

+

+ The objective of the game is to checkmate your opponent's king, putting it in a position where it is under attack + and cannot escape capture on the next move. +

+
+ +
+

Draw Conditions:

+
    +
  • + Stalemate: If a player's king is not in check but they have no legal moves, the game is a + stalemate, resulting in a draw. +
  • +
  • + Insufficient Material: If both players have only a lone king or a king and a bishop/knight, with + no pawns. In these cases, the game is typically declared a draw because there isn't enough material to achieve + checkmate, as these combinations of pieces lack the necessary power to force a win. +
  • +
  • + Threefold Repetition: If the same position occurs three times with the same player to move and + the same possible moves, the game is a draw. +
  • +
+
+ +
+

Additional Notes:

+
    +
  • + Hexagonal chess introduces some unique tactics and strategies due to the different movement patterns of the pieces + and the nature of the hexagonal board. +
  • +
  • + The center of the board is pivotal, as it has more connections to other hexagons than the edges, allowing for more + maneuverability. +
  • +
  • Players need to consider both diagonal and straight-line movement when planning their moves and attacks.
  • +
+

+ Remember that Gliński chess is just one of many hexagonal chess variants, and the movement patterns and rules may + vary in other versions of the game. +

+
diff --git a/src/app/game-rules/game-rules.page.scss b/src/app/game-rules/game-rules.page.scss new file mode 100644 index 0000000..74f4f08 --- /dev/null +++ b/src/app/game-rules/game-rules.page.scss @@ -0,0 +1,28 @@ +:host { + align-items: start; + gap: 16px; + margin-top: 16px; + font-size: medium; +} + +section > *:not(h1, h2, h3, ul) { + margin-left: 16px; +} + +ul { + padding-left: 16px; +} + +h3 { + font-size: 19px; + font-weight: 500; + line-height: 32px; + font-family: Roboto, sans-serif; + letter-spacing: 0.0125em; + margin: 0 0 16px; +} + +img { + width: 350px; + max-width: 95%; +} diff --git a/src/app/game-rules/game-rules.page.ts b/src/app/game-rules/game-rules.page.ts new file mode 100644 index 0000000..448d4c9 --- /dev/null +++ b/src/app/game-rules/game-rules.page.ts @@ -0,0 +1,11 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-game-rules', + standalone: true, + imports: [CommonModule], + templateUrl: './game-rules.page.html', + styleUrls: ['./game-rules.page.scss'], +}) +export class GameRulesPage {} diff --git a/src/app/game/cell/cell.component.html b/src/app/game/cell/cell.component.html new file mode 100644 index 0000000..1a9abf8 --- /dev/null +++ b/src/app/game/cell/cell.component.html @@ -0,0 +1,36 @@ + + + + + + + {{ coordinate.q }} + + + {{ coordinate.r }} + + + {{ coordinate.s }} + + + + diff --git a/src/app/game/cell/cell.component.scss b/src/app/game/cell/cell.component.scss new file mode 100644 index 0000000..39e4d19 --- /dev/null +++ b/src/app/game/cell/cell.component.scss @@ -0,0 +1,34 @@ +.coordinate text { + display: none; + font-size: 2em; + fill: blue; +} + +.cell { + stroke: #000000; +} + +.overlay { + display: none; + + &.selected { + display: block; + fill: #ff0000; + opacity: 0.15; + } + &.highlighted { + display: block; + fill: #7b61ff; + opacity: 0.35; + } + &.moveHighlighted { + display: block; + fill: #61fcff; + opacity: 0.25; + } +} + +.clickableHexagon { + fill: transparent; + pointer-events: all; +} diff --git a/src/app/game/cell/cell.component.ts b/src/app/game/cell/cell.component.ts new file mode 100644 index 0000000..5b7062d --- /dev/null +++ b/src/app/game/cell/cell.component.ts @@ -0,0 +1,67 @@ +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { Coordinate, PieceSide, PieceType } from '../../common/engine/internal'; +import { Coordinate2D } from '../coordinate2D'; +import { PieceComponent } from '../piece/piece.component'; + +@Component({ + selector: '[app-cell]', + standalone: true, + imports: [CommonModule, PieceComponent], + templateUrl: './cell.component.html', + styleUrls: ['./cell.component.scss'], +}) +export class CellComponent { + @Input() public colorIndex: number; + @Input() public translate: Coordinate2D; + @Input() public coordinate: Coordinate; + + @Output() hexagonClick: EventEmitter = new EventEmitter(); + @ViewChild('piece') public piece?: PieceComponent; + public selected = false; + public highlighted = false; + public moveHighlighted = false; + protected hexagonPath = '100,0 50,-87 -50,-87 -100,0 -50,87 50,87'; + protected pieceType?: PieceType; + protected PieceSide?: PieceSide; + + // https://www.redblobgames.com/grids/hexagons/#basics + public static readonly WIDTH = 100 * 2; + public static readonly HEIGHT = Math.sqrt(3) * 100; + + public static readonly PIECE_SCALE = 1.15; + + get width() { + return CellComponent.WIDTH; + } + + get height() { + return CellComponent.HEIGHT; + } + + get pieceScale() { + return CellComponent.PIECE_SCALE; + } + + get pieceWidth() { + return PieceComponent.WIDTH; + } + + get pieceHeight() { + return PieceComponent.HEIGHT; + } + + protected click() { + this.hexagonClick.emit(this); + } + + public removePiece() { + this.pieceType = undefined; + this.PieceSide = undefined; + } + + public setPiece(pieceType: PieceType, PieceSide: PieceSide) { + this.pieceType = pieceType; + this.PieceSide = PieceSide; + } +} diff --git a/src/app/game/coordinate2D.ts b/src/app/game/coordinate2D.ts new file mode 100644 index 0000000..c098e74 --- /dev/null +++ b/src/app/game/coordinate2D.ts @@ -0,0 +1,82 @@ +export class Coordinate2D { + public static readonly ORIGIN = new Coordinate2D(0, 0); + + public static readonly DIRECTION_VECTORS = [ + new Coordinate2D(150, 87), + new Coordinate2D(150, -87), + new Coordinate2D(0, -173), + new Coordinate2D(-150, -87), + new Coordinate2D(-150, 87), + new Coordinate2D(0, 173), + ]; + + private readonly _x; + private readonly _y; + + public get x(): number { + return this._x; + } + + public get y(): number { + return this._y; + } + + constructor(x: number, y: number) { + this._x = x; + this._y = y; + } + + /** + * Generates a list of {@link Coordinate}s in a hexagonal ring shape around a given center + * coordinate. + * Source + * + * @param center The center of the ring. + * @param radius The distance from the center coordinate to the outermost coordinates in the ring. + * @return A List of {@link Coordinate} objects. + */ + public static ring(center: Coordinate2D, radius: number): Coordinate2D[] { + const results: Coordinate2D[] = []; + let hex = center.add(Coordinate2D.DIRECTION_VECTORS[4].multiply(radius)); + for (let i = 0; i < 6; i++) { + for (let j = 0; j < radius; j++) { + results.push(hex); + hex = hex.add(Coordinate2D.DIRECTION_VECTORS[i]); + } + } + return results; + } + + /** + * A list of {@link Coordinate}s in a spiral pattern, starting from a given center coordinate and + * expanding outwards up to a specified radius. + * Source + * + * @param center The center of the ring. + * @param radius The distance from the center coordinate to the outermost coordinates in the spiral. + * @return The method is returning a List of Coordinate objects. + */ + public static spiral(center: Coordinate2D, radius: number): Coordinate2D[] { + const results: Coordinate2D[] = []; + results.push(center); + for (let i = 1; i <= radius; i++) { + results.push(...Coordinate2D.ring(center, i)); + } + return results; + } + + public add(coordinate: Coordinate2D): Coordinate2D { + return new Coordinate2D(this._x + coordinate.x, this._y + coordinate.y); + } + + public multiply(multiplier: number): Coordinate2D { + return new Coordinate2D(this._x * multiplier, this._y * multiplier); + } + + public equals(coordinate: Coordinate2D | undefined): boolean { + if (coordinate === undefined) { + return false; + } + return this._x == coordinate.x && this._y == coordinate.y; + } +} diff --git a/src/app/game/game.page.html b/src/app/game/game.page.html new file mode 100644 index 0000000..6fb8428 --- /dev/null +++ b/src/app/game/game.page.html @@ -0,0 +1,48 @@ +
+

+ {{ 'You are playing the ' + (pieceSideEnum.WHITE === userSide ? 'White' : 'Black') + '.' }} +

+

You are watching this game.

+

+ + Waiting the move of the opponent. + It's your turn! + {{ 'It\'s the ' + (gameModel!.sideTurn === pieceSideEnum.WHITE ? 'White' : 'Black') + ' turn!' }} + +

+
+ + + + + + +
+
diff --git a/src/app/game/game.page.scss b/src/app/game/game.page.scss new file mode 100644 index 0000000..c64bbee --- /dev/null +++ b/src/app/game/game.page.scss @@ -0,0 +1,42 @@ +.container { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + .grid-container { + display: flex; + justify-content: center; + position: relative; + width: 100%; + app-warning { + position: absolute; + top: 25%; + transform: translateY(-50%); + left: 0; + right: 0; + margin: auto; + width: 300px; + } + app-piece-list { + &.left { + margin: auto 5px auto auto; + } + &.right { + margin: auto auto auto 5px; + } + } + ::ng-deep app-piece-list svg { + width: 40px; + } + .grid { + max-height: 73vh; + } + } +} + +@media only screen and (max-width: 768px) { + /* For mobile phones: */ + app-piece-list { + display: none; + } +} diff --git a/src/app/game/game.page.ts b/src/app/game/game.page.ts new file mode 100644 index 0000000..fb064ad --- /dev/null +++ b/src/app/game/game.page.ts @@ -0,0 +1,343 @@ +import { CommonModule, NgIf } from '@angular/common'; +import { Component, OnInit, QueryList, ViewChildren } from '@angular/core'; + +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialog, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { ActivatedRoute } from '@angular/router'; +import { KeycloakService } from 'keycloak-angular'; +import { ToastrModule, ToastrService } from 'ngx-toastr'; +import { Subscription } from 'rxjs'; +import { + BOARD_SIDE_LENGTH, + Coordinate, + Game, + GameState, + Pawn, + Piece, + PieceSide, + PieceType, +} from '../common/engine/internal'; +import { onError } from '../common/utils/errorUtils'; +import { GameUpdateMovePieceMessageDto } from '../service/game/dto/request/message/gameUpdateMessageDto'; +import { GameDto } from '../service/game/dto/response/gameDto'; +import { + GameBaseMessageDto, + GameJoinMessageDto, + GameMovePieceMessageDto, +} from '../service/game/dto/response/message/gameMessageDto'; +import { GameSaveMapper } from '../service/game/mapper/gameSaveMapper'; +import { RestGameService } from '../service/game/restGame.service'; +import { WebsocketGameService } from '../service/game/websocketGame.service'; +import { CoordinateMapper } from '../service/piece/mapper/coordinateMapper'; +import { PieceTypeMapper } from '../service/piece/mapper/pieceTypeMapper'; +import { CellComponent } from './cell/cell.component'; +import { Coordinate2D } from './coordinate2D'; +import { PieceListComponent } from './piece-list/piece-list.component'; +import { PieceTypeDialogDialog } from './piece-type-dialog/piece-type-dialog.dialog'; +import { WarningComponent } from './warning/warning.component'; + +interface GridCellDef { + colorIndex: number; + coordinate: Coordinate; + translation: Coordinate2D; +} + +@Component({ + selector: 'app-game', + standalone: true, + imports: [ + CommonModule, + CellComponent, + ToastrModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + MatButtonModule, + NgIf, + MatDialogModule, + WarningComponent, + PieceListComponent, + ], + templateUrl: './game.page.html', + styleUrls: ['./game.page.scss'], +}) +export class GamePage implements OnInit { + private static readonly WIDTH = ((CellComponent.WIDTH * 3) / 4) * (BOARD_SIDE_LENGTH * 2 - 0.5); + private static readonly HEIGHT = CellComponent.HEIGHT * (BOARD_SIDE_LENGTH * 2 - 1); + protected viewBox = `${(GamePage.WIDTH / 2) * -1} ${(GamePage.HEIGHT / 2) * -1} ${GamePage.WIDTH} ${GamePage.HEIGHT}`; + @ViewChildren(CellComponent) protected cells!: QueryList; + protected grid: GridCellDef[]; + protected whiteCapturedPieceTypes?: PieceType[]; + protected blackCapturedPieceTypes?: PieceType[]; + + protected userUuid: string | undefined; + protected userSide: PieceSide | null | undefined; + protected gameModel: Game | undefined; + protected gameDto: GameDto | undefined; + private topicSubscription: Subscription | undefined; + + constructor( + private toastr: ToastrService, + private restGameService: RestGameService, + private websocketGameService: WebsocketGameService, + private keycloak: KeycloakService, + private route: ActivatedRoute, + private dialog: MatDialog + ) { + this.grid = GamePage.generateGridCellDefList(); + } + + public get pieceSideEnum(): typeof PieceSide { + return PieceSide; + } + + public get gameStateEnum(): typeof GameState { + return GameState; + } + + public get gameAsStarted(): boolean | undefined { + return this.gameDto !== undefined + ? this.gameDto!.whiteUserUuid !== undefined && this.gameDto!.blackUserUuid !== undefined + : undefined; + } + + private static generateGridCellDefList(): GridCellDef[] { + const coordinates = Coordinate.spiral(Coordinate.ORIGIN, BOARD_SIDE_LENGTH - 1); + const translations = Coordinate2D.spiral(Coordinate2D.ORIGIN, BOARD_SIDE_LENGTH - 1); + const gridCellDef = coordinates.map((element, index) => { + return { + colorIndex: 0, + coordinate: element, + translation: translations[index], + } as GridCellDef; + }); + let colCount = 1; + Object.values(groupBy(gridCellDef, (a) => a.coordinate.q)) + .sort((a, b) => a[0].coordinate.q - b[0].coordinate.q) + .forEach((a) => { + let rowCount = 0; + a.sort((a, b) => a.coordinate.r - b.coordinate.r).forEach((b) => (b.colorIndex = (colCount + rowCount++) % 3)); + colCount += colCount < BOARD_SIDE_LENGTH ? 1 : 2; + }); + return gridCellDef; + } + + ngOnInit(): void { + this.restGameService.get(this.route.snapshot.paramMap.get('gameFriendlyId')!).subscribe({ + next: (gameDto) => { + this.updateBoardWithDto(gameDto); + this.keycloak.isLoggedIn().then((isLoggedIn) => { + if (isLoggedIn) { + this.keycloak.loadUserProfile().then((userProfile) => { + this.userUuid = userProfile.id; + this.userSide = + this.gameDto?.whiteUserUuid === this.userUuid + ? PieceSide.WHITE + : this.gameDto?.blackUserUuid === this.userUuid + ? PieceSide.BLACK + : null; + }); + } else { + this.userSide = null; + } + }); + this.subscribeToGameTopic(); + }, + error: (err) => { + onError(this.toastr, err, 'An error occurred while retrieving the game.'); + }, + }); + } + + ngOnDestroy() { + this.topicSubscription?.unsubscribe(); + } + + subscribeToGameTopic() { + this.topicSubscription = this.websocketGameService.subscribeToUpdate(this.gameDto!.friendlyId).subscribe({ + next: (gameMessageDto: GameBaseMessageDto) => { + if (gameMessageDto.emitter !== this.userUuid) { + if (gameMessageDto instanceof GameMovePieceMessageDto) { + this.onGameMovePieceMessage(gameMessageDto); + } else if (gameMessageDto instanceof GameJoinMessageDto) { + this.gameDto!.blackUserUuid = gameMessageDto.emitter; + } + } + }, + error: (err) => { + onError(this.toastr, err, 'An error occurred while subscribing to the game.'); + }, + }); + } + + onGameMovePieceMessage(gameMovePieceMessageDto: GameMovePieceMessageDto) { + this.gameModel!.movePiece( + CoordinateMapper.convertToModel(gameMovePieceMessageDto.from), + CoordinateMapper.convertToModel(gameMovePieceMessageDto.to), + gameMovePieceMessageDto.wantedPromotionPieceType !== undefined + ? PieceTypeMapper.convertToModel(gameMovePieceMessageDto.wantedPromotionPieceType) + : undefined + ); + this.updateBoard(); + } + + protected onCellClick(cell: CellComponent) { + if ( + this.gameModel!.state === GameState.IN_PROGRESS || + this.gameModel!.state === GameState.WHITE_IN_CHECK || + this.gameModel!.state === GameState.BLACK_IN_CHECK + ) { + if (cell.highlighted) { + this.onHighlightedCellClick(cell); + } else if ( + cell.piece?.side === this.userSide && + cell.piece !== undefined && + !cell.coordinate.equals(this.cells.find((cell) => cell.selected)?.coordinate) + ) { + this.selectAPiece(cell); + } else { + this.resetClickableAndSelectedCells(); + } + } + } + + private onHighlightedCellClick(cell: CellComponent) { + if (this.userSide !== null) { + if (this.userSide !== this.gameModel!.sideTurn) { + this.toastr.error(undefined, 'You must wait your turn before moving a piece!', { + closeButton: true, + timeOut: 15000, + }); + this.resetClickableAndSelectedCells(); + return; + } + if (this.gameDto!.whiteUserUuid === undefined || this.gameDto!.blackUserUuid === undefined) { + this.toastr.error(undefined, 'You must wait for an opponent to join the game!', { + closeButton: true, + timeOut: 15000, + }); + this.resetClickableAndSelectedCells(); + return; + } + } + if (this.userSide !== null && this.userSide !== this.gameModel!.sideTurn) { + this.toastr.error(undefined, 'You must wait your turn before moving a piece!', { + closeButton: true, + timeOut: 15000, + }); + this.resetClickableAndSelectedCells(); + return; + } + let selectedCell = this.cells.find((cell) => cell.selected)!; + if ( + selectedCell.piece!.type === PieceType.PAWN && + Pawn.getPossibleCoordinatesToPromote(selectedCell.piece!.side).some((c) => c.equals(cell.coordinate)) + ) { + this.openPieceTypeDialog() + .afterClosed() + .subscribe((result) => { + this.movePiece(cell.coordinate, selectedCell.coordinate, result); + this.resetClickableAndSelectedCells(); + }); + } else { + this.movePiece(cell.coordinate, selectedCell.coordinate, undefined); + this.resetClickableAndSelectedCells(); + } + } + + private selectAPiece(cell: CellComponent) { + this.resetClickableAndSelectedCells(); + cell.selected = true; + const piece = Piece.findPiece(this.gameModel!.pieces, undefined, undefined, cell.coordinate)!; + piece.allPossibleMovesFromGame(this.gameModel!, true).forEach((move) => { + const cellFound = this.cells.find((cell) => cell.coordinate.equals(move)); + cellFound!.highlighted = true; + }); + } + + private resetClickableAndSelectedCells() { + this.cells + .filter((cell) => cell.selected || cell.highlighted) + .forEach((c) => { + c.selected = false; + c.highlighted = false; + }); + } + + private movePiece( + clickedCell: Coordinate, + selectedCell: Coordinate, + wantedPromotionPieceType: PieceType | undefined + ) { + this.gameModel!.movePiece(selectedCell, clickedCell, wantedPromotionPieceType); + this.updateBoard(); + this.websocketGameService.updateGame( + this.gameDto!.friendlyId, + new GameUpdateMovePieceMessageDto( + CoordinateMapper.convertToDto(selectedCell), + CoordinateMapper.convertToDto(clickedCell), + wantedPromotionPieceType !== undefined ? PieceTypeMapper.convertToDto(wantedPromotionPieceType) : undefined + ) + ); + } + + private updateBoardWithDto(gameDto: GameDto) { + this.gameDto = gameDto; + this.gameModel = GameSaveMapper.convertToModel(gameDto.gameSave!); + this.updateBoard(); + } + + private updateBoard() { + this.resetBoard(); + this.gameModel!.pieces.forEach((piece) => this.setPiece(piece.type, piece.side, piece.coordinate)); + this.updateCapturedPieceTypes(); + this.highlightedLastMove(); + } + + private updateCapturedPieceTypes() { + this.whiteCapturedPieceTypes = this.gameModel!.getCapturedPieceTypeList(PieceSide.WHITE); + this.blackCapturedPieceTypes = this.gameModel!.getCapturedPieceTypeList(PieceSide.BLACK); + } + + private highlightedLastMove() { + if (this.gameModel!.lastMove !== undefined) { + const from = this.cells.find((cell) => cell.coordinate.equals(this.gameModel!.lastMove!.from))!; + const to = this.cells.find((cell) => cell.coordinate.equals(this.gameModel!.lastMove!.to))!; + from.moveHighlighted = true; + to.moveHighlighted = true; + setTimeout(() => { + from.moveHighlighted = false; + to.moveHighlighted = false; + }, 7500); + } + } + + private resetBoard() { + this.resetClickableAndSelectedCells(); + this.cells.filter((cell) => cell.piece).forEach((cell) => cell.removePiece()); + } + + private setPiece(type: PieceType, side: PieceSide, coordinate: Coordinate) { + this.cells.find((cell) => coordinate.equals(cell.coordinate))!.setPiece(type, side); + } + + openPieceTypeDialog(): MatDialogRef { + return this.dialog.open(PieceTypeDialogDialog, { + disableClose: true, + data: { pieceSide: this.userSide }, + }); + } +} + +// https://upmostly.com/typescript/implementing-groupby-in-typescript +function groupBy(arr: T[], fn: (item: T) => any) { + return arr.reduce>((prev, curr) => { + const groupKey = fn(curr); + const group = prev[groupKey] || []; + group.push(curr); + return { ...prev, [groupKey]: group }; + }, {}); +} diff --git a/src/app/game/piece-list/piece-list.component.html b/src/app/game/piece-list/piece-list.component.html new file mode 100644 index 0000000..7613d52 --- /dev/null +++ b/src/app/game/piece-list/piece-list.component.html @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/src/app/game/piece-list/piece-list.component.scss b/src/app/game/piece-list/piece-list.component.scss new file mode 100644 index 0000000..022d3a5 --- /dev/null +++ b/src/app/game/piece-list/piece-list.component.scss @@ -0,0 +1,6 @@ +.container { + display: flex; + flex-wrap: wrap; + flex-direction: column; + justify-content: center; +} diff --git a/src/app/game/piece-list/piece-list.component.ts b/src/app/game/piece-list/piece-list.component.ts new file mode 100644 index 0000000..9e7b04b --- /dev/null +++ b/src/app/game/piece-list/piece-list.component.ts @@ -0,0 +1,16 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { PieceSide, PieceType } from 'src/app/common/engine/internal'; +import { PieceComponent } from '../piece/piece.component'; + +@Component({ + selector: 'app-piece-list', + standalone: true, + imports: [CommonModule, PieceComponent], + templateUrl: './piece-list.component.html', + styleUrls: ['./piece-list.component.scss'], +}) +export class PieceListComponent { + @Input() public types: PieceType[]; + @Input() public side: PieceSide; +} diff --git a/src/app/game/piece-type-dialog/piece-type-dialog.dialog.html b/src/app/game/piece-type-dialog/piece-type-dialog.dialog.html new file mode 100644 index 0000000..568a4d7 --- /dev/null +++ b/src/app/game/piece-type-dialog/piece-type-dialog.dialog.html @@ -0,0 +1,29 @@ +

Select the type of piece that will replace your pawn.

+
+ + + check_circle + + + {{ convertToString(pieceType) }} + + + + + +
+
+ +
diff --git a/src/app/game/piece-type-dialog/piece-type-dialog.dialog.scss b/src/app/game/piece-type-dialog/piece-type-dialog.dialog.scss new file mode 100644 index 0000000..a31729c --- /dev/null +++ b/src/app/game/piece-type-dialog/piece-type-dialog.dialog.scss @@ -0,0 +1,30 @@ +.container { + width: 100%; + display: flex; + gap: 1em; + padding: 1em; + mat-card { + border: 2px solid transparent; + &.card-selected { + border: 2px solid #7b1fa2; + } + &.mat-elevation-z4 .selection { + opacity: 1; + } + &:hover .selection { + opacity: 1; + } + .selection { + opacity: 0.05; + cursor: pointer; + color: #7b1fa2; + background: #fff; + position: absolute; + right: -10px; + top: -10px; + border-radius: 100%; + height: 24px; + width: 24px; + } + } +} diff --git a/src/app/game/piece-type-dialog/piece-type-dialog.dialog.ts b/src/app/game/piece-type-dialog/piece-type-dialog.dialog.ts new file mode 100644 index 0000000..7973a6a --- /dev/null +++ b/src/app/game/piece-type-dialog/piece-type-dialog.dialog.ts @@ -0,0 +1,62 @@ +import { CommonModule } from '@angular/common'; +import { Component, Inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { PieceTypeMapper } from 'src/app/service/piece/mapper/pieceTypeMapper'; +import { PieceSide, PieceType } from '../../common/engine/internal'; +import { PieceComponent } from '../piece/piece.component'; + +export interface DialogData { + pieceSide: PieceSide; + selected?: PieceType; +} + +@Component({ + selector: 'app-piece-type-dialog', + templateUrl: './piece-type-dialog.dialog.html', + styleUrls: ['./piece-type-dialog.dialog.scss'], + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MatCardModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + MatButtonModule, + PieceComponent, + ], +}) +export class PieceTypeDialogDialog { + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData + ) {} + + protected get pieceTypeEnum(): typeof PieceType { + return PieceType; + } + + protected get allPieceTypeEnums(): PieceType[] { + return Object.values(PieceType).filter((p) => p !== PieceType.PAWN); + } + + protected convertToString(pieceType: PieceType): string { + const str = PieceTypeMapper.convertToDto(pieceType).toString(); + return str.charAt(0).toUpperCase() + str.slice(1); + } + + onSelectCard(pieceType: PieceType) { + this.data.selected = pieceType; + } + + onNoClick(): void { + this.dialogRef.close(); + } +} diff --git a/src/app/game/piece/piece.component.html b/src/app/game/piece/piece.component.html new file mode 100644 index 0000000..634c0e7 --- /dev/null +++ b/src/app/game/piece/piece.component.html @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/game/piece/piece.component.scss b/src/app/game/piece/piece.component.scss new file mode 100644 index 0000000..8472994 --- /dev/null +++ b/src/app/game/piece/piece.component.scss @@ -0,0 +1,17 @@ +.white { + .stroke { + fill: var(--white-piece-stroke); + } + .union { + fill: var(--white-piece-inner); + } +} + +.black { + .stroke { + fill: var(--black-piece-stroke); + } + .union { + fill: var(--black-piece-inner); + } +} diff --git a/src/app/game/piece/piece.component.ts b/src/app/game/piece/piece.component.ts new file mode 100644 index 0000000..45713b8 --- /dev/null +++ b/src/app/game/piece/piece.component.ts @@ -0,0 +1,19 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { PieceSide, PieceType } from '../../common/engine/internal'; + +@Component({ + selector: '[app-piece]', + standalone: true, + imports: [CommonModule], + templateUrl: './piece.component.html', + styleUrls: ['./piece.component.scss'], +}) +export class PieceComponent { + protected PieceType = PieceType; + protected PieceSide = PieceSide; + @Input() public type: PieceType; + @Input() public side: PieceSide; + public static readonly WIDTH = 126; + public static readonly HEIGHT = 126; +} diff --git a/src/app/game/warning/warning.component.ts b/src/app/game/warning/warning.component.ts new file mode 100644 index 0000000..6358788 --- /dev/null +++ b/src/app/game/warning/warning.component.ts @@ -0,0 +1,128 @@ +import { AfterViewInit, Component, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core'; +import { ActiveToast, IndividualConfig, ToastContainerDirective, ToastrService } from 'ngx-toastr'; +import { ReplaySubject } from 'rxjs'; +import { GameState, PieceSide } from '../../common/engine/internal'; + +enum ToastType { + SUCCESS = 'success', + ERROR = 'error', + INFO = 'info', + WARNING = 'warning', +} + +interface Message { + title: string; + body: string | undefined; + type: ToastType; +} + +@Component({ + selector: 'app-warning', + standalone: true, + imports: [ToastContainerDirective], + template: '', +}) +export class WarningComponent implements OnChanges, AfterViewInit { + @ViewChild(ToastContainerDirective) private inlineToastContainer: ToastContainerDirective; + @Input() public gameStarted: boolean; + @Input() public gameFriendlyId: string; + @Input() public gameState: GameState; + @Input() public userSide: PieceSide | null; + private onChanges = new ReplaySubject(); + lastShown: ActiveToast | undefined = undefined; + + constructor(private toastr: ToastrService) {} + + ngOnChanges(changes: SimpleChanges): void { + this.onChanges.next(changes); + } + + ngAfterViewInit() { + this.onChanges.subscribe(() => { + this.showGameState(); + }); + } + + private removeLastShown() { + if (this.lastShown !== undefined) { + this.toastr.remove(this.lastShown.toastId); + this.lastShown = undefined; + } + } + + private showWarning(title: string, message: string | undefined, type: ToastType) { + this.removeLastShown(); + const temp = this.toastr.overlayContainer; + this.toastr.overlayContainer = this.inlineToastContainer; + this.lastShown = this.toastr.show( + message, + title, + { + disableTimeOut: true, + closeButton: true, + tapToDismiss: false, + enableHtml: true, + positionClass: 'inline', + } as IndividualConfig, + this.toastr.toastrConfig.iconClasses[type] + ); + this.toastr.overlayContainer = temp; + } + + private showGameState() { + const message = this.getMessage(); + if (message !== undefined) { + this.showWarning(message.title, message.body, message.type); + } else { + this.removeLastShown(); + } + } + + getMessage(): Message | undefined { + let title: string; + let message: string | undefined; + let type = ToastType.WARNING; + + if (!this.gameStarted) { + title = 'Waiting for an opponent to join the game'; + message = `The Friendly Id of this game is:

${this.gameFriendlyId}

You can give it to anyone along with the game password (if set) so they can join you.`; + type = ToastType.INFO; + } else { + switch (this.gameState) { + case GameState.IN_PROGRESS: + this.removeLastShown(); + return; + case GameState.WHITE_IN_CHECK: + title = (this.userSide === PieceSide.WHITE ? 'You' : 'White') + ' are in check'; + type = ToastType.INFO; + break; + case GameState.BLACK_IN_CHECK: + title = (this.userSide === PieceSide.BLACK ? 'You' : 'Black') + ' are in check'; + type = ToastType.INFO; + break; + case GameState.WHITE_WON: + title = (this.userSide === PieceSide.WHITE ? 'You' : 'White') + ' WON'; + break; + case GameState.BLACK_WON: + title = (this.userSide === PieceSide.BLACK ? 'You' : 'Black') + ' WON'; + break; + case GameState.DRAW_STALEMATE: + title = 'Stalemate Draw, nobody won'; + message = + 'A "Stalemate" is a type of draw that occurs when the chess player who has to move cannot make any legal moves to a safe square but is also not in check.'; + break; + case GameState.DRAW_INSUFFICIENT_MATERIAL: + title = 'Insufficient Material Draw, nobody won'; + message = + 'A "Insufficient Material" is a type of draw that occurs when neither player has enough pieces left on the board so that they can Check-Mate the other player.'; + break; + case GameState.DRAW_THREEFOLD_REPETITION: + title = 'Threefold-Repetition Draw, nobody won'; + message = + 'A "Threefold-Repetition" is a type of draw that occurs when a position arises three times in a game. One thing to remember is that the repeated positions do not need to be in a row.'; + break; + } + } + return { title, body: message, type } as Message; + } +} diff --git a/src/app/home/home.page.html b/src/app/home/home.page.html new file mode 100644 index 0000000..0af5c7c --- /dev/null +++ b/src/app/home/home.page.html @@ -0,0 +1,82 @@ +
+

Welcome to my Hexagonal Chess Showcase!

+

+ As a passionate web developer, I constantly seek out intriguing challenges. Inspired by a + YouTube video by C.G.P. Grey titled 'Can Chess, with Hexagons?', I dove into the world of hexagonal chess and was immediately captivated by its unique complexity and + possibilities. This fascination drove me to create a digital version of the Gliński's variant, blending my love for + coding with my newfound interest for this chess variant. +

+
+ +
+

Project Overview

+

+ Dive into the intricate world of hexagonal chess through my project. Leveraging the power of modern web + technologies, I've designed both the backend and frontend to provide a seamless experience. Here's a breakdown of + the technical aspects: +

+ +
+

+ Backend - + Github repository +

+
    +
  • Framework: Spring Boot
  • +
  • Realtime Communication: WebSocket (Stomp) for realtime communication
  • +
  • API: RESTful endpoints for non realtime communication
  • +
  • Database: MariaDB for storing game info and games history
  • +
  • Authentication: Keycloak server for secure user authentication
  • +
+
+ +
+

Frontend - Github repository

+
    +
  • Technology: Angular
  • +
  • User Interface: Angular Material UI components for a responsive and engaging design
  • +
  • Platform Compatibility: Ensured responsiveness for both mobile and desktop devices
  • +
+
+ +
+

+ Deployment - + Github repository +

+
    +
  • Technology: Docker Compose
  • +
  • Cloud: Oracle Cloud Ampere
  • +
  • Security: Cloudflare Argo Tunnel
  • +
  • Frontend Distribution: Nginx
  • +
+
+
+ +
+

Hexagonal Chess Rules - A Sneak Peek

+

+ Hexagonal Chess more specificity the Gliński's variant, introduces a captivating twist to the traditional chess + game. While a comprehensive overview of the rules awaits you on a dedicated page, here are some key highlights: +

+
    +
  • + Hexagonal Board: Say goodbye to squares! The game unfolds on a hexagonal grid, offering a fresh + and challenging playing experience. +
  • +
  • + Piece Movement: Embrace the familiar rooks, knights, bishops, kings, and queens, each with a new + strategic dimension due to the hexagonal layout. +
  • +
  • + Check: Explore the intricacies of check in the context of hexagonal chess, adding depth to your + strategic calculations. +
  • +
+

+ For a comprehensive understanding of hexagonal chess rules and strategies, make sure to explore the dedicated page + that unravels the full richness of this variant. +

+
diff --git a/src/app/home/home.page.scss b/src/app/home/home.page.scss new file mode 100644 index 0000000..95c9c2c --- /dev/null +++ b/src/app/home/home.page.scss @@ -0,0 +1,5 @@ +:host { + margin-top: 16px; + gap: 16px; + font-size: medium; +} diff --git a/src/app/home/home.page.ts b/src/app/home/home.page.ts new file mode 100644 index 0000000..50f49a7 --- /dev/null +++ b/src/app/home/home.page.ts @@ -0,0 +1,11 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; + +@Component({ + standalone: true, + imports: [CommonModule], + selector: 'app-home', + templateUrl: './home.page.html', + styleUrls: ['./home.page.scss'], +}) +export class HomePage {} diff --git a/src/app/page-not-found/page-not-found.page.html b/src/app/page-not-found/page-not-found.page.html new file mode 100644 index 0000000..41dfbca --- /dev/null +++ b/src/app/page-not-found/page-not-found.page.html @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 404 Page not found + diff --git a/src/app/page-not-found/page-not-found.page.scss b/src/app/page-not-found/page-not-found.page.scss new file mode 100644 index 0000000..0197559 --- /dev/null +++ b/src/app/page-not-found/page-not-found.page.scss @@ -0,0 +1,192 @@ +svg { + max-height: 50vh; +} + +// https://github.com/blairlee227/IlluStatus + +@import url('https://fonts.googleapis.com/css?family=Merriweather'); +.changeColor { + fill: #4f86ed; +} + +#title { + font-size: 50%; + font-family: 'Merriweather', serif; + fill: white; +} + +.cls-1 { + opacity: 0.3; +} + +.cls-7 { + opacity: 0.8; +} + +.cls-2 { + fill: #fff; +} + +.cls-10, +.cls-11, +.cls-12, +.cls-14, +.cls-16, +.cls-3 { + fill: none; +} + +.cls-3 { + stroke: #5c7690; +} + +.cls-10, +.cls-11, +.cls-12, +.cls-3 { + stroke-miterlimit: 10; +} + +.cls-14, +.cls-15, +.cls-16, +.cls-3 { + stroke-width: 0.5px; +} + +.cls-4 { + fill: #ffe1d9; +} + +.cls-5 { + fill: #ffcfbf; +} + +.cls-6 { + fill: #fecbb6; +} + +.cls-9 { + fill: #fecb02; +} + +.cls-10, +.cls-12 { + stroke: #d26f51; +} + +.cls-10, +.cls-11 { + stroke-width: 0.38px; +} + +.cls-11 { + stroke: #000; +} + +.cls-12 { + stroke-width: 0.19px; +} + +.cls-13 { + opacity: 0.45; +} + +.cls-14, +.cls-15, +.cls-16 { + stroke: #b0bec5; + stroke-linejoin: round; +} + +.cls-15 { + fill: #edf0f2; +} + +.cls-16 { + stroke-linecap: round; +} + +.cls-17 { + font-family: 'PT Sans', sans-serif; + font-size: 49.87px; + font-weight: 700; +} + +.cls-18 { + fill: #fffdbb; + opacity: 0.5; +} + +/*--------------------------- + SVG Animate + ---------------------------*/ +.earMove { + transition: all ease-in-out 2s; + transform-origin: 50% 50%; + animation: earmove 1.5s linear infinite alternate; +} + +.faceMove { + transition: all ease-in-out 2s; + transform-origin: 50% 50%; + animation: move 1.5s linear infinite alternate; +} + +.neckMove { + transition: all ease-in-out 2s; + transform-origin: 50% 50%; + animation: neck 1.5s linear infinite alternate; +} + +@keyframes earmove { + 0% { + transform: translateX(-0.3px) translateY(0.6px); + } + 30% { + transform: translateX(-0.3px) translateY(0.6px); + } + + 60% { + transform: translateX(-0.7px) translateY(0px); + } + + 70% { + transform: translateX(-0.7px) translateY(-0.3px); + } + 100% { + transform: translateX(-0.7px) translateY(-0.3px); + } +} + +@keyframes move { + 0% { + transform: translateX(-0.3px) translateY(0.6px); + } + 30% { + transform: translateX(-0.3px) translateY(0.6px); + } + + 60% { + transform: translateX(2px) translateY(0px); + } + + 70% { + transform: translateX(2px) translateY(-0.3px); + } + 100% { + transform: translateX(2px) translateY(-0.3px); + } +} + +@keyframes neck { + 0% { + transform: translateY(0.7px); + } + 50% { + transform: translateY(0.7px); + } + 100% { + transform: translateY(0px); + } +} diff --git a/src/app/page-not-found/page-not-found.page.ts b/src/app/page-not-found/page-not-found.page.ts new file mode 100644 index 0000000..76356ea --- /dev/null +++ b/src/app/page-not-found/page-not-found.page.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + standalone: true, + selector: 'app-page-not-found', + templateUrl: './page-not-found.page.html', + styleUrls: ['./page-not-found.page.scss'], +}) +export class PageNotFoundPage {} diff --git a/src/app/service/common/dto/enumeration/direction.ts b/src/app/service/common/dto/enumeration/direction.ts new file mode 100644 index 0000000..52fb09a --- /dev/null +++ b/src/app/service/common/dto/enumeration/direction.ts @@ -0,0 +1,4 @@ +export enum Direction { + FORWARD = 'forward', + BACKWARD = 'backward', +} diff --git a/src/app/service/common/dto/errorDto.ts b/src/app/service/common/dto/errorDto.ts new file mode 100644 index 0000000..395b1c9 --- /dev/null +++ b/src/app/service/common/dto/errorDto.ts @@ -0,0 +1,16 @@ +export class ErrorDto { + constructor( + public msg: string, + public errorId?: string, + public fieldErrors?: FieldErrorDto[], + public globalErrors?: GlobalErrorDto[] + ) {} +} + +export class FieldErrorDto { + constructor(public objectName: string, public fieldName: string, public errorCode: string) {} +} + +export class GlobalErrorDto { + constructor(public objectName: string, public errorCode: string) {} +} diff --git a/src/app/service/common/dto/windowDto.ts b/src/app/service/common/dto/windowDto.ts new file mode 100644 index 0000000..175287e --- /dev/null +++ b/src/app/service/common/dto/windowDto.ts @@ -0,0 +1,3 @@ +export class WindowDto { + constructor(public content: T[], public hasNextPage: boolean, public startCursor: string, public endCursor: string) {} +} diff --git a/src/app/service/common/rx-stomp.service.ts b/src/app/service/common/rx-stomp.service.ts new file mode 100644 index 0000000..791cb8b --- /dev/null +++ b/src/app/service/common/rx-stomp.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { RxStomp } from '@stomp/rx-stomp'; +import { KeycloakService } from 'keycloak-angular'; +import { environment } from 'src/environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class RxStompService extends RxStomp { + constructor(keycloak: KeycloakService) { + super(); + this.configure({ + beforeConnect: async (client) => { + const token = await keycloak.getToken(); + client.configure({ + brokerURL: + environment.api.baseURL.replace('http', 'ws') + + '/ws' + + (token !== undefined ? '?access_token=' + token : ''), + }); + }, + debug: (str) => { + if (!environment.prod) { + console.debug(new Date(), str); + } + }, + }); + this.activate(); + } +} diff --git a/src/app/service/game/dto/enumeration/gameMessageType.ts b/src/app/service/game/dto/enumeration/gameMessageType.ts new file mode 100644 index 0000000..047bf91 --- /dev/null +++ b/src/app/service/game/dto/enumeration/gameMessageType.ts @@ -0,0 +1,5 @@ +export enum GameMessageType { + JOIN = 'join', + MOVE_PIECE = 'movePiece', + SURRENDER = 'surrender', +} diff --git a/src/app/service/game/dto/enumeration/gameStateDto.ts b/src/app/service/game/dto/enumeration/gameStateDto.ts new file mode 100644 index 0000000..5384ee5 --- /dev/null +++ b/src/app/service/game/dto/enumeration/gameStateDto.ts @@ -0,0 +1,10 @@ +export enum GameStateDto { + IN_PROGRESS = 'inProgress', + WHITE_WON = 'whiteWon', + BLACK_WON = 'blackWon', + WHITE_IN_CHECK = 'whiteInCheck', + BLACK_IN_CHECK = 'blackInCheck', + DRAW_STALEMATE = 'drawStalemate', + DRAW_INSUFFICIENT_MATERIAL = 'drawInsufficientMaterial', + DRAW_THREEFOLD_REPETITION = 'drawThreefoldRepetition', +} diff --git a/src/app/service/game/dto/request/gameCreateDto.ts b/src/app/service/game/dto/request/gameCreateDto.ts new file mode 100644 index 0000000..56577c4 --- /dev/null +++ b/src/app/service/game/dto/request/gameCreateDto.ts @@ -0,0 +1,3 @@ +export class GameCreateDto { + constructor(public publicGame: boolean, public password?: string) {} +} diff --git a/src/app/service/game/dto/request/gameJoinUpdateDto.ts b/src/app/service/game/dto/request/gameJoinUpdateDto.ts new file mode 100644 index 0000000..6279634 --- /dev/null +++ b/src/app/service/game/dto/request/gameJoinUpdateDto.ts @@ -0,0 +1,3 @@ +export class GameJoinUpdateDto { + constructor(public password?: string) {} +} diff --git a/src/app/service/game/dto/request/message/gameUpdateMessageDto.ts b/src/app/service/game/dto/request/message/gameUpdateMessageDto.ts new file mode 100644 index 0000000..b0b5e05 --- /dev/null +++ b/src/app/service/game/dto/request/message/gameUpdateMessageDto.ts @@ -0,0 +1,22 @@ +import { CoordinateDto } from 'src/app/service/piece/dto/coordinateDto'; +import { PieceTypeDto } from 'src/app/service/piece/dto/enumeration/pieceTypeDto'; +import { GameMessageType } from '../../enumeration/gameMessageType'; + +export abstract class GameUpdateBaseMessageDto { + constructor(public type: GameMessageType) {} +} + +export class GameUpdateSurrenderMessageDto extends GameUpdateBaseMessageDto { + constructor() { + super(GameMessageType.SURRENDER); + } +} + +export class GameUpdateMovePieceMessageDto extends GameUpdateBaseMessageDto { + constructor(public from: CoordinateDto, public to: CoordinateDto, public wantedPromotionPieceType?: PieceTypeDto) { + super(GameMessageType.MOVE_PIECE); + this.from = from; + this.to = to; + this.wantedPromotionPieceType = wantedPromotionPieceType; + } +} diff --git a/src/app/service/game/dto/response/gameDto.ts b/src/app/service/game/dto/response/gameDto.ts new file mode 100644 index 0000000..8b806d1 --- /dev/null +++ b/src/app/service/game/dto/response/gameDto.ts @@ -0,0 +1,13 @@ +import { GameSaveDto } from './gameSaveDto'; + +export class GameDto { + constructor( + public friendlyId: string, + public whiteUserUuid: string, + public blackUserUuid: string, + public publicGame: boolean, + public createDate: string, + public updateDate: string, + public gameSave?: GameSaveDto + ) {} +} diff --git a/src/app/service/game/dto/response/gameSaveDto.ts b/src/app/service/game/dto/response/gameSaveDto.ts new file mode 100644 index 0000000..6a2013b --- /dev/null +++ b/src/app/service/game/dto/response/gameSaveDto.ts @@ -0,0 +1,15 @@ +import { CoordinateDto } from 'src/app/service/piece/dto/coordinateDto'; +import { PieceSideDto } from 'src/app/service/piece/dto/enumeration/pieceSideDto'; +import { PieceDto } from 'src/app/service/piece/dto/response/pieceDto'; +import { GameStateDto } from '../enumeration/gameStateDto'; + +export class GameSaveDto { + constructor( + public state: GameStateDto, + public sideTurn: PieceSideDto, + public lastMoveFrom: CoordinateDto, + public lastMoveTo: CoordinateDto, + public pieces?: PieceDto[], + public history?: PieceDto[][] + ) {} +} diff --git a/src/app/service/game/dto/response/message/gameMessageDto.ts b/src/app/service/game/dto/response/message/gameMessageDto.ts new file mode 100644 index 0000000..577a6c4 --- /dev/null +++ b/src/app/service/game/dto/response/message/gameMessageDto.ts @@ -0,0 +1,44 @@ +import { CoordinateDto } from 'src/app/service/piece/dto/coordinateDto'; +import { PieceTypeDto } from 'src/app/service/piece/dto/enumeration/pieceTypeDto'; +import { GameMessageType } from '../../enumeration/gameMessageType'; + +export abstract class GameBaseMessageDto { + constructor(public emitter: string) {} + + static factory(json: any): GameBaseMessageDto { + switch (json.type as GameMessageType) { + case GameMessageType.JOIN: + return new GameJoinMessageDto(json.emitter); + case GameMessageType.SURRENDER: + return new GameSurrenderMessageDto(json.emitter); + case GameMessageType.MOVE_PIECE: + return new GameMovePieceMessageDto(json.emitter, json.from, json.to, json.wantedPromotionPieceType); + } + } +} + +export class GameJoinMessageDto extends GameBaseMessageDto { + constructor(emitter: string) { + super(emitter); + } +} + +export class GameSurrenderMessageDto extends GameBaseMessageDto { + constructor(emitter: string) { + super(emitter); + } +} + +export class GameMovePieceMessageDto extends GameBaseMessageDto { + constructor( + emitter: string, + public from: CoordinateDto, + public to: CoordinateDto, + public wantedPromotionPieceType?: PieceTypeDto + ) { + super(emitter); + this.from = from; + this.to = to; + this.wantedPromotionPieceType = wantedPromotionPieceType; + } +} diff --git a/src/app/service/game/mapper/gameSaveMapper.ts b/src/app/service/game/mapper/gameSaveMapper.ts new file mode 100644 index 0000000..6997b5e --- /dev/null +++ b/src/app/service/game/mapper/gameSaveMapper.ts @@ -0,0 +1,23 @@ +import { Game, LastMove } from '../../../common/engine/internal'; +import { CoordinateMapper } from '../../piece/mapper/coordinateMapper'; +import { PieceMapper } from '../../piece/mapper/pieceMapper'; +import { PieceSideMapper } from '../../piece/mapper/pieceSideMapper'; +import { GameSaveDto } from '../dto/response/gameSaveDto'; +import { GameStateMapper } from './gameStateMapper'; + +export class GameSaveMapper { + public static convertToModel(gameSaveDto: GameSaveDto): Game { + return new Game( + GameStateMapper.convertToModel(gameSaveDto.state), + PieceSideMapper.convertToModel(gameSaveDto.sideTurn), + gameSaveDto.lastMoveFrom !== undefined + ? ({ + from: CoordinateMapper.convertToModel(gameSaveDto.lastMoveFrom), + to: CoordinateMapper.convertToModel(gameSaveDto.lastMoveTo), + } as LastMove) + : undefined, + gameSaveDto.pieces!.map((pieceDto) => PieceMapper.convertToModel(pieceDto)), + gameSaveDto.history!.map((piecesDto) => piecesDto!.map((pieceDto) => PieceMapper.convertToModel(pieceDto))) + ); + } +} diff --git a/src/app/service/game/mapper/gameStateMapper.ts b/src/app/service/game/mapper/gameStateMapper.ts new file mode 100644 index 0000000..137da31 --- /dev/null +++ b/src/app/service/game/mapper/gameStateMapper.ts @@ -0,0 +1,25 @@ +import { GameState } from '../../../common/engine/internal'; +import { GameStateDto } from '../dto/enumeration/gameStateDto'; + +export class GameStateMapper { + public static convertToModel(gameStateDto: GameStateDto): GameState { + switch (gameStateDto) { + case GameStateDto.IN_PROGRESS: + return GameState.IN_PROGRESS; + case GameStateDto.WHITE_WON: + return GameState.WHITE_WON; + case GameStateDto.BLACK_WON: + return GameState.BLACK_WON; + case GameStateDto.WHITE_IN_CHECK: + return GameState.WHITE_IN_CHECK; + case GameStateDto.BLACK_IN_CHECK: + return GameState.BLACK_IN_CHECK; + case GameStateDto.DRAW_STALEMATE: + return GameState.DRAW_STALEMATE; + case GameStateDto.DRAW_INSUFFICIENT_MATERIAL: + return GameState.DRAW_INSUFFICIENT_MATERIAL; + case GameStateDto.DRAW_THREEFOLD_REPETITION: + return GameState.DRAW_THREEFOLD_REPETITION; + } + } +} diff --git a/src/app/service/game/restGame.service.ts b/src/app/service/game/restGame.service.ts new file mode 100644 index 0000000..9062406 --- /dev/null +++ b/src/app/service/game/restGame.service.ts @@ -0,0 +1,67 @@ +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { Direction } from '../common/dto/enumeration/direction'; +import { WindowDto } from '../common/dto/windowDto'; +import { GameCreateDto } from './dto/request/gameCreateDto'; +import { GameJoinUpdateDto } from './dto/request/gameJoinUpdateDto'; +import { GameDto } from './dto/response/gameDto'; + +@Injectable({ + providedIn: 'root', +}) +export class RestGameService { + constructor(private httpClient: HttpClient) {} + + get(friendlyId: string) { + return this.httpClient.get(`${environment.api.baseURL}/game/${friendlyId}`); + } + + getAllLoggedInUserGames(maxResults: number, direction: Direction, cursor?: string) { + return this.httpClient.get>(`${environment.api.baseURL}/game/logged_in_user`, { + params: this.getParams(maxResults, direction, cursor), + }); + } + + getAllPasswordlessGamesMissingPlayer(maxResults: number, direction: Direction, cursor?: string) { + return this.httpClient.get>(`${environment.api.baseURL}/game/ready_to_join`, { + params: this.getParams(maxResults, direction, cursor), + }); + } + + joinGame(friendlyId: string, joinGameUpdateDto: GameJoinUpdateDto) { + return this.httpClient.put(`${environment.api.baseURL}/game/${friendlyId}`, joinGameUpdateDto); + } + + createGame(gameCreateDto: GameCreateDto) { + return this.httpClient.post(`${environment.api.baseURL}/game`, gameCreateDto); + } + + deleteGame(friendlyId: string) { + return this.httpClient.delete(`${environment.api.baseURL}/game/${friendlyId}`); + } + + private getParams( + maxResults: number, + direction: Direction, + cursor?: string + ): + | HttpParams + | { + [param: string]: string | number | boolean | readonly (string | number | boolean)[]; + } + | undefined { + if (cursor !== undefined) { + return { + cursor, + maxResults, + direction, + }; + } else { + return { + maxResults, + direction, + }; + } + } +} diff --git a/src/app/service/game/websocketGame.service.ts b/src/app/service/game/websocketGame.service.ts new file mode 100644 index 0000000..07158a0 --- /dev/null +++ b/src/app/service/game/websocketGame.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { map } from 'rxjs'; +import { RxStompService } from '../common/rx-stomp.service'; +import { GameUpdateBaseMessageDto } from './dto/request/message/gameUpdateMessageDto'; +import { GameBaseMessageDto } from './dto/response/message/gameMessageDto'; + +@Injectable({ + providedIn: 'root', +}) +export class WebsocketGameService { + constructor(private rxStompService: RxStompService) {} + + subscribeToUpdate(friendlyId: string) { + return this.rxStompService.watch(`/topic/game/${friendlyId}`).pipe( + map((message) => { + return GameBaseMessageDto.factory(JSON.parse(message.body)); + }) + ); + } + + updateGame(friendlyId: string, gameUpdateMessageDto: GameUpdateBaseMessageDto) { + this.rxStompService.publish({ + destination: `/app/game/${friendlyId}`, + body: JSON.stringify(gameUpdateMessageDto), + }); + } +} diff --git a/src/app/service/piece/dto/coordinateDto.ts b/src/app/service/piece/dto/coordinateDto.ts new file mode 100644 index 0000000..56cf093 --- /dev/null +++ b/src/app/service/piece/dto/coordinateDto.ts @@ -0,0 +1,3 @@ +export class CoordinateDto { + constructor(public q: number, public r: number, public s: number) {} +} diff --git a/src/app/service/piece/dto/enumeration/pieceSideDto.ts b/src/app/service/piece/dto/enumeration/pieceSideDto.ts new file mode 100644 index 0000000..18244e8 --- /dev/null +++ b/src/app/service/piece/dto/enumeration/pieceSideDto.ts @@ -0,0 +1,4 @@ +export enum PieceSideDto { + WHITE = 'white', + BLACK = 'black', +} diff --git a/src/app/service/piece/dto/enumeration/pieceTypeDto.ts b/src/app/service/piece/dto/enumeration/pieceTypeDto.ts new file mode 100644 index 0000000..d27998e --- /dev/null +++ b/src/app/service/piece/dto/enumeration/pieceTypeDto.ts @@ -0,0 +1,8 @@ +export enum PieceTypeDto { + BISHOP = 'bishop', + KING = 'king', + KNIGHT = 'knight', + PAWN = 'pawn', + QUEEN = 'queen', + ROOK = 'rook', +} diff --git a/src/app/service/piece/dto/response/pieceDto.ts b/src/app/service/piece/dto/response/pieceDto.ts new file mode 100644 index 0000000..5660b70 --- /dev/null +++ b/src/app/service/piece/dto/response/pieceDto.ts @@ -0,0 +1,7 @@ +import { CoordinateDto } from '../coordinateDto'; +import { PieceSideDto } from '../enumeration/pieceSideDto'; +import { PieceTypeDto } from '../enumeration/pieceTypeDto'; + +export class PieceDto { + constructor(public type: PieceTypeDto, public side: PieceSideDto, public coordinate: CoordinateDto) {} +} diff --git a/src/app/service/piece/mapper/coordinateMapper.ts b/src/app/service/piece/mapper/coordinateMapper.ts new file mode 100644 index 0000000..23e798c --- /dev/null +++ b/src/app/service/piece/mapper/coordinateMapper.ts @@ -0,0 +1,11 @@ +import { Coordinate } from '../../../common/engine/internal'; +import { CoordinateDto } from '../dto/coordinateDto'; + +export class CoordinateMapper { + public static convertToModel(coordinateDto: CoordinateDto): Coordinate { + return new Coordinate(coordinateDto.q, coordinateDto.r, coordinateDto.s); + } + public static convertToDto(coordinateDto: Coordinate): CoordinateDto { + return { q: coordinateDto.q, r: coordinateDto.r, s: coordinateDto.s } as CoordinateDto; + } +} diff --git a/src/app/service/piece/mapper/pieceMapper.ts b/src/app/service/piece/mapper/pieceMapper.ts new file mode 100644 index 0000000..6db0432 --- /dev/null +++ b/src/app/service/piece/mapper/pieceMapper.ts @@ -0,0 +1,15 @@ +import { Piece } from '../../../common/engine/internal'; +import { PieceDto } from '../dto/response/pieceDto'; +import { CoordinateMapper } from './coordinateMapper'; +import { PieceSideMapper } from './pieceSideMapper'; +import { PieceTypeMapper } from './pieceTypeMapper'; + +export class PieceMapper { + public static convertToModel(pieceDto: PieceDto): Piece { + return Piece.createPiece( + PieceTypeMapper.convertToModel(pieceDto.type), + PieceSideMapper.convertToModel(pieceDto.side), + CoordinateMapper.convertToModel(pieceDto.coordinate) + ); + } +} diff --git a/src/app/service/piece/mapper/pieceSideMapper.ts b/src/app/service/piece/mapper/pieceSideMapper.ts new file mode 100644 index 0000000..a12fda5 --- /dev/null +++ b/src/app/service/piece/mapper/pieceSideMapper.ts @@ -0,0 +1,13 @@ +import { PieceSide } from '../../../common/engine/internal'; +import { PieceSideDto } from '../dto/enumeration/pieceSideDto'; + +export class PieceSideMapper { + public static convertToModel(pieceSideDto: PieceSideDto): PieceSide { + switch (pieceSideDto) { + case PieceSideDto.WHITE: + return PieceSide.WHITE; + case PieceSideDto.BLACK: + return PieceSide.BLACK; + } + } +} diff --git a/src/app/service/piece/mapper/pieceTypeMapper.ts b/src/app/service/piece/mapper/pieceTypeMapper.ts new file mode 100644 index 0000000..62ba0c9 --- /dev/null +++ b/src/app/service/piece/mapper/pieceTypeMapper.ts @@ -0,0 +1,37 @@ +import { PieceType } from '../../../common/engine/internal'; +import { PieceTypeDto } from '../dto/enumeration/pieceTypeDto'; + +export class PieceTypeMapper { + public static convertToModel(pieceTypeDto: PieceTypeDto): PieceType { + switch (pieceTypeDto) { + case PieceTypeDto.BISHOP: + return PieceType.BISHOP; + case PieceTypeDto.KING: + return PieceType.KING; + case PieceTypeDto.KNIGHT: + return PieceType.KNIGHT; + case PieceTypeDto.PAWN: + return PieceType.PAWN; + case PieceTypeDto.QUEEN: + return PieceType.QUEEN; + case PieceTypeDto.ROOK: + return PieceType.ROOK; + } + } + public static convertToDto(pieceType: PieceType): PieceTypeDto { + switch (pieceType) { + case PieceType.BISHOP: + return PieceTypeDto.BISHOP; + case PieceType.KING: + return PieceTypeDto.KING; + case PieceType.KNIGHT: + return PieceTypeDto.KNIGHT; + case PieceType.PAWN: + return PieceTypeDto.PAWN; + case PieceType.QUEEN: + return PieceTypeDto.QUEEN; + case PieceType.ROOK: + return PieceTypeDto.ROOK; + } + } +} diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/images/bishop_movements.svg b/src/assets/images/bishop_movements.svg new file mode 100644 index 0000000..8cbb9f5 --- /dev/null +++ b/src/assets/images/bishop_movements.svg @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/initial_positions.svg b/src/assets/images/initial_positions.svg new file mode 100644 index 0000000..d80ce26 --- /dev/null +++ b/src/assets/images/initial_positions.svg @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/king_movements.svg b/src/assets/images/king_movements.svg new file mode 100644 index 0000000..a13b472 --- /dev/null +++ b/src/assets/images/king_movements.svg @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/knight_movements.svg b/src/assets/images/knight_movements.svg new file mode 100644 index 0000000..0c9fdfd --- /dev/null +++ b/src/assets/images/knight_movements.svg @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/pawn_movements.svg b/src/assets/images/pawn_movements.svg new file mode 100644 index 0000000..5b6a017 --- /dev/null +++ b/src/assets/images/pawn_movements.svg @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/queen_movements.svg b/src/assets/images/queen_movements.svg new file mode 100644 index 0000000..0b5c20e --- /dev/null +++ b/src/assets/images/queen_movements.svg @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/rook_movements.svg b/src/assets/images/rook_movements.svg new file mode 100644 index 0000000..64ffb41 --- /dev/null +++ b/src/assets/images/rook_movements.svg @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/silent-check-sso.html b/src/assets/silent-check-sso.html new file mode 100644 index 0000000..b3bd540 --- /dev/null +++ b/src/assets/silent-check-sso.html @@ -0,0 +1,7 @@ + + + + + diff --git a/src/environments/environment.production.ts b/src/environments/environment.production.ts new file mode 100644 index 0000000..377c5d1 --- /dev/null +++ b/src/environments/environment.production.ts @@ -0,0 +1,11 @@ +export const environment = { + prod: true, + api: { + baseURL: 'https://hexagonalchess-api.zucchi.dev', + }, + identityProvider: { + baseURL: 'https://hexagonalchess-auth.zucchi.dev', + clientId: 'hexagonalChess-client', + realm: 'HexagonalChess', + }, +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..1fa44dd --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,15 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + prod: false, + api: { + baseURL: 'http://localhost:8080', + }, + identityProvider: { + baseURL: 'http://localhost:8081', + clientId: 'hexagonalChess-client', + realm: 'HexagonalChess', + }, +}; diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + Hexagonal Chess + + + + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..17a5cd4 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,7 @@ +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; + +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch((err) => console.error(err)); diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..6181559 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,24 @@ +/* You can add global styles to this file, and also import other style files */ + +html, +body { + height: 100%; +} +body { + margin: 0; + font-family: Roboto, 'Helvetica Neue', sans-serif; +} + +:root { + --board-cell0: #828ca4; + --board-cell1: #b9c2da; + --board-cell2: #e8edf9; + --black-piece-inner: #34364c; + --black-piece-stroke: #f4f7fa; + --white-piece-inner: #f4f7fa; + --white-piece-stroke: #34364c; +} + +a { + color: #ce93d8; +} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..374cc9d --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..299c3ab --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,98 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + //"forceConsistentCasingInFileNames": true, + //"strict": true, + "strictPropertyInitialization": false, + //"noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + //"moduleResolution": "node", + "importHelpers": true, + "module": "ES2022", + "useDefineForClassFields": false, + "lib": ["ES2022", "dom"], + + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + // "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + // "resolveJsonModule": true, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + // "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "noImplicitOverride": true + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..be7e9da --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +}

kv5Nmk;`t`8$7aKS#@ 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.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1602.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.0.tgz", + "integrity": "sha512-ZRmUTBeD+uGr605eOHnsovEn6f1mOBI+kxP64DRvagNweX5TN04s3iyQ8jmLSAHQD9ush31LFxv3dVNxv3ceXQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.0", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.0.tgz", + "integrity": "sha512-miylwjOqvlKmYrzS84bjRaJrecZxOXH9xsPVvQE8VBe8UKePJjRAL6yyOqXUOGtzlch2YmT98RAnuni7y0FEAw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1602.0", + "@angular-devkit/build-webpack": "0.1602.0", + "@angular-devkit/core": "16.2.0", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "16.2.0", + "@vitejs/plugin-basic-ssl": "1.0.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", + "piscina": "4.0.0", + "postcss": "8.4.27", + "postcss-loader": "7.3.3", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.19.2", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.6.1", + "vite": "4.4.7", + "webpack": "5.88.2", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.18.17" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0", + "@angular/localize": "^16.0.0", + "@angular/platform-server": "^16.0.0", + "@angular/service-worker": "^16.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^16.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.9.3 <5.2" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1602.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.0.tgz", + "integrity": "sha512-KdSr6iAcO30i/LIGL8mYi+d1buVXuDCp2dptzEJ4vxReOMFJca90KLwb+tVHEqqnDb0WkNfWm8Ii2QYh2FrNyA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1602.0", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.0.tgz", + "integrity": "sha512-l1k6Rqm3YM16BEn3CWyQKrk9xfu+2ux7Bw3oS+h1TO4/RoxO2PgHj8LLRh/WNrYVarhaqO7QZ5ePBkXNMkzJ1g==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.0.tgz", + "integrity": "sha512-QMDJXPE0+YQJ9Ap3MMzb0v7rx6ZbBEokmHgpdIjN3eILYmbAdsSGE8HTV8NjS9nKmcyE9OGzFCMb7PFrDTlTAw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.0", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.1", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/animations": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.1.tgz", + "integrity": "sha512-XVabK9fRKJaYPhW5wn8ySL4KL45N5Np+xOssWhLPDRDBdZjl62MExfpvMkamdkos6E1n1IGsy9wSemjnR4WKhg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "16.2.1" + } + }, + "node_modules/@angular/cdk": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.1.tgz", + "integrity": "sha512-rRVdAdfuQ34Eq7na/q2SIO6Me2p/rtU2zeQOW6wrNf6KJfWSTbU6RvNw09cDygAQLp/WmwQvWLhkjWNWGDSf0w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^16.0.0 || ^17.0.0", + "@angular/core": "^16.0.0 || ^17.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cli": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.0.tgz", + "integrity": "sha512-xT8vJOyw6Rc2364XDW2jHagLgKu7342ktd/lt+c0u6R+AB2XVFMePR7VceLohX9N/vRUsbQ0nVSZr+ru/hA+HA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1602.0", + "@angular-devkit/core": "16.2.0", + "@angular-devkit/schematics": "16.2.0", + "@schematics/angular": "16.2.0", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.4", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.1.tgz", + "integrity": "sha512-druackA5JQpvfS8cD8DFtPRXGRKbhx3mQ778t1n6x3fXpIdGaAX+nSAgAKhIoF7fxWmu0KuHGzb+3BFlZRyTXw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "16.2.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.1.tgz", + "integrity": "sha512-dPauu+ESn79d66U9nBvnunNuBk/UMqnm7iL9Q31J8OKYN/4vrKbsO57pmULOft/GRAYsE3FdLBH0NkocFZKIMQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "16.2.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.1.tgz", + "integrity": "sha512-A5SyNZTZnXSCL5JVXHKbYj9p2dRYoeFnb6hGQFt2AuCcpUjVIIdwHtre3YzkKe5sFwepPctdoRe2fRXlTfTRjA==", + "dev": true, + "dependencies": { + "@babel/core": "7.22.5", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "16.2.1", + "typescript": ">=4.9.3 <5.2" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/core": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.1.tgz", + "integrity": "sha512-Y+0jssQnJPovxMv9cDKYlp6BBHeFBLOHd/+FPv5IIGD1c7NwBP/TImJxCaIV78a57xnO8L0SFacDg/kULzvKrg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.13.0" + } + }, + "node_modules/@angular/forms": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.1.tgz", + "integrity": "sha512-cCygiLfBAsVHdtKmNptlk2IgXu0wjRc8kSiiSnJkfK6U/NiNg8ADMiN7iYgKW2TD1ZRw+7dYZV856lxEy2n0+A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.2.1", + "@angular/core": "16.2.1", + "@angular/platform-browser": "16.2.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/material": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.2.1.tgz", + "integrity": "sha512-WwjKgYBkZA9EUEOMEFR00ZMFXPs9xLOca3+8njEs/SyeqE0p02H5cnjAaekQfUkcxhwFz1WfJMftI01ODS/S5A==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/auto-init": "15.0.0-canary.bc9ae6c9c.0", + "@material/banner": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/card": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/chips": "15.0.0-canary.bc9ae6c9c.0", + "@material/circular-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/data-table": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dialog": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/drawer": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/fab": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/form-field": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/image-list": "15.0.0-canary.bc9ae6c9c.0", + "@material/layout-grid": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/radio": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/segmented-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/slider": "15.0.0-canary.bc9ae6c9c.0", + "@material/snackbar": "15.0.0-canary.bc9ae6c9c.0", + "@material/switch": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/textfield": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tooltip": "15.0.0-canary.bc9ae6c9c.0", + "@material/top-app-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^16.0.0 || ^17.0.0", + "@angular/cdk": "16.2.1", + "@angular/common": "^16.0.0 || ^17.0.0", + "@angular/core": "^16.0.0 || ^17.0.0", + "@angular/forms": "^16.0.0 || ^17.0.0", + "@angular/platform-browser": "^16.0.0 || ^17.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.1.tgz", + "integrity": "sha512-SH8zRiRAcw0B5/tVlEc5U/lN5F8g+JizSuu7BQvpCAQEDkM6IjF9LP36Bjav7JuadItbWLfT6peWYa1sJvax2w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "16.2.1", + "@angular/common": "16.2.1", + "@angular/core": "16.2.1" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.1.tgz", + "integrity": "sha512-dKMCSrbD/joOMXM1mhDOKNDZ1BxwO9r9uu5ZxY0L/fWm/ousgMucNikLr38vBudgWM8CN6BuabzkxWKcqi3k4g==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.2.1", + "@angular/compiler": "16.2.1", + "@angular/core": "16.2.1", + "@angular/platform-browser": "16.2.1" + } + }, + "node_modules/@angular/router": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.1.tgz", + "integrity": "sha512-C0WfcktsC25G37unxdH/5I7PbkVBSEB1o+0DJK9/HG97r1yzEkptF6fbRIzDBTS7dX0NfWN/PTAKF0ep7YlHvA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.2.1", + "@angular/core": "16.2.1", + "@angular/platform-browser": "16.2.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-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" + } + }, + "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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", + "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", + "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@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.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "dev": true, + "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 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@material/animation": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/auto-init": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/banner": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/base": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw==", + "dependencies": { + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/card": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA==", + "dependencies": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/checkbox": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/chips": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/circular-progress": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/data-table": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/density": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dialog": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dom": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/drawer": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/elevation": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/fab": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/feature-targeting": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/floating-label": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/focus-ring": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w==", + "dependencies": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0" + } + }, + "node_modules/@material/form-field": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/icon-button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/image-list": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/layout-grid": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/line-ripple": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/linear-progress": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/list": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu-surface": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/notched-outline": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/progress-indicator": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/radio": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/ripple": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/rtl": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw==", + "dependencies": { + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/segmented-button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/select": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/shape": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/slider": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/snackbar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/switch": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-bar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-indicator": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-scroller": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/textfield": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/theme": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tokens": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q==", + "dependencies": { + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0" + } + }, + "node_modules/@material/tooltip": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/top-app-bar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/touch-target": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/typography": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.0.tgz", + "integrity": "sha512-c9jv4r7GnLTpnPOeF+a9yAm/3/2wwl9lMBU32i9hlY+q/Hqde4PiL95bUOLnRRL1I64DV7BFTlSZqSPgDpFXZQ==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0", + "typescript": ">=4.9.3 <5.2", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@schematics/angular": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.0.tgz", + "integrity": "sha512-Ib0/ZCkjWt7a5p3209JVwEWwf41v03K3ylvlxLIEo1ZGijAZAlrBj4GrA5YQ+TmPm2hRyt+owss7x91/x+i0Gw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.0", + "@angular-devkit/schematics": "16.2.0", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "node_modules/@stomp/rx-stomp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@stomp/rx-stomp/-/rx-stomp-2.0.0.tgz", + "integrity": "sha512-3UxTxAA3NWGnwFfIvN8AigJ7BxGXG0u5IK8K12mQ9cCMuaT/MM7xlyZnuV8sDbHiqqLlbwA1wk1fDfUyOTIeug==", + "peerDependencies": { + "@stomp/stompjs": "^7.0.0", + "rxjs": "^7.2.0", + "uuid": "^9.0.0" + } + }, + "node_modules/@stomp/stompjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.0.0.tgz", + "integrity": "sha512-fGdq4wPDnSV/KyOsjq4P+zLc8MFWC3lMmP5FBgLWKPJTYcuCbAIrnRGjB7q2jHZdYCOD5vxLuFoKIYLy5/u8Pw==", + "peer": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/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": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.5.tgz", + "integrity": "sha512-9YHUdvuNDDRJYXZwHqSsO72Ok0vmqoJbNn73ttyITQp/VA60SarnZ+MPLD37rJAhVoKp+9BWOvJP5tHIRfZylQ==", + "dev": true + }, + "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 + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", + "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "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/@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" + }, + "peerDependencies": { + "typescript": ">=3.2.x || >= 4.x" + } + }, + "node_modules/@wessberg/ts-evaluator/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/@wessberg/ts-evaluator/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/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/@wessberg/ts-evaluator/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/@wessberg/ts-evaluator/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/@wessberg/ts-evaluator/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@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/@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/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "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 + }, + "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 + }, + "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==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/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/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, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/ag-grid-angular": { + "version": "30.0.6", + "resolved": "https://registry.npmjs.org/ag-grid-angular/-/ag-grid-angular-30.0.6.tgz", + "integrity": "sha512-Qmeldg//Wy2Pr/e0WLRg3s0KKHzIZES1ga5JC/Cn2hNRglkK+zOlXl2PSlvM+kyuKH4I+rwVStw5xwkf6DE3AQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">= 12.0.0", + "@angular/core": ">= 12.0.0", + "ag-grid-community": "~30.0.6" + } + }, + "node_modules/ag-grid-community": { + "version": "30.0.6", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-30.0.6.tgz", + "integrity": "sha512-aMTJNXFDC00QxMaI0/V6M0GTzAtsXUvuxuld97S1Kqb4LvFNsycZlQ3/IcHW7JangRQZxAcwmSpBQBV/lcWoEg==" + }, + "node_modules/ag-grid-enterprise": { + "version": "30.0.6", + "resolved": "https://registry.npmjs.org/ag-grid-enterprise/-/ag-grid-enterprise-30.0.6.tgz", + "integrity": "sha512-IdHG1ES1yjgYqaXzyEdMPSr/ORgw7IoL+XJ/YsgdCKuhjm/YrQb47IcxL4OL6CQQzRq4TrXAaqarfHvljqAvbg==" + }, + "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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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": { + "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-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/angular-animations": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/angular-animations/-/angular-animations-0.11.0.tgz", + "integrity": "sha512-P2RuOe+T97bhgGDLtOYK9V45QA5y+kFUxoJfRAua8Ymo0bI5lWyw8oiVmBoEIZUU+nooYoJvQXgVKuZJA7/z3g==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/animations": ">=6.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "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/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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-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-polyfill-corejs2": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.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.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "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.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/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": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001521", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", + "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "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/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "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": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "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/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "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/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.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/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/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/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==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "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/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/core-js-compat": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cosmiconfig/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/cosmiconfig/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/critters": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/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/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/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/critters/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/critters/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/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/cross-spawn/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/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-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "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/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.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "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/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/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/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "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/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.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": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.493", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.493.tgz", + "integrity": "sha512-T1k9mhYPdjnmS4VAz4J1oKVn6/M6LxoqQEVtYRL0swJVj73bA2NzqF0HjwxGsW3zL3ir0oPmLfd7lyi/RYzreg==", + "dev": true + }, + "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/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/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, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", + "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "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/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/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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/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-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-scope/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/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/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "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/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "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/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "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/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "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-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-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/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/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "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==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/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/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.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.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "dependencies": { + "@wessberg/ts-evaluator": "0.0.27" + }, + "peerDependencies": { + "typescript": ">=3.7.5" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "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/hpack.js/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==", + "dev": true + }, + "node_modules/hpack.js/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "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/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "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/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "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/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.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==", + "dev": true, + "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/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": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.2.tgz", + "integrity": "sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==", + "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==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/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/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/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/inquirer/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/inquirer/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/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-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-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-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-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-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "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-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "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.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/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/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.0.tgz", + "integrity": "sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", + "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "dev": true + }, + "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/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/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/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/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/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/karma/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/keycloak-angular": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/keycloak-angular/-/keycloak-angular-14.0.0.tgz", + "integrity": "sha512-MbXdOz0omPkwzTpKTtaLPrbEoWiNM9zY/qi3JnVepV6zGRRFrzPu3uvz/1nsU+fio0lHcjkjPVLmp/06+kBWZg==", + "dependencies": { + "tslib": "^2.3.1" + }, + "peerDependencies": { + "@angular/common": "^16", + "@angular/core": "^16", + "@angular/router": "^16", + "keycloak-js": "^18 || ^19 || ^20 || ^21" + } + }, + "node_modules/keycloak-js": { + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-21.1.2.tgz", + "integrity": "sha512-+6r1BvmutWGJBtibo7bcFbHWIlA7XoXRCwcA4vopeJh59Nv2Js0ju2u+t8AYth+C6Cg7/BNfO3eCTbsl/dTBHw==", + "dependencies": { + "base64-js": "^1.5.1", + "js-sha256": "^0.9.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/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/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, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/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, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/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/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "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==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/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/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/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, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/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/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "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": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "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==", + "dev": true, + "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/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/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/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/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/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/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/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/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/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/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/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/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/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/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, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "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/ngx-toastr": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-17.0.2.tgz", + "integrity": "sha512-KehiPx6bkbiUyJbabf0ZA04+ASumS8r/y4wPsUOMI9OrBvBcfq27UQmWuQKoVR8E+9y4Pq7eZkSg2kvxNvpxTA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0-0", + "@angular/core": ">=16.0.0-0", + "@angular/platform-browser": ">=16.0.0-0" + } + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/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/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", + "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/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/ora/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/ora/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/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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/pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", + "dev": true, + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "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-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/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/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/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==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "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/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/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": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "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": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "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": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "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/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.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "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-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/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/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.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/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "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==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/safevalues": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", + "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" + }, + "node_modules/sass": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "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/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "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-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "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.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "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/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "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-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/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/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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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-width-cjs": { + "name": "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/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-ansi-cjs": { + "name": "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-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/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "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/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "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-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/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, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/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/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-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "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/tough-cookie/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/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "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": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.26", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "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-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "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/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "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/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/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, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/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/webpack/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/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "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-cjs": { + "name": "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-cjs/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-cjs/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-cjs/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/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": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "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": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/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/zone.js": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", + "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c3f1e26 --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "hexagonal-chess-frontend", + "version": "1.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@ag-grid-enterprise/server-side-row-model": "^30.0.6", + "@angular/animations": "^16.2.1", + "@angular/cdk": "~16.2.1", + "@angular/common": "^16.2.1", + "@angular/compiler": "^16.2.1", + "@angular/core": "^16.2.1", + "@angular/forms": "^16.2.1", + "@angular/material": "~16.2.1", + "@angular/platform-browser": "^16.2.1", + "@angular/platform-browser-dynamic": "^16.2.1", + "@angular/router": "^16.2.1", + "@stomp/rx-stomp": "^2.0.0", + "ag-grid-angular": "^30.0.6", + "ag-grid-community": "^30.0.6", + "ag-grid-enterprise": "^30.0.6", + "angular-animations": "^0.11.0", + "keycloak-angular": "^14.0.0", + "keycloak-js": "^21.1.2", + "ngx-toastr": "^17.0.2", + "rxjs": "~7.8.0", + "tslib": "^2.6.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^16.2.0", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "^16.2.1", + "@types/jasmine": "~4.3.0", + "jasmine-core": "~4.6.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.1.3" + } +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 0000000..ec3ccb7 --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,44 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard } from './auth.guard'; + +const routes: Routes = [ + { + path: 'home', + loadComponent: () => import('./home/home.page').then((m) => m.HomePage), + }, + { + path: 'create_join_game', + loadComponent: () => import('./create-join-game/create-join-game.page').then((m) => m.CreateJoinGamePage), + }, + { + path: 'game_rules', + loadComponent: () => import('./game-rules/game-rules.page').then((m) => m.GameRulesPage), + }, + { + path: 'game/:gameFriendlyId', + pathMatch: 'full', + loadComponent: () => import('./game/game.page').then((m) => m.GamePage), + canActivate: [AuthGuard], + }, + { + path: 'game_list', + loadComponent: () => import('./game-list/game-list.page').then((m) => m.GameListPage), + canActivate: [AuthGuard], + }, + { + path: '404', + loadComponent: () => import('./page-not-found/page-not-found.page').then((m) => m.PageNotFoundPage), + }, + { path: '', redirectTo: '/home', pathMatch: 'full' }, + { path: 'assets/silent-check-sso.html', redirectTo: '/home', pathMatch: 'full' }, + { path: '**', redirectTo: '/404' }, +]; + +@NgModule({ + declarations: [], + imports: [CommonModule, RouterModule.forRoot(routes)], + exports: [RouterModule], +}) +export class AppRoutingModule {} diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..68e42cf --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,6 @@ + +