From 6bea4f766a3b4bcb17de86c33a3e26b3da5f469c Mon Sep 17 00:00:00 2001 From: Bastian Wagner Date: Fri, 31 Jul 2026 21:02:47 +0200 Subject: [PATCH] first commit --- .dockerignore | 9 + .env | 43 + .env.example | 57 + Dockerfile | 40 + env-example | 43 + myteamwallet_backend/.eslintrc.js | 30 + myteamwallet_backend/.gitignore | 41 + myteamwallet_backend/.husky/pre-commit | 4 + myteamwallet_backend/.prettierrc | 4 + myteamwallet_backend/.vscode/settings.json | 7 + myteamwallet_backend/Procfile | 2 + myteamwallet_backend/README.md | 141 + myteamwallet_backend/docker-entrypoint.sh | 14 + myteamwallet_backend/nest-cli.json | 8 + myteamwallet_backend/package-lock.json | 32362 ++++++++++++++++ myteamwallet_backend/package.json | 124 + myteamwallet_backend/renovate.json | 5 + myteamwallet_backend/src/app.module.ts | 86 + .../src/auth/auth-providers.enum.ts | 7 + .../src/auth/auth.controller.ts | 139 + myteamwallet_backend/src/auth/auth.module.ts | 38 + myteamwallet_backend/src/auth/auth.service.ts | 405 + .../src/auth/dto/auth-confirm-email.dto.ts | 8 + .../src/auth/dto/auth-email-login.dto.ts | 17 + .../src/auth/dto/auth-forgot-password.dto.ts | 10 + .../src/auth/dto/auth-register-login.dto.ts | 29 + .../src/auth/dto/auth-reset-password.dto.ts | 12 + .../src/auth/dto/auth-social-login.dto.ts | 22 + .../src/auth/dto/auth-update.dto.ts | 34 + .../src/auth/dto/create-invite.dto.ts | 15 + .../src/auth/dto/verify-token.dto.ts | 6 + .../src/auth/strategies/anonymous.strategy.ts | 14 + .../src/auth/strategies/jwt.strategy.ts | 28 + myteamwallet_backend/src/config/app.config.ts | 13 + .../src/config/auth.config.ts | 6 + .../src/config/database.config.ts | 17 + .../src/config/file.config.ts | 11 + .../src/config/mail.config.ts | 13 + .../src/database/data-source.ts | 23 + .../database/logging/dto/create-log.dto.ts | 13 + .../logging/entities/log-entry.entity.ts | 39 + .../src/database/logging/logging.module.ts | 11 + .../database/logging/logging.service.spec.ts | 18 + .../src/database/logging/logging.service.ts | 95 + .../database/logging/model/log-type.enum.ts | 5 + .../logging/model/logging-event.type.ts | 20 + .../migrations/1604164774154-CreateUser.ts | 75 + .../1785513600000-AddTeamPublicAccess.ts | 29 + .../seeds/player/player-seed.module.ts | 13 + .../seeds/player/player-seed.service.ts | 69 + .../database/seeds/role/role-seed.module.ts | 11 + .../database/seeds/role/role-seed.service.ts | 45 + .../src/database/seeds/run-seed.ts | 33 + .../src/database/seeds/seed.module.ts | 47 + .../seeds/status/status-seed.module.ts | 11 + .../seeds/status/status-seed.service.ts | 30 + .../seeds/team-role/team-role-seed.module.ts | 11 + .../seeds/team-role/team-role-seed.service.ts | 90 + .../team-settings-seed.module.ts | 12 + .../team-settings-seed.service.ts | 30 + ...eam-wallet-transaction-type-seed.module.ts | 11 + ...am-wallet-transaction-type-seed.service.ts | 37 + .../team-wallet-transaction-seed.module.ts | 12 + .../team-wallet-transaction-seed.service.ts | 44 + .../database/seeds/teams/teams-seed.module.ts | 11 + .../seeds/teams/teams-seed.service.ts | 30 + .../transactions-type-seed.module.ts | 11 + .../transactions-type-seed.service.ts | 42 + .../transactions/transactions-seed.module.ts | 13 + .../transactions/transactions-seed.service.ts | 45 + .../database/seeds/user/user-seed.module.ts | 11 + .../database/seeds/user/user-seed.service.ts | 70 + .../src/database/typeorm-config.service.ts | 31 + .../src/files/entities/file.entity.ts | 30 + .../src/files/files.controller.ts | 48 + .../src/files/files.module.ts | 90 + .../src/files/files.service.ts | 39 + .../src/forgot/entities/forgot.entity.ts | 35 + .../src/forgot/forgot.module.ts | 11 + .../src/forgot/forgot.service.ts | 34 + .../src/home/home.controller.ts | 15 + myteamwallet_backend/src/home/home.module.ts | 11 + myteamwallet_backend/src/home/home.service.ts | 11 + myteamwallet_backend/src/i18n/en/common.json | 4 + .../src/i18n/en/confirm-email.json | 5 + .../src/i18n/en/reset-password.json | 6 + .../mail/interfaces/mail-data.interface.ts | 4 + .../src/mail/mail-config.service.ts | 43 + .../src/mail/mail-templates/activation.hbs | 33 + .../mail/mail-templates/reset-password.hbs | 38 + myteamwallet_backend/src/mail/mail.module.ts | 10 + myteamwallet_backend/src/mail/mail.service.ts | 62 + myteamwallet_backend/src/main.ts | 35 + .../src/penalty/dto/create-penalty.dto.ts | 19 + .../src/penalty/entities/penalty.entity.ts | 29 + .../src/penalty/penalty.controller.ts | 45 + .../src/penalty/penalty.module.ts | 30 + .../src/penalty/penalty.service.ts | 61 + .../src/players/entities/player.entity.ts | 66 + .../src/players/players.module.ts | 9 + .../src/roles/entities/role.entity.ts | 16 + .../src/roles/roles.decorator.ts | 3 + myteamwallet_backend/src/roles/roles.enum.ts | 4 + myteamwallet_backend/src/roles/roles.guard.ts | 20 + .../src/social/interfaces/social.interface.ts | 6 + myteamwallet_backend/src/social/tokens.ts | 12 + .../src/statuses/entities/status.entity.ts | 16 + .../src/statuses/statuses.enum.ts | 4 + .../team-roles/entities/team-roles.entity.ts | 16 + .../src/team-roles/team-roles.decorator.ts | 4 + .../src/team-roles/team-roles.enum.ts | 7 + .../src/team-roles/team-roles.guard.ts | 20 + .../dto/create-team-setting.dto.ts | 18 + .../entities/team-setting.entity.ts | 24 + .../src/team-settings/team-settings.module.ts | 7 + .../dto/create-team-wallet-transaction.dto.ts | 23 + .../team-wallet-transaction-type.entity.ts | 16 + .../team-wallet-transaction.entity.ts | 52 + ...team-wallet-transaction.controller.spec.ts | 20 + .../team-wallet-transaction.enum.ts | 4 + .../team-wallet-transaction.service.spec.ts | 20 + .../team-wallet-transactions.controller.ts | 43 + .../team-wallet-transactions.module.ts | 24 + .../team-wallet-transactions.service.ts | 83 + .../src/teams/dto/create-team.dto.ts | 8 + .../src/teams/dto/public-access.dto.ts | 46 + .../src/teams/entities/team.entity.ts | 60 + .../src/teams/model/team-settings-type.ts | 1 + .../teams/public-team-access.service.spec.ts | 178 + .../src/teams/public-team-access.service.ts | 189 + .../src/teams/public-teams.controller.ts | 20 + .../src/teams/team-access.service.spec.ts | 84 + .../src/teams/team-access.service.ts | 47 + .../src/teams/teams.controller.spec.ts | 18 + .../src/teams/teams.controller.ts | 140 + .../src/teams/teams.module.ts | 35 + .../src/teams/teams.service.spec.ts | 18 + .../src/teams/teams.service.ts | 254 + .../dto/create-transaction.dto.ts | 26 + .../entitites/transaction-type.entity.ts | 16 + .../entitites/transaction.entity.ts | 62 + .../src/transactions/transaction-type.enum.ts | 7 + .../transactions.controller.spec.ts | 18 + .../transactions/transactions.controller.ts | 52 + .../src/transactions/transactions.module.ts | 26 + .../transactions/transactions.service.spec.ts | 18 + .../src/transactions/transactions.service.ts | 188 + .../src/translate/model/translation.entity.ts | 17 + .../translate/translate.controller.spec.ts | 18 + .../src/translate/translate.controller.ts | 16 + .../src/translate/translate.module.ts | 12 + .../src/translate/translate.service.spec.ts | 18 + .../src/translate/translate.service.ts | 24 + .../src/users/dto/create-user.dto.ts | 64 + .../src/users/dto/update-user.dto.ts | 62 + .../src/users/entities/user.entity.ts | 100 + .../src/users/users.controller.ts | 89 + .../src/users/users.module.ts | 17 + .../src/users/users.service.ts | 80 + .../src/utils/entity-helper.ts | 15 + .../src/utils/infinity-pagination.ts | 11 + .../src/utils/types/deep-partial.type.ts | 7 + .../src/utils/types/entity-condition.type.ts | 3 + .../src/utils/types/find-options.type.ts | 5 + .../src/utils/types/pagination-options.ts | 4 + .../src/utils/validation-options.ts | 30 + .../utils/validators/is-exists.validator.ts | 32 + .../validators/is-not-exists.validator.ts | 39 + myteamwallet_backend/startup.ci.sh | 11 + myteamwallet_backend/startup.dev.sh | 7 + .../test/admin/auth.e2e-spec.ts | 23 + .../test/admin/users.e2e-spec.ts | 104 + myteamwallet_backend/test/jest-e2e.json | 9 + .../test/user/auth.e2e-spec.ts | 198 + myteamwallet_backend/test/utils/constants.ts | 7 + myteamwallet_backend/tsconfig.build.json | 4 + myteamwallet_backend/tsconfig.json | 21 + myteamwallet_backend/wait-for-it.sh | 182 + myteamwallet_frontend/.editorconfig | 16 + myteamwallet_frontend/.gitignore | 49 + myteamwallet_frontend/.vscode/extensions.json | 4 + myteamwallet_frontend/.vscode/launch.json | 20 + myteamwallet_frontend/.vscode/settings.json | 3 + myteamwallet_frontend/.vscode/tasks.json | 42 + myteamwallet_frontend/README.md | 27 + myteamwallet_frontend/angular.json | 135 + .../plans/2026-07-31-design-foundation.md | 374 + myteamwallet_frontend/ngsw-config.json | 29 + myteamwallet_frontend/package.json | 51 + .../public/icons/icon-128x128.png | Bin 0 -> 2875 bytes .../public/icons/icon-144x144.png | Bin 0 -> 3077 bytes .../public/icons/icon-152x152.png | Bin 0 -> 3293 bytes .../public/icons/icon-192x192.png | Bin 0 -> 4306 bytes .../public/icons/icon-384x384.png | Bin 0 -> 11028 bytes .../public/icons/icon-512x512.png | Bin 0 -> 16332 bytes .../public/icons/icon-72x72.png | Bin 0 -> 1995 bytes .../public/icons/icon-96x96.png | Bin 0 -> 2404 bytes .../src/app/app.component.html | 2 + .../src/app/app.component.scss | 9 + .../src/app/app.component.spec.ts | 29 + .../src/app/app.component.ts | 46 + myteamwallet_frontend/src/app/app.module.ts | 55 + myteamwallet_frontend/src/app/app.routes.ts | 18 + .../src/app/core/guards/auth.guard.ts | 38 + .../app/core/interceptor/auth.interceptor.ts | 34 + .../app/core/translate/translate-loader.ts | 13 + .../src/app/core/user/user.service.spec.ts | 19 + .../src/app/core/user/user.service.ts | 30 + myteamwallet_frontend/src/app/model/index.ts | 3 + myteamwallet_frontend/src/app/model/player.ts | 16 + .../src/app/model/teamrole.ts | 4 + .../src/app/model/transaction.ts | 9 + myteamwallet_frontend/src/app/model/user.ts | 17 + .../src/app/modules/auth.service.spec.ts | 37 + .../src/app/modules/auth.service.ts | 117 + .../src/app/modules/auth/auth.component.html | 12 + .../src/app/modules/auth/auth.component.scss | 25 + .../app/modules/auth/auth.component.spec.ts | 27 + .../src/app/modules/auth/auth.component.ts | 63 + .../src/app/modules/auth/auth.routes.ts | 18 + .../forgot-password.component.html | 29 + .../forgot-password.component.scss | 13 + .../forgot-password.component.ts | 56 + .../auth/login/login-routing.module.ts | 16 + .../modules/auth/login/login.component.html | 31 + .../modules/auth/login/login.component.scss | 13 + .../auth/login/login.component.spec.ts | 35 + .../app/modules/auth/login/login.component.ts | 42 + .../app/modules/auth/login/login.module.ts | 25 + .../password-change.component.html | 45 + .../password-change.component.scss | 26 + .../password-change.component.ts | 65 + .../no-token-provided.component.html | 9 + .../no-token-provided.component.scss | 0 .../no-token-provided.component.spec.ts | 23 + .../no-token-provided.component.ts | 10 + .../register-base.component.html | 1 + .../register-base.component.scss | 0 .../register-base.component.spec.ts | 23 + .../register-base/register-base.component.ts | 10 + .../register-form.component.html | 30 + .../register-form.component.scss | 5 + .../register-form.component.spec.ts | 23 + .../register-form/register-form.component.ts | 37 + .../register/register.component.html | 27 + .../register/register.component.scss | 12 + .../register/register.component.spec.ts | 23 + .../components/register/register.component.ts | 85 + .../auth/register/register-routing.module.ts | 24 + .../modules/auth/register/register.module.ts | 35 + .../home/dashboard/dashboard.component.html | 34 + .../home/dashboard/dashboard.component.scss | 38 + .../dashboard/dashboard.component.spec.ts | 25 + .../home/dashboard/dashboard.component.ts | 60 + .../home/dashboard/dashboard.routes.ts | 7 + .../player-card/player-card.component.html | 11 + .../player-card/player-card.component.scss | 31 + .../player-card/player-card.component.spec.ts | 23 + .../player-card/player-card.component.ts | 27 + .../player-details.component.html | 9 + .../player-details.component.scss | 10 + .../player-details.component.ts | 59 + .../team-details/team-details.component.html | 92 + .../team-details/team-details.component.scss | 59 + .../team-details.component.spec.ts | 93 + .../team-details/team-details.component.ts | 303 + .../src/app/modules/home/home.component.html | 9 + .../src/app/modules/home/home.component.scss | 18 + .../src/app/modules/home/home.component.ts | 73 + .../src/app/modules/home/home.routes.ts | 9 + .../app/modules/teams/model/team-invite.ts | 6 + .../src/app/modules/teams/model/team.ts | 11 + .../overview/details/details.component.html | 48 + .../overview/details/details.component.scss | 61 + .../details/details.component.spec.ts | 81 + .../overview/details/details.component.ts | 38 + .../teams/overview/overview-routing.module.ts | 15 + .../teams/overview/overview.component.html | 72 + .../teams/overview/overview.component.scss | 41 + .../teams/overview/overview.component.spec.ts | 40 + .../teams/overview/overview.component.ts | 100 + .../modules/teams/overview/overview.module.ts | 43 + .../app/modules/teams/teams-routing.module.ts | 19 + .../app/modules/teams/teams.component.html | 12 + .../app/modules/teams/teams.component.scss | 11 + .../app/modules/teams/teams.component.spec.ts | 56 + .../src/app/modules/teams/teams.component.ts | 41 + .../src/app/modules/teams/teams.module.ts | 26 + .../app/modules/teams/teams.service.spec.ts | 19 + .../src/app/modules/teams/teams.service.ts | 61 + .../player-info-form.component.html | 32 + .../player-info-form.component.scss | 16 + .../player-info-form.component.spec.ts | 23 + .../player-info-form.component.ts | 27 + .../transaction-form.component.html | 36 + .../transaction-form.component.scss | 28 + .../transaction-form.component.spec.ts | 23 + .../transaction-form.component.ts | 71 + .../confirm-dialog.component.html | 8 + .../confirm-dialog.component.ts | 33 + .../create-player.dialog.component.html | 10 + .../create-player.dialog.component.scss | 6 + .../create-player.dialog.component.spec.ts | 23 + .../create-player.dialog.component.ts | 36 + .../src/app/shared/dialog/dialog.module.ts | 60 + .../src/app/shared/dialog/index.ts | 2 + .../model/transaction-type.enum.ts | 8 + .../new-transaction.component.html | 27 + .../new-transaction.component.scss | 30 + .../new-transaction.component.spec.ts | 51 + .../new-transaction.component.ts | 121 + .../privileges-info-dialog.component.html | 46 + .../privileges-info-dialog.component.scss | 9 + .../privileges-info-dialog.component.spec.ts | 23 + .../privileges-info-dialog.component.ts | 14 + .../show-team-transactions.component.html | 118 + .../show-team-transactions.component.scss | 172 + .../show-team-transactions.component.spec.ts | 23 + .../show-team-transactions.component.ts | 137 + .../team-transaction-dialog.component.html | 10 + .../team-transaction-dialog.component.scss | 6 + .../team-transaction-dialog.component.spec.ts | 23 + .../team-transaction-dialog.component.ts | 51 + myteamwallet_frontend/src/app/shared/index.ts | 1 + .../penalties/model/penalty.interface.ts | 6 + .../shared/penalties/penalties.component.html | 19 + .../shared/penalties/penalties.component.scss | 0 .../penalties/penalties.component.spec.ts | 23 + .../shared/penalties/penalties.component.ts | 49 + .../src/app/shared/shared.module.ts | 15 + .../under-construction.component.html | 4 + .../under-construction.component.scss | 8 + .../under-construction.component.spec.ts | 23 + .../under-construction.component.ts | 10 + myteamwallet_frontend/src/assets/.gitkeep | 0 myteamwallet_frontend/src/assets/favicon.png | Bin 0 -> 926 bytes .../src/assets/screenshots/screen_mobile.png | Bin 0 -> 118299 bytes .../src/assets/screenshots/screen_wide.png | Bin 0 -> 225454 bytes myteamwallet_frontend/src/assets/sports.svg | 84 + .../src/environments/environment.dev.ts | 5 + .../src/environments/environment.prod.ts | 5 + .../src/environments/environment.ts | 5 + myteamwallet_frontend/src/favicon.ico | Bin 0 -> 948 bytes myteamwallet_frontend/src/index.html | 19 + myteamwallet_frontend/src/main.ts | 7 + .../src/manifest.webmanifest | 34 + myteamwallet_frontend/src/styles.scss | 118 + myteamwallet_frontend/src/styles/_theme.scss | 16 + myteamwallet_frontend/src/styles/_tokens.scss | 30 + myteamwallet_frontend/tsconfig.app.json | 14 + myteamwallet_frontend/tsconfig.json | 36 + myteamwallet_frontend/tsconfig.spec.json | 14 + myteamwallet_frontend_modern/.editorconfig | 17 + myteamwallet_frontend_modern/.gitignore | 48 + myteamwallet_frontend_modern/.prettierrc | 12 + .../.superdesign/design-system.md | 38 + .../.superdesign/init/components.md | 3 + .../init/extractable-components.md | 11 + .../.superdesign/init/layouts.md | 80 + .../.superdesign/init/pages.md | 29 + .../.superdesign/init/routes.md | 14 + .../.superdesign/init/theme.md | 41 + .../.vscode/extensions.json | 4 + .../.vscode/launch.json | 20 + myteamwallet_frontend_modern/.vscode/mcp.json | 9 + .../.vscode/tasks.json | 42 + myteamwallet_frontend_modern/README.md | 59 + myteamwallet_frontend_modern/angular.json | 107 + .../plans/2026-07-31-foundation-app-shell.md | 1853 + .../plans/2026-07-31-public-team-sharing.md | 113 + .../2026-07-31-team-select-and-team-store.md | 1036 + ...07-31-teamwallet-frontend-modern-design.md | 132 + myteamwallet_frontend_modern/ngsw-config.json | 28 + .../package-lock.json | 8990 +++++ myteamwallet_frontend_modern/package.json | 38 + .../public/favicon.ico | Bin 0 -> 15086 bytes .../public/icons/icon-128x128.png | Bin 0 -> 2875 bytes .../public/icons/icon-144x144.png | Bin 0 -> 3077 bytes .../public/icons/icon-152x152.png | Bin 0 -> 3293 bytes .../public/icons/icon-192x192.png | Bin 0 -> 4306 bytes .../public/icons/icon-384x384.png | Bin 0 -> 11028 bytes .../public/icons/icon-512x512.png | Bin 0 -> 16332 bytes .../public/icons/icon-72x72.png | Bin 0 -> 1995 bytes .../public/icons/icon-96x96.png | Bin 0 -> 2404 bytes .../public/manifest.webmanifest | 59 + .../src/app/app.config.ts | 20 + myteamwallet_frontend_modern/src/app/app.html | 1 + .../src/app/app.routes.spec.ts | 63 + .../src/app/app.routes.ts | 100 + myteamwallet_frontend_modern/src/app/app.scss | 0 .../src/app/app.spec.ts | 76 + myteamwallet_frontend_modern/src/app/app.ts | 31 + .../src/app/core/auth/auth-api.spec.ts | 120 + .../src/app/core/auth/auth-api.ts | 74 + .../src/app/core/auth/auth-guard.spec.ts | 28 + .../src/app/core/auth/auth-guard.ts | 10 + .../src/app/core/auth/auth-store.spec.ts | 79 + .../src/app/core/auth/auth-store.ts | 51 + .../app/core/auth/root-redirect-guard.spec.ts | 29 + .../src/app/core/auth/root-redirect-guard.ts | 10 + .../app/core/http/auth-interceptor.spec.ts | 46 + .../src/app/core/http/auth-interceptor.ts | 14 + .../app/core/http/error-interceptor.spec.ts | 96 + .../src/app/core/http/error-interceptor.ts | 35 + .../core/layout/not-found/not-found.spec.ts | 21 + .../app/core/layout/not-found/not-found.ts | 14 + .../src/app/core/layout/shell/shell.html | 38 + .../src/app/core/layout/shell/shell.scss | 42 + .../src/app/core/layout/shell/shell.spec.ts | 156 + .../src/app/core/layout/shell/shell.ts | 78 + .../src/app/core/team/my-teams-store.spec.ts | 64 + .../src/app/core/team/my-teams-store.ts | 33 + .../src/app/core/team/penalty-api.spec.ts | 36 + .../src/app/core/team/penalty-api.ts | 19 + .../app/core/team/public-access-api.spec.ts | 43 + .../src/app/core/team/public-access-api.ts | 28 + .../src/app/core/team/public-team-api.spec.ts | 36 + .../src/app/core/team/public-team-api.ts | 22 + .../src/app/core/team/team-store.spec.ts | 109 + .../src/app/core/team/team-store.ts | 56 + .../src/app/core/team/teams-api.spec.ts | 79 + .../src/app/core/team/teams-api.ts | 40 + .../app/core/team/transactions-api.spec.ts | 87 + .../src/app/core/team/transactions-api.ts | 36 + .../auth/forgot-password/forgot-password.html | 28 + .../auth/forgot-password/forgot-password.scss | 20 + .../forgot-password/forgot-password.spec.ts | 30 + .../auth/forgot-password/forgot-password.ts | 47 + .../src/app/features/auth/login/login.html | 45 + .../src/app/features/auth/login/login.scss | 28 + .../src/app/features/auth/login/login.spec.ts | 56 + .../src/app/features/auth/login/login.ts | 61 + .../app/features/auth/register/register.html | 61 + .../app/features/auth/register/register.scss | 38 + .../features/auth/register/register.spec.ts | 58 + .../app/features/auth/register/register.ts | 94 + .../auth/reset-password/reset-password.html | 28 + .../auth/reset-password/reset-password.scss | 18 + .../reset-password/reset-password.spec.ts | 46 + .../auth/reset-password/reset-password.ts | 55 + .../features/public-team/public-player.html | 40 + .../features/public-team/public-player.scss | 92 + .../public-team/public-player.spec.ts | 53 + .../app/features/public-team/public-player.ts | 79 + .../app/features/public-team/public-team.html | 76 + .../app/features/public-team/public-team.scss | 134 + .../features/public-team/public-team.spec.ts | 38 + .../app/features/public-team/public-team.ts | 73 + .../app/features/team-select/team-select.html | 21 + .../app/features/team-select/team-select.scss | 13 + .../features/team-select/team-select.spec.ts | 95 + .../app/features/team-select/team-select.ts | 37 + .../app/features/team/cashbox/cashbox.html | 173 + .../app/features/team/cashbox/cashbox.scss | 161 + .../app/features/team/cashbox/cashbox.spec.ts | 169 + .../src/app/features/team/cashbox/cashbox.ts | 283 + .../cashbox/transaction-calculation.spec.ts | 15 + .../team/cashbox/transaction-calculation.ts | 17 + .../app/features/team/members/members.html | 83 + .../app/features/team/members/members.scss | 110 + .../app/features/team/members/members.spec.ts | 68 + .../src/app/features/team/members/members.ts | 99 + .../features/team/members/player-detail.html | 38 + .../features/team/members/player-detail.scss | 57 + .../team/members/player-detail.spec.ts | 54 + .../features/team/members/player-detail.ts | 70 + .../app/features/team/more/invite/invite.html | 45 + .../app/features/team/more/invite/invite.scss | 58 + .../features/team/more/invite/invite.spec.ts | 63 + .../app/features/team/more/invite/invite.ts | 90 + .../src/app/features/team/more/more.html | 48 + .../src/app/features/team/more/more.scss | 76 + .../src/app/features/team/more/more.spec.ts | 39 + .../src/app/features/team/more/more.ts | 23 + .../team/more/penalties/penalties.html | 43 + .../team/more/penalties/penalties.scss | 70 + .../team/more/penalties/penalties.spec.ts | 54 + .../features/team/more/penalties/penalties.ts | 101 + .../features/team/more/profile/profile.html | 32 + .../features/team/more/profile/profile.scss | 60 + .../team/more/profile/profile.spec.ts | 52 + .../app/features/team/more/profile/profile.ts | 66 + .../more/public-access/public-access.html | 94 + .../more/public-access/public-access.scss | 139 + .../more/public-access/public-access.spec.ts | 110 + .../team/more/public-access/public-access.ts | 173 + .../app/features/team/overview/overview.html | 53 + .../app/features/team/overview/overview.scss | 104 + .../features/team/overview/overview.spec.ts | 79 + .../app/features/team/overview/overview.ts | 67 + .../src/app/models/penalty.model.ts | 12 + .../src/app/models/player.model.ts | 18 + .../src/app/models/public-access.model.ts | 28 + .../src/app/models/role.model.ts | 9 + .../src/app/models/status.model.ts | 4 + .../src/app/models/team-role.model.spec.ts | 25 + .../src/app/models/team-role.model.ts | 15 + .../src/app/models/team.model.ts | 10 + .../src/app/models/transaction-amount.spec.ts | 13 + .../src/app/models/transaction-amount.ts | 12 + .../src/app/models/transaction.model.ts | 33 + .../src/app/models/user.model.ts | 17 + .../shared/confirm-dialog/confirm-dialog.ts | 28 + .../src/environments/environment.container.ts | 4 + .../environments/environment.development.ts | 4 + .../src/environments/environment.ts | 4 + myteamwallet_frontend_modern/src/index.html | 23 + myteamwallet_frontend_modern/src/main.ts | 5 + myteamwallet_frontend_modern/src/styles.scss | 39 + .../tsconfig.app.json | 15 + myteamwallet_frontend_modern/tsconfig.json | 33 + .../tsconfig.spec.json | 15 + 512 files changed, 64459 insertions(+) create mode 100644 .dockerignore create mode 100644 .env create mode 100644 .env.example create mode 100644 Dockerfile create mode 100644 env-example create mode 100644 myteamwallet_backend/.eslintrc.js create mode 100644 myteamwallet_backend/.gitignore create mode 100644 myteamwallet_backend/.husky/pre-commit create mode 100644 myteamwallet_backend/.prettierrc create mode 100644 myteamwallet_backend/.vscode/settings.json create mode 100644 myteamwallet_backend/Procfile create mode 100644 myteamwallet_backend/README.md create mode 100644 myteamwallet_backend/docker-entrypoint.sh create mode 100644 myteamwallet_backend/nest-cli.json create mode 100644 myteamwallet_backend/package-lock.json create mode 100644 myteamwallet_backend/package.json create mode 100644 myteamwallet_backend/renovate.json create mode 100644 myteamwallet_backend/src/app.module.ts create mode 100644 myteamwallet_backend/src/auth/auth-providers.enum.ts create mode 100644 myteamwallet_backend/src/auth/auth.controller.ts create mode 100644 myteamwallet_backend/src/auth/auth.module.ts create mode 100644 myteamwallet_backend/src/auth/auth.service.ts create mode 100644 myteamwallet_backend/src/auth/dto/auth-confirm-email.dto.ts create mode 100644 myteamwallet_backend/src/auth/dto/auth-email-login.dto.ts create mode 100644 myteamwallet_backend/src/auth/dto/auth-forgot-password.dto.ts create mode 100644 myteamwallet_backend/src/auth/dto/auth-register-login.dto.ts create mode 100644 myteamwallet_backend/src/auth/dto/auth-reset-password.dto.ts create mode 100644 myteamwallet_backend/src/auth/dto/auth-social-login.dto.ts create mode 100644 myteamwallet_backend/src/auth/dto/auth-update.dto.ts create mode 100644 myteamwallet_backend/src/auth/dto/create-invite.dto.ts create mode 100644 myteamwallet_backend/src/auth/dto/verify-token.dto.ts create mode 100644 myteamwallet_backend/src/auth/strategies/anonymous.strategy.ts create mode 100644 myteamwallet_backend/src/auth/strategies/jwt.strategy.ts create mode 100644 myteamwallet_backend/src/config/app.config.ts create mode 100644 myteamwallet_backend/src/config/auth.config.ts create mode 100644 myteamwallet_backend/src/config/database.config.ts create mode 100644 myteamwallet_backend/src/config/file.config.ts create mode 100644 myteamwallet_backend/src/config/mail.config.ts create mode 100644 myteamwallet_backend/src/database/data-source.ts create mode 100644 myteamwallet_backend/src/database/logging/dto/create-log.dto.ts create mode 100644 myteamwallet_backend/src/database/logging/entities/log-entry.entity.ts create mode 100644 myteamwallet_backend/src/database/logging/logging.module.ts create mode 100644 myteamwallet_backend/src/database/logging/logging.service.spec.ts create mode 100644 myteamwallet_backend/src/database/logging/logging.service.ts create mode 100644 myteamwallet_backend/src/database/logging/model/log-type.enum.ts create mode 100644 myteamwallet_backend/src/database/logging/model/logging-event.type.ts create mode 100644 myteamwallet_backend/src/database/migrations/1604164774154-CreateUser.ts create mode 100644 myteamwallet_backend/src/database/migrations/1785513600000-AddTeamPublicAccess.ts create mode 100644 myteamwallet_backend/src/database/seeds/player/player-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/player/player-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/role/role-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/role/role-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/run-seed.ts create mode 100644 myteamwallet_backend/src/database/seeds/seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/status/status-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/status/status-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/team-role/team-role-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/team-role/team-role-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/team-settings/team-settings-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/team-settings/team-settings-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/team-wallet-transactions-type/team-wallet-transaction-type-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/team-wallet-transactions-type/team-wallet-transaction-type-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/team-wallet-transactions/team-wallet-transaction-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/team-wallet-transactions/team-wallet-transaction-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/teams/teams-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/teams/teams-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/transaction-type/transactions-type-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/transaction-type/transactions-type-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/transactions/transactions-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/transactions/transactions-seed.service.ts create mode 100644 myteamwallet_backend/src/database/seeds/user/user-seed.module.ts create mode 100644 myteamwallet_backend/src/database/seeds/user/user-seed.service.ts create mode 100644 myteamwallet_backend/src/database/typeorm-config.service.ts create mode 100644 myteamwallet_backend/src/files/entities/file.entity.ts create mode 100644 myteamwallet_backend/src/files/files.controller.ts create mode 100644 myteamwallet_backend/src/files/files.module.ts create mode 100644 myteamwallet_backend/src/files/files.service.ts create mode 100644 myteamwallet_backend/src/forgot/entities/forgot.entity.ts create mode 100644 myteamwallet_backend/src/forgot/forgot.module.ts create mode 100644 myteamwallet_backend/src/forgot/forgot.service.ts create mode 100644 myteamwallet_backend/src/home/home.controller.ts create mode 100644 myteamwallet_backend/src/home/home.module.ts create mode 100644 myteamwallet_backend/src/home/home.service.ts create mode 100644 myteamwallet_backend/src/i18n/en/common.json create mode 100644 myteamwallet_backend/src/i18n/en/confirm-email.json create mode 100644 myteamwallet_backend/src/i18n/en/reset-password.json create mode 100644 myteamwallet_backend/src/mail/interfaces/mail-data.interface.ts create mode 100644 myteamwallet_backend/src/mail/mail-config.service.ts create mode 100644 myteamwallet_backend/src/mail/mail-templates/activation.hbs create mode 100644 myteamwallet_backend/src/mail/mail-templates/reset-password.hbs create mode 100644 myteamwallet_backend/src/mail/mail.module.ts create mode 100644 myteamwallet_backend/src/mail/mail.service.ts create mode 100644 myteamwallet_backend/src/main.ts create mode 100644 myteamwallet_backend/src/penalty/dto/create-penalty.dto.ts create mode 100644 myteamwallet_backend/src/penalty/entities/penalty.entity.ts create mode 100644 myteamwallet_backend/src/penalty/penalty.controller.ts create mode 100644 myteamwallet_backend/src/penalty/penalty.module.ts create mode 100644 myteamwallet_backend/src/penalty/penalty.service.ts create mode 100644 myteamwallet_backend/src/players/entities/player.entity.ts create mode 100644 myteamwallet_backend/src/players/players.module.ts create mode 100644 myteamwallet_backend/src/roles/entities/role.entity.ts create mode 100644 myteamwallet_backend/src/roles/roles.decorator.ts create mode 100644 myteamwallet_backend/src/roles/roles.enum.ts create mode 100644 myteamwallet_backend/src/roles/roles.guard.ts create mode 100644 myteamwallet_backend/src/social/interfaces/social.interface.ts create mode 100644 myteamwallet_backend/src/social/tokens.ts create mode 100644 myteamwallet_backend/src/statuses/entities/status.entity.ts create mode 100644 myteamwallet_backend/src/statuses/statuses.enum.ts create mode 100644 myteamwallet_backend/src/team-roles/entities/team-roles.entity.ts create mode 100644 myteamwallet_backend/src/team-roles/team-roles.decorator.ts create mode 100644 myteamwallet_backend/src/team-roles/team-roles.enum.ts create mode 100644 myteamwallet_backend/src/team-roles/team-roles.guard.ts create mode 100644 myteamwallet_backend/src/team-settings/dto/create-team-setting.dto.ts create mode 100644 myteamwallet_backend/src/team-settings/entities/team-setting.entity.ts create mode 100644 myteamwallet_backend/src/team-settings/team-settings.module.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/dto/create-team-wallet-transaction.dto.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/entities/team-wallet-transaction-type.entity.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/entities/team-wallet-transaction.entity.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.controller.spec.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.enum.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.service.spec.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.controller.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.module.ts create mode 100644 myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.service.ts create mode 100644 myteamwallet_backend/src/teams/dto/create-team.dto.ts create mode 100644 myteamwallet_backend/src/teams/dto/public-access.dto.ts create mode 100644 myteamwallet_backend/src/teams/entities/team.entity.ts create mode 100644 myteamwallet_backend/src/teams/model/team-settings-type.ts create mode 100644 myteamwallet_backend/src/teams/public-team-access.service.spec.ts create mode 100644 myteamwallet_backend/src/teams/public-team-access.service.ts create mode 100644 myteamwallet_backend/src/teams/public-teams.controller.ts create mode 100644 myteamwallet_backend/src/teams/team-access.service.spec.ts create mode 100644 myteamwallet_backend/src/teams/team-access.service.ts create mode 100644 myteamwallet_backend/src/teams/teams.controller.spec.ts create mode 100644 myteamwallet_backend/src/teams/teams.controller.ts create mode 100644 myteamwallet_backend/src/teams/teams.module.ts create mode 100644 myteamwallet_backend/src/teams/teams.service.spec.ts create mode 100644 myteamwallet_backend/src/teams/teams.service.ts create mode 100644 myteamwallet_backend/src/transactions/dto/create-transaction.dto.ts create mode 100644 myteamwallet_backend/src/transactions/entitites/transaction-type.entity.ts create mode 100644 myteamwallet_backend/src/transactions/entitites/transaction.entity.ts create mode 100644 myteamwallet_backend/src/transactions/transaction-type.enum.ts create mode 100644 myteamwallet_backend/src/transactions/transactions.controller.spec.ts create mode 100644 myteamwallet_backend/src/transactions/transactions.controller.ts create mode 100644 myteamwallet_backend/src/transactions/transactions.module.ts create mode 100644 myteamwallet_backend/src/transactions/transactions.service.spec.ts create mode 100644 myteamwallet_backend/src/transactions/transactions.service.ts create mode 100644 myteamwallet_backend/src/translate/model/translation.entity.ts create mode 100644 myteamwallet_backend/src/translate/translate.controller.spec.ts create mode 100644 myteamwallet_backend/src/translate/translate.controller.ts create mode 100644 myteamwallet_backend/src/translate/translate.module.ts create mode 100644 myteamwallet_backend/src/translate/translate.service.spec.ts create mode 100644 myteamwallet_backend/src/translate/translate.service.ts create mode 100644 myteamwallet_backend/src/users/dto/create-user.dto.ts create mode 100644 myteamwallet_backend/src/users/dto/update-user.dto.ts create mode 100644 myteamwallet_backend/src/users/entities/user.entity.ts create mode 100644 myteamwallet_backend/src/users/users.controller.ts create mode 100644 myteamwallet_backend/src/users/users.module.ts create mode 100644 myteamwallet_backend/src/users/users.service.ts create mode 100644 myteamwallet_backend/src/utils/entity-helper.ts create mode 100644 myteamwallet_backend/src/utils/infinity-pagination.ts create mode 100644 myteamwallet_backend/src/utils/types/deep-partial.type.ts create mode 100644 myteamwallet_backend/src/utils/types/entity-condition.type.ts create mode 100644 myteamwallet_backend/src/utils/types/find-options.type.ts create mode 100644 myteamwallet_backend/src/utils/types/pagination-options.ts create mode 100644 myteamwallet_backend/src/utils/validation-options.ts create mode 100644 myteamwallet_backend/src/utils/validators/is-exists.validator.ts create mode 100644 myteamwallet_backend/src/utils/validators/is-not-exists.validator.ts create mode 100644 myteamwallet_backend/startup.ci.sh create mode 100644 myteamwallet_backend/startup.dev.sh create mode 100644 myteamwallet_backend/test/admin/auth.e2e-spec.ts create mode 100644 myteamwallet_backend/test/admin/users.e2e-spec.ts create mode 100644 myteamwallet_backend/test/jest-e2e.json create mode 100644 myteamwallet_backend/test/user/auth.e2e-spec.ts create mode 100644 myteamwallet_backend/test/utils/constants.ts create mode 100644 myteamwallet_backend/tsconfig.build.json create mode 100644 myteamwallet_backend/tsconfig.json create mode 100644 myteamwallet_backend/wait-for-it.sh create mode 100644 myteamwallet_frontend/.editorconfig create mode 100644 myteamwallet_frontend/.gitignore create mode 100644 myteamwallet_frontend/.vscode/extensions.json create mode 100644 myteamwallet_frontend/.vscode/launch.json create mode 100644 myteamwallet_frontend/.vscode/settings.json create mode 100644 myteamwallet_frontend/.vscode/tasks.json create mode 100644 myteamwallet_frontend/README.md create mode 100644 myteamwallet_frontend/angular.json create mode 100644 myteamwallet_frontend/docs/superpowers/plans/2026-07-31-design-foundation.md create mode 100644 myteamwallet_frontend/ngsw-config.json create mode 100644 myteamwallet_frontend/package.json create mode 100644 myteamwallet_frontend/public/icons/icon-128x128.png create mode 100644 myteamwallet_frontend/public/icons/icon-144x144.png create mode 100644 myteamwallet_frontend/public/icons/icon-152x152.png create mode 100644 myteamwallet_frontend/public/icons/icon-192x192.png create mode 100644 myteamwallet_frontend/public/icons/icon-384x384.png create mode 100644 myteamwallet_frontend/public/icons/icon-512x512.png create mode 100644 myteamwallet_frontend/public/icons/icon-72x72.png create mode 100644 myteamwallet_frontend/public/icons/icon-96x96.png create mode 100644 myteamwallet_frontend/src/app/app.component.html create mode 100644 myteamwallet_frontend/src/app/app.component.scss create mode 100644 myteamwallet_frontend/src/app/app.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/app.component.ts create mode 100644 myteamwallet_frontend/src/app/app.module.ts create mode 100644 myteamwallet_frontend/src/app/app.routes.ts create mode 100644 myteamwallet_frontend/src/app/core/guards/auth.guard.ts create mode 100644 myteamwallet_frontend/src/app/core/interceptor/auth.interceptor.ts create mode 100644 myteamwallet_frontend/src/app/core/translate/translate-loader.ts create mode 100644 myteamwallet_frontend/src/app/core/user/user.service.spec.ts create mode 100644 myteamwallet_frontend/src/app/core/user/user.service.ts create mode 100644 myteamwallet_frontend/src/app/model/index.ts create mode 100644 myteamwallet_frontend/src/app/model/player.ts create mode 100644 myteamwallet_frontend/src/app/model/teamrole.ts create mode 100644 myteamwallet_frontend/src/app/model/transaction.ts create mode 100644 myteamwallet_frontend/src/app/model/user.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth.service.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth.service.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.component.html create mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.routes.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.html create mode 100644 myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login-routing.module.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.component.html create mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.module.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.html create mode 100644 myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.html create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.html create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.html create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.html create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/register-routing.module.ts create mode 100644 myteamwallet_frontend/src/app/modules/auth/register/register.module.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.routes.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.html create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.html create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.html create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/home.component.html create mode 100644 myteamwallet_frontend/src/app/modules/home/home.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/home/home.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/home/home.routes.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/model/team-invite.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/model/team.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.html create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview-routing.module.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.component.html create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.module.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/teams-routing.module.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.component.html create mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.component.scss create mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.component.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.module.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.service.spec.ts create mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.service.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.html create mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.html create mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.html create mode 100644 myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.html create mode 100644 myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/dialog.module.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/index.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/model/transaction-type.enum.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.html create mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.html create mode 100644 myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.html create mode 100644 myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.html create mode 100644 myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/index.ts create mode 100644 myteamwallet_frontend/src/app/shared/penalties/model/penalty.interface.ts create mode 100644 myteamwallet_frontend/src/app/shared/penalties/penalties.component.html create mode 100644 myteamwallet_frontend/src/app/shared/penalties/penalties.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/penalties/penalties.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/penalties/penalties.component.ts create mode 100644 myteamwallet_frontend/src/app/shared/shared.module.ts create mode 100644 myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.html create mode 100644 myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.scss create mode 100644 myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.spec.ts create mode 100644 myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.ts create mode 100644 myteamwallet_frontend/src/assets/.gitkeep create mode 100644 myteamwallet_frontend/src/assets/favicon.png create mode 100644 myteamwallet_frontend/src/assets/screenshots/screen_mobile.png create mode 100644 myteamwallet_frontend/src/assets/screenshots/screen_wide.png create mode 100644 myteamwallet_frontend/src/assets/sports.svg create mode 100644 myteamwallet_frontend/src/environments/environment.dev.ts create mode 100644 myteamwallet_frontend/src/environments/environment.prod.ts create mode 100644 myteamwallet_frontend/src/environments/environment.ts create mode 100644 myteamwallet_frontend/src/favicon.ico create mode 100644 myteamwallet_frontend/src/index.html create mode 100644 myteamwallet_frontend/src/main.ts create mode 100644 myteamwallet_frontend/src/manifest.webmanifest create mode 100644 myteamwallet_frontend/src/styles.scss create mode 100644 myteamwallet_frontend/src/styles/_theme.scss create mode 100644 myteamwallet_frontend/src/styles/_tokens.scss create mode 100644 myteamwallet_frontend/tsconfig.app.json create mode 100644 myteamwallet_frontend/tsconfig.json create mode 100644 myteamwallet_frontend/tsconfig.spec.json create mode 100644 myteamwallet_frontend_modern/.editorconfig create mode 100644 myteamwallet_frontend_modern/.gitignore create mode 100644 myteamwallet_frontend_modern/.prettierrc create mode 100644 myteamwallet_frontend_modern/.superdesign/design-system.md create mode 100644 myteamwallet_frontend_modern/.superdesign/init/components.md create mode 100644 myteamwallet_frontend_modern/.superdesign/init/extractable-components.md create mode 100644 myteamwallet_frontend_modern/.superdesign/init/layouts.md create mode 100644 myteamwallet_frontend_modern/.superdesign/init/pages.md create mode 100644 myteamwallet_frontend_modern/.superdesign/init/routes.md create mode 100644 myteamwallet_frontend_modern/.superdesign/init/theme.md create mode 100644 myteamwallet_frontend_modern/.vscode/extensions.json create mode 100644 myteamwallet_frontend_modern/.vscode/launch.json create mode 100644 myteamwallet_frontend_modern/.vscode/mcp.json create mode 100644 myteamwallet_frontend_modern/.vscode/tasks.json create mode 100644 myteamwallet_frontend_modern/README.md create mode 100644 myteamwallet_frontend_modern/angular.json create mode 100644 myteamwallet_frontend_modern/docs/superpowers/plans/2026-07-31-foundation-app-shell.md create mode 100644 myteamwallet_frontend_modern/docs/superpowers/plans/2026-07-31-public-team-sharing.md create mode 100644 myteamwallet_frontend_modern/docs/superpowers/plans/2026-07-31-team-select-and-team-store.md create mode 100644 myteamwallet_frontend_modern/docs/superpowers/specs/2026-07-31-teamwallet-frontend-modern-design.md create mode 100644 myteamwallet_frontend_modern/ngsw-config.json create mode 100644 myteamwallet_frontend_modern/package-lock.json create mode 100644 myteamwallet_frontend_modern/package.json create mode 100644 myteamwallet_frontend_modern/public/favicon.ico create mode 100644 myteamwallet_frontend_modern/public/icons/icon-128x128.png create mode 100644 myteamwallet_frontend_modern/public/icons/icon-144x144.png create mode 100644 myteamwallet_frontend_modern/public/icons/icon-152x152.png create mode 100644 myteamwallet_frontend_modern/public/icons/icon-192x192.png create mode 100644 myteamwallet_frontend_modern/public/icons/icon-384x384.png create mode 100644 myteamwallet_frontend_modern/public/icons/icon-512x512.png create mode 100644 myteamwallet_frontend_modern/public/icons/icon-72x72.png create mode 100644 myteamwallet_frontend_modern/public/icons/icon-96x96.png create mode 100644 myteamwallet_frontend_modern/public/manifest.webmanifest create mode 100644 myteamwallet_frontend_modern/src/app/app.config.ts create mode 100644 myteamwallet_frontend_modern/src/app/app.html create mode 100644 myteamwallet_frontend_modern/src/app/app.routes.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/app.routes.ts create mode 100644 myteamwallet_frontend_modern/src/app/app.scss create mode 100644 myteamwallet_frontend_modern/src/app/app.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/app.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/auth/auth-api.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/auth/auth-api.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/auth/auth-guard.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/auth/auth-guard.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/auth/auth-store.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/auth/auth-store.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/auth/root-redirect-guard.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/auth/root-redirect-guard.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/http/auth-interceptor.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/http/auth-interceptor.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/http/error-interceptor.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/http/error-interceptor.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/layout/not-found/not-found.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/layout/not-found/not-found.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/layout/shell/shell.html create mode 100644 myteamwallet_frontend_modern/src/app/core/layout/shell/shell.scss create mode 100644 myteamwallet_frontend_modern/src/app/core/layout/shell/shell.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/layout/shell/shell.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/my-teams-store.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/my-teams-store.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/penalty-api.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/penalty-api.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/public-access-api.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/public-access-api.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/public-team-api.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/public-team-api.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/team-store.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/team-store.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/teams-api.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/teams-api.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/transactions-api.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/core/team/transactions-api.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/forgot-password/forgot-password.html create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/forgot-password/forgot-password.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/forgot-password/forgot-password.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/forgot-password/forgot-password.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/login/login.html create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/login/login.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/login/login.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/login/login.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/register/register.html create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/register/register.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/register/register.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/register/register.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/reset-password/reset-password.html create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/reset-password/reset-password.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/reset-password/reset-password.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/auth/reset-password/reset-password.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/public-team/public-player.html create mode 100644 myteamwallet_frontend_modern/src/app/features/public-team/public-player.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/public-team/public-player.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/public-team/public-player.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/public-team/public-team.html create mode 100644 myteamwallet_frontend_modern/src/app/features/public-team/public-team.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/public-team/public-team.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/public-team/public-team.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team-select/team-select.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team-select/team-select.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team-select/team-select.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team-select/team-select.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/cashbox/cashbox.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/cashbox/cashbox.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/cashbox/cashbox.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/cashbox/cashbox.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/cashbox/transaction-calculation.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/cashbox/transaction-calculation.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/members/members.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/members/members.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/members/members.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/members/members.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/members/player-detail.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/members/player-detail.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/members/player-detail.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/members/player-detail.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/invite/invite.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/invite/invite.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/invite/invite.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/invite/invite.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/more.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/more.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/more.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/more.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/penalties/penalties.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/penalties/penalties.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/penalties/penalties.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/penalties/penalties.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/profile/profile.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/profile/profile.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/profile/profile.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/profile/profile.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/public-access/public-access.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/public-access/public-access.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/public-access/public-access.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/more/public-access/public-access.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/overview/overview.html create mode 100644 myteamwallet_frontend_modern/src/app/features/team/overview/overview.scss create mode 100644 myteamwallet_frontend_modern/src/app/features/team/overview/overview.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/features/team/overview/overview.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/penalty.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/player.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/public-access.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/role.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/status.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/team-role.model.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/team-role.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/team.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/transaction-amount.spec.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/transaction-amount.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/transaction.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/models/user.model.ts create mode 100644 myteamwallet_frontend_modern/src/app/shared/confirm-dialog/confirm-dialog.ts create mode 100644 myteamwallet_frontend_modern/src/environments/environment.container.ts create mode 100644 myteamwallet_frontend_modern/src/environments/environment.development.ts create mode 100644 myteamwallet_frontend_modern/src/environments/environment.ts create mode 100644 myteamwallet_frontend_modern/src/index.html create mode 100644 myteamwallet_frontend_modern/src/main.ts create mode 100644 myteamwallet_frontend_modern/src/styles.scss create mode 100644 myteamwallet_frontend_modern/tsconfig.app.json create mode 100644 myteamwallet_frontend_modern/tsconfig.json create mode 100644 myteamwallet_frontend_modern/tsconfig.spec.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a3c36ec --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +myteamwallet_frontend/ +**/node_modules +**/dist +**/.angular +**/.git +**/coverage +**/.env +**/.vscode +**/.idea diff --git a/.env b/.env new file mode 100644 index 0000000..d784a5e --- /dev/null +++ b/.env @@ -0,0 +1,43 @@ +NODE_ENV=develop +APP_PORT=3999 +APP_NAME="NestJS API" +API_PREFIX=api +APP_FALLBACK_LANGUAGE=en +APP_HEADER_LANGUAGE=x-custom-lang +FRONTEND_DOMAIN=http://localhost:3000 +BACKEND_DOMAIN=http://localhost:3999 + +DATABASE_TYPE=mysql +DATABASE_HOST=localhost +DATABASE_PORT=3306 +DATABASE_USERNAME=teamwallet +DATABASE_PASSWORD=SYdktg804sEpwaBNsfjW8wje70clnju7LVgwGRVn +DATABASE_NAME=teamwallet +DATABASE_SYNCHRONIZE=true +DATABASE_MAX_CONNECTIONS=100 +DATABASE_SSL_ENABLED=false +DATABASE_REJECT_UNAUTHORIZED=false +DATABASE_CA= +DATABASE_KEY= +DATABASE_CERT= + +# Support "local", "s3" +FILE_DRIVER=local +ACCESS_KEY_ID= +SECRET_ACCESS_KEY= +AWS_S3_REGION= +AWS_DEFAULT_S3_BUCKET= + +MAIL_HOST=smtp.strato.de +MAIL_PORT=465 +MAIL_USER=accountservice@myteamwallet.de +MAIL_PASSWORD=HmQnnMZmw9aqwcolX5cSJjazhMEhT3Vve3v6wAxt +MAIL_IGNORE_TLS=true +MAIL_SECURE=true +MAIL_REQUIRE_TLS=false +MAIL_DEFAULT_EMAIL=accountservice@myteamwallet.de +MAIL_DEFAULT_NAME=accountservice@myteamwallet.de +MAIL_CLIENT_PORT=1080 + +AUTH_JWT_SECRET=this-is-onE-longer-secret +AUTH_JWT_TOKEN_EXPIRES_IN=100d diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..efc18b7 --- /dev/null +++ b/.env.example @@ -0,0 +1,57 @@ +NODE_ENV=production +APP_PORT=3999 +APP_NAME="NestJS API" +API_PREFIX=api +APP_FALLBACK_LANGUAGE=en +APP_HEADER_LANGUAGE=x-custom-lang +FRONTEND_DOMAIN=http://localhost:3999 +BACKEND_DOMAIN=http://localhost:3999 + +# External database - not part of this container +DATABASE_TYPE=mysql +DATABASE_HOST=change-me +DATABASE_PORT=3306 +DATABASE_USERNAME=change-me +DATABASE_PASSWORD=change-me +DATABASE_NAME=change-me +DATABASE_SYNCHRONIZE=false +DATABASE_MAX_CONNECTIONS=100 +DATABASE_SSL_ENABLED=false +DATABASE_REJECT_UNAUTHORIZED=false +DATABASE_CA= +DATABASE_KEY= +DATABASE_CERT= + +# Support "local", "s3" +FILE_DRIVER=local +ACCESS_KEY_ID= +SECRET_ACCESS_KEY= +AWS_S3_REGION= +AWS_DEFAULT_S3_BUCKET= + +MAIL_HOST=change-me +MAIL_PORT=465 +MAIL_USER=change-me +MAIL_PASSWORD=change-me +MAIL_IGNORE_TLS=true +MAIL_SECURE=true +MAIL_REQUIRE_TLS=false +MAIL_DEFAULT_EMAIL=noreply@example.com +MAIL_DEFAULT_NAME=Api +MAIL_CLIENT_PORT=1080 + +AUTH_JWT_SECRET=change-me +AUTH_JWT_TOKEN_EXPIRES_IN=100d + +FACEBOOK_APP_ID= +FACEBOOK_APP_SECRET= + +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= + +APPLE_APP_AUDIENCE=[] + +TWITTER_CONSUMER_KEY= +TWITTER_CONSUMER_SECRET= + +WORKER_HOST=redis://redis:6379/1 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..712b38e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +## Build the new Angular frontend (same-origin /api/v1/ base URL) +FROM node:22-alpine AS frontend-build +WORKDIR /app/frontend +COPY myteamwallet_frontend_modern/package.json myteamwallet_frontend_modern/package-lock.json ./ +RUN npm ci +COPY myteamwallet_frontend_modern/ ./ +RUN npm run build:container + +## Build the NestJS backend +FROM node:22-alpine AS backend-build +WORKDIR /app +ENV CI=true +COPY myteamwallet_backend/package.json myteamwallet_backend/package-lock.json ./ +RUN npm ci +COPY myteamwallet_backend/ ./ +RUN npm run build + +## Runtime image: backend + frontend static assets, external DB only +FROM node:22-alpine +WORKDIR /app +ENV CI=true + +RUN apk add --no-cache bash + +COPY myteamwallet_backend/package.json myteamwallet_backend/package-lock.json ./ +RUN npm ci +ENV NODE_ENV=production +COPY --from=backend-build /app/dist ./dist +COPY myteamwallet_backend/src ./src +COPY myteamwallet_backend/tsconfig.json ./tsconfig.json +COPY myteamwallet_backend/wait-for-it.sh ./wait-for-it.sh +COPY myteamwallet_backend/docker-entrypoint.sh ./docker-entrypoint.sh +RUN sed -i 's/\r$//' wait-for-it.sh docker-entrypoint.sh \ + && chmod +x wait-for-it.sh docker-entrypoint.sh + +COPY --from=frontend-build /app/frontend/dist/myteamwallet_frontend_modern/browser ./client + +EXPOSE 3999 + +ENTRYPOINT ["./docker-entrypoint.sh"] diff --git a/env-example b/env-example new file mode 100644 index 0000000..0d4f88f --- /dev/null +++ b/env-example @@ -0,0 +1,43 @@ +NODE_ENV=development +APP_PORT=3000 +APP_NAME="NestJS API" +API_PREFIX=api +APP_FALLBACK_LANGUAGE=en +APP_HEADER_LANGUAGE=x-custom-lang +FRONTEND_DOMAIN=http://localhost:3000 +BACKEND_DOMAIN=http://localhost:3000 + +DATABASE_TYPE=postgres +DATABASE_HOST=postgres +DATABASE_PORT=5432 +DATABASE_USERNAME=root +DATABASE_PASSWORD=secret +DATABASE_NAME=api +DATABASE_SYNCHRONIZE=false +DATABASE_MAX_CONNECTIONS=100 +DATABASE_SSL_ENABLED=false +DATABASE_REJECT_UNAUTHORIZED=false +DATABASE_CA= +DATABASE_KEY= +DATABASE_CERT= + +# Support "local", "s3" +FILE_DRIVER=local +ACCESS_KEY_ID= +SECRET_ACCESS_KEY= +AWS_S3_REGION= +AWS_DEFAULT_S3_BUCKET= + +MAIL_HOST=maildev +MAIL_PORT=1025 +MAIL_USER= +MAIL_PASSWORD= +MAIL_IGNORE_TLS=true +MAIL_SECURE=false +MAIL_REQUIRE_TLS=false +MAIL_DEFAULT_EMAIL=noreply@example.com +MAIL_DEFAULT_NAME=Api +MAIL_CLIENT_PORT=1080 + +AUTH_JWT_SECRET=secret +AUTH_JWT_TOKEN_EXPIRES_IN=1d diff --git a/myteamwallet_backend/.eslintrc.js b/myteamwallet_backend/.eslintrc.js new file mode 100644 index 0000000..06d31f5 --- /dev/null +++ b/myteamwallet_backend/.eslintrc.js @@ -0,0 +1,30 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': ['error'], + 'require-await': 'off', + '@typescript-eslint/require-await': 'error', + '@typescript-eslint/no-floating-promises': 'error', + }, +}; diff --git a/myteamwallet_backend/.gitignore b/myteamwallet_backend/.gitignore new file mode 100644 index 0000000..a83f498 --- /dev/null +++ b/myteamwallet_backend/.gitignore @@ -0,0 +1,41 @@ +# compiled output +/dist +/client +/node_modules + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +.data +/files +.env +/ormconfig.json \ No newline at end of file diff --git a/myteamwallet_backend/.husky/pre-commit b/myteamwallet_backend/.husky/pre-commit new file mode 100644 index 0000000..20d0d06 --- /dev/null +++ b/myteamwallet_backend/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run lint diff --git a/myteamwallet_backend/.prettierrc b/myteamwallet_backend/.prettierrc new file mode 100644 index 0000000..a20502b --- /dev/null +++ b/myteamwallet_backend/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} diff --git a/myteamwallet_backend/.vscode/settings.json b/myteamwallet_backend/.vscode/settings.json new file mode 100644 index 0000000..1f9a9a7 --- /dev/null +++ b/myteamwallet_backend/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "conventionalCommits.scopes": [ + "files", + "deploy", + "auth" + ] +} \ No newline at end of file diff --git a/myteamwallet_backend/Procfile b/myteamwallet_backend/Procfile new file mode 100644 index 0000000..2adfbab --- /dev/null +++ b/myteamwallet_backend/Procfile @@ -0,0 +1,2 @@ +web: npm run start:prod +release: echo '' > .env && npm run migration:run && npm run seed:run \ No newline at end of file diff --git a/myteamwallet_backend/README.md b/myteamwallet_backend/README.md new file mode 100644 index 0000000..6979358 --- /dev/null +++ b/myteamwallet_backend/README.md @@ -0,0 +1,141 @@ +# PROD System +Datenbank auf Server: teamwallet + +# NestJS REST API boilerplate 🇺🇦 +`ssh -L 3306:127.0.0.1:3306 bastian@h2979752.stratoserver.net` +## Description + +Seeden: npm run seed:run + +## Table of Contents + +- [Features](#features) +- [Quick run](#quick-run) +- [Comfortable development](#comfortable-development) +- [Links](#links) +- [Automatic update of dependencies](#automatic-update-of-dependencies) +- [Database utils](#database-utils) +- [Tests](#tests) + +## Features + +- [x] Database ([typeorm](https://www.npmjs.com/package/typeorm)). +- [x] Seeding. +- [x] Config Service ([@nestjs/config](https://www.npmjs.com/package/@nestjs/config)). +- [x] Mailing ([nodemailer](https://www.npmjs.com/package/nodemailer), [@nestjs-modules/mailer](https://www.npmjs.com/package/@nestjs-modules/mailer)). +- [x] Sign in and sign up via email. +- [x] Social sign in (Apple, Facebook, Google, Twitter). +- [x] Admin and User roles. +- [x] I18N ([nestjs-i18n](https://www.npmjs.com/package/nestjs-i18n)). +- [x] File uploads. Support local and Amazon S3 drivers. +- [x] Swagger. +- [x] E2E and units tests. +- [x] Docker. +- [x] CI (Github Actions). + +## Quick run + +```bash +git clone --depth 1 https://github.com/brocoders/nestjs-boilerplate.git my-app +cd my-app/ +cp env-example .env +docker compose up -d +``` + +For check status run + +```bash +docker compose logs +``` + +## Comfortable development + +```bash +git clone --depth 1 https://github.com/brocoders/nestjs-boilerplate.git my-app +cd my-app/ +cp env-example .env +``` + +Change `DATABASE_HOST=postgres` to `DATABASE_HOST=localhost` + +Change `MAIL_HOST=maildev` to `MAIL_HOST=localhost` + +Run additional container: + +```bash +docker compose up -d postgres adminer maildev redis +``` + +```bash +npm install + +npm run migration:run + +npm run seed:run + +npm run start:dev +``` + +## Links + +- Swagger: http://localhost:3000/docs +- Adminer (client for DB): http://localhost:8080 +- Maildev: http://localhost:1080 + +## Automatic update of dependencies + +If you want to automatically update dependencies, you can connect [Renovate](https://github.com/marketplace/renovate) for your project. + +## Database utils + +Generate migration + +```bash +npm run migration:generate -- src/database/migrations/CreateNameTable +``` + +Run migration + +```bash +npm run migration:run +``` + +Revert migration + +```bash +npm run migration:revert +``` + +Drop all tables in database + +```bash +npm run schema:drop +``` + +Run seed + +```bash +npm run seed:run +``` + +## Tests + +```bash +# unit tests +npm run test + +# e2e tests +npm run test:e2e +``` + +## Tests in Docker + +```bash +docker compose -f docker-compose.ci.yaml --env-file env-example -p ci up --build --exit-code-from api && docker compose -p ci rm -svf +``` + +## Test benchmarking + +```bash +docker run --rm jordi/ab -n 100 -c 100 -T application/json -H "Authorization: Bearer USER_TOKEN" -v 2 http://:3000/api/v1/users +``` diff --git a/myteamwallet_backend/docker-entrypoint.sh b/myteamwallet_backend/docker-entrypoint.sh new file mode 100644 index 0000000..00a7a68 --- /dev/null +++ b/myteamwallet_backend/docker-entrypoint.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -e + +echo "Waiting for database at ${DATABASE_HOST}:${DATABASE_PORT}..." +bash ./wait-for-it.sh "${DATABASE_HOST}:${DATABASE_PORT}" -t 60 + +echo "Running database migrations..." +# env-cmd (used by migration:run) requires an .env file to exist, even though +# the real config already arrived as process env vars via `docker run --env-file`. +touch .env +npm run migration:run + +echo "Starting application..." +exec node dist/main diff --git a/myteamwallet_backend/nest-cli.json b/myteamwallet_backend/nest-cli.json new file mode 100644 index 0000000..960099e --- /dev/null +++ b/myteamwallet_backend/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "assets": [{ "include": "i18n/**/*", "watchAssets": true }] + } +} diff --git a/myteamwallet_backend/package-lock.json b/myteamwallet_backend/package-lock.json new file mode 100644 index 0000000..832e3f6 --- /dev/null +++ b/myteamwallet_backend/package-lock.json @@ -0,0 +1,32362 @@ +{ + "name": "nestjs-boilerplate", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "nestjs-boilerplate", + "version": "0.0.1", + "hasInstallScript": true, + "license": "UNLICENSED", + "dependencies": { + "@nestjs-modules/mailer": "1.8.1", + "@nestjs/common": "9.1.6", + "@nestjs/config": "2.2.0", + "@nestjs/core": "9.1.6", + "@nestjs/jwt": "9.0.0", + "@nestjs/passport": "9.0.0", + "@nestjs/platform-express": "9.1.6", + "@nestjs/serve-static": "^3.0.0", + "@nestjs/swagger": "6.1.3", + "@nestjs/typeorm": "9.0.1", + "apple-signin-auth": "1.7.4", + "bcryptjs": "2.4.3", + "class-transformer": "0.5.1", + "class-validator": "0.13.2", + "fb": "2.0.0", + "google-auth-library": "8.7.0", + "handlebars": "4.7.7", + "multer": "1.4.4", + "multer-s3": "2.10.0", + "mysql2": "^2.3.3", + "nestjs-i18n": "9.2.2", + "nodemailer": "6.8.0", + "passport": "0.6.0", + "passport-anonymous": "1.0.1", + "passport-jwt": "4.0.0", + "pg": "8.8.0", + "reflect-metadata": "0.1.13", + "rimraf": "3.0.2", + "rxjs": "7.5.7", + "source-map-support": "0.5.21", + "swagger-ui-express": "4.5.0", + "twitter": "1.7.1", + "typeorm": "0.3.10" + }, + "devDependencies": { + "@faker-js/faker": "^7.6.0", + "@nestjs/cli": "9.1.5", + "@nestjs/schematics": "9.0.3", + "@nestjs/testing": "9.1.6", + "@types/bcryptjs": "2.4.2", + "@types/express": "4.17.14", + "@types/facebook-js-sdk": "3.3.6", + "@types/jest": "29.2.3", + "@types/multer": "1.4.7", + "@types/node": "16.18.3", + "@types/passport-anonymous": "1.0.3", + "@types/passport-jwt": "3.0.7", + "@types/supertest": "2.0.12", + "@types/twitter": "1.7.1", + "@typescript-eslint/eslint-plugin": "5.43.0", + "@typescript-eslint/parser": "5.43.0", + "aws-sdk": "2.1243.0", + "env-cmd": "10.1.0", + "eslint": "8.27.0", + "eslint-config-prettier": "8.5.0", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-prettier": "4.2.1", + "husky": "7.0.4", + "is-ci": "3.0.1", + "jest": "29.3.1", + "prettier": "2.7.1", + "supertest": "6.3.1", + "ts-jest": "29.0.1", + "ts-loader": "9.4.1", + "ts-node": "10.9.1", + "tsconfig-paths": "4.1.0", + "tslib": "2.4.1", + "typescript": "4.8.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.1.tgz", + "integrity": "sha512-lW8oNGuJqr4r31FWBjfWQYkSXdiOHBGOThIEtHvUVBKfPF/oVrupLueCUgBPel+NvxENXdo93uPsqHN7bZbmsQ==", + "dev": true, + "dependencies": { + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.1.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.15.0 || >=16.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/core/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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/@angular-devkit/core/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/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.1.tgz", + "integrity": "sha512-0U18FwDYt4zROBPrvewH6iBTkf2ozVHN4/gxUb9jWrqVw8mPU5AWc/iYxQLHBSinkr2Egjo1H/i9aBqgJSeh3g==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.2.1", + "jsonc-parser": "3.1.0", + "magic-string": "0.26.2", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-14.2.2.tgz", + "integrity": "sha512-timCty5tO1A5VOcy8nVJ+jL98i6+ct5/Hg+4rQxc3J6agmmNL9fALboJBEz1ckTt7MewlGtrpohMMy+YGhuWOg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.2.2", + "@angular-devkit/schematics": "14.2.2", + "ansi-colors": "4.1.3", + "inquirer": "8.2.4", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" + }, + "bin": { + "schematics": "bin/schematics.js" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@angular-devkit/core": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.2.tgz", + "integrity": "sha512-ofDhTmJqoAkmkJP0duwUaCxDBMxPlc+AWYwgs3rKKZeJBb0d+tchEXHXevD5bYbbRfXtnwM+Vye2XYHhA4nWAA==", + "dev": true, + "dependencies": { + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.1.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.15.0 || >=16.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-cli/node_modules/@angular-devkit/schematics": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.2.tgz", + "integrity": "sha512-90hseNg1yQ2AR+lVr/NByZRHnYAlzCL6hr9p9q1KPHxA3Owo04yX6n6dvR/xf27hCopXInXKPsasR59XCx5ZOQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.2.2", + "jsonc-parser": "3.1.0", + "magic-string": "0.26.2", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/node_modules/inquirer/node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "node_modules/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/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/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.17.tgz", + "integrity": "sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/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/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.17.tgz", + "integrity": "sha512-tNMDjcv/4DIcHxErTgwB9q2ZcYyN0sUfgGKUK/mm1FJK7Wz+KstoEekxrl/tBiNDgLK1HGi+sppj1An/1DR4fQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@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, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/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/@faker-js/faker": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", + "dev": true, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/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/@jest/console/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/@jest/console/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/@jest/console/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/@jest/console/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/console/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/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/@jest/console/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/@jest/core": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/reporters": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-resolve-dependencies": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "jest-watcher": "^29.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/core/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/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/@jest/core/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/@jest/environment": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/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/@jest/environment/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/@jest/environment/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/@jest/environment/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/@jest/environment/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/environment/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/@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dev": true, + "dependencies": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/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/@jest/fake-timers/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/@jest/fake-timers/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/@jest/fake-timers/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/@jest/fake-timers/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/fake-timers/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/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/@jest/fake-timers/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/@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/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/@jest/globals/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/@jest/globals/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/@jest/globals/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/@jest/globals/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/globals/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/@jest/reporters": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/test-result": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result/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/@jest/test-result/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/@jest/test-result/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/@jest/test-result/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/@jest/test-result/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/test-result/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/@jest/test-sequencer": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/transform/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/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/@jest/transform/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/@jest/types": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.3.tgz", + "integrity": "sha512-coBJmOQvurXjN1Hh5PzF7cmsod0zLIOXpP8KD161mqNlroMhLcwpODiEzi7ZsRl5Z/AIuxpeNm8DCl43F4kz8A==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/types/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/@jonkemp/package-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", + "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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.0.4", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz", + "integrity": "sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg==", + "devOptional": 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.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.10.tgz", + "integrity": "sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nestjs-modules/mailer": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@nestjs-modules/mailer/-/mailer-1.8.1.tgz", + "integrity": "sha512-rNlKzNB+Vr/aRDVcTibj2JCJQcTSE59EBQIpCwh/FkKg0Be1xoF3dQDZ4dmc9X1j396fkIBI5aQ5XAtJNPdxpw==", + "dependencies": { + "glob": "8.0.3", + "inline-css": "4.0.1", + "mjml": "^4.12.0", + "preview-email": "3.0.5" + }, + "optionalDependencies": { + "@types/ejs": "^3.0.3", + "@types/pug": "2.0.6", + "ejs": "^3.1.2", + "handlebars": "^4.7.6", + "pug": "^3.0.1" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.9 || ^8.0.0 || ^9.0.0", + "@nestjs/core": "^7.0.9 || ^8.0.0 || ^9.0.0", + "@types/ejs": "^3.0.3", + "@types/pug": "2.0.6", + "ejs": "^3.1.2", + "handlebars": "^4.7.6", + "nodemailer": "^6.4.6", + "pug": "^3.0.1" + } + }, + "node_modules/@nestjs-modules/mailer/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nestjs-modules/mailer/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs-modules/mailer/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nestjs/cli": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.1.5.tgz", + "integrity": "sha512-rSp26+Nv7PFtYrRSP18Gv5ZK8rRSc2SCCF5wh4SdZaVGgkxShpNq9YEfI+ik/uziN3KC5o74ppYRXGj+aHGVsA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.2.2", + "@angular-devkit/schematics": "14.2.2", + "@angular-devkit/schematics-cli": "14.2.2", + "@nestjs/schematics": "^9.0.0", + "chalk": "3.0.0", + "chokidar": "3.5.3", + "cli-table3": "0.6.2", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "7.2.13", + "inquirer": "7.3.3", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "os-name": "4.0.1", + "rimraf": "3.0.2", + "shelljs": "0.8.5", + "source-map-support": "0.5.21", + "tree-kill": "1.2.2", + "tsconfig-paths": "4.1.0", + "tsconfig-paths-webpack-plugin": "4.0.0", + "typescript": "4.8.4", + "webpack": "5.74.0", + "webpack-node-externals": "3.0.0" + }, + "bin": { + "nest": "bin/nest.js" + }, + "engines": { + "node": ">= 12.9.0" + } + }, + "node_modules/@nestjs/cli/node_modules/@angular-devkit/core": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.2.tgz", + "integrity": "sha512-ofDhTmJqoAkmkJP0duwUaCxDBMxPlc+AWYwgs3rKKZeJBb0d+tchEXHXevD5bYbbRfXtnwM+Vye2XYHhA4nWAA==", + "dev": true, + "dependencies": { + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.1.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.15.0 || >=16.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/@nestjs/cli/node_modules/@angular-devkit/schematics": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.2.tgz", + "integrity": "sha512-90hseNg1yQ2AR+lVr/NByZRHnYAlzCL6hr9p9q1KPHxA3Owo04yX6n6dvR/xf27hCopXInXKPsasR59XCx5ZOQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.2.2", + "jsonc-parser": "3.1.0", + "magic-string": "0.26.2", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@nestjs/cli/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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/@nestjs/cli/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/@nestjs/cli/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nestjs/cli/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/@nestjs/cli/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/@nestjs/cli/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/@nestjs/cli/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/@nestjs/cli/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@nestjs/cli/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/@nestjs/cli/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@nestjs/common": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.1.6.tgz", + "integrity": "sha512-9Ttk9va/BwEab36RSXLZdRoPUX3DZHUpzseKEfqHVhnaUIsIMt7lVd79GQ1FroQ2FZqoCwcLyBowevXhrE1Wnw==", + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.4.0", + "uuid": "9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "cache-manager": "<=5", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "cache-manager": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/common/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@nestjs/common/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@nestjs/config": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.2.0.tgz", + "integrity": "sha512-78Eg6oMbCy3D/YvqeiGBTOWei1Jwi3f2pSIZcZ1QxY67kYsJzTRTkwRT8Iv30DbK0sGKc1mcloDLD5UXgZAZtg==", + "dependencies": { + "dotenv": "16.0.1", + "dotenv-expand": "8.0.3", + "lodash": "4.17.21", + "uuid": "8.3.2" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^6.0.0 || ^7.2.0" + } + }, + "node_modules/@nestjs/core": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.1.6.tgz", + "integrity": "sha512-B52nYYTDSH72f1DU0G14NQSPCviXRE9fCp2/gUHuWIfVfBwcmVBAxVgyB/jAIUAhhj1f5/2odwUiw194xYtRRA==", + "hasInstallScript": true, + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "object-hash": "3.0.0", + "path-to-regexp": "3.2.0", + "tslib": "2.4.0", + "uuid": "9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/microservices": "^9.0.0", + "@nestjs/platform-express": "^9.0.0", + "@nestjs/websockets": "^9.0.0", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/core/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@nestjs/core/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@nestjs/jwt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-9.0.0.tgz", + "integrity": "sha512-ZsXGY/wMYKzEhymw2+dxiwrHTRKIKrGszx6r2EjQqNLypdXMQu0QrujwZJ8k3+XQV4snmuJwwNakQoA2ILfq8w==", + "dependencies": { + "@types/jsonwebtoken": "8.5.8", + "jsonwebtoken": "8.5.1" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0" + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.2.0.tgz", + "integrity": "sha512-NTFwPZkQWsArQH8QSyFWGZvJ08gR+R4TofglqZoihn/vU+ktHEJjMqsIsADwb7XD97DhiD+TVv5ac+jG33BHrg==", + "peerDependencies": { + "@nestjs/common": "^7.0.8 || ^8.0.0 || ^9.0.0", + "class-transformer": "^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0", + "class-validator": "^0.11.1 || ^0.12.0 || ^0.13.0", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/passport": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-9.0.0.tgz", + "integrity": "sha512-Gnh8n1wzFPOLSS/94X1sUP4IRAoXTgG4odl7/AO5h+uwscEGXxJFercrZfqdAwkWhqkKWbsntM3j5mRy/6ZQDA==", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0", + "passport": "^0.4.0 || ^0.5.0 || ^0.6.0" + } + }, + "node_modules/@nestjs/platform-express": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.1.6.tgz", + "integrity": "sha512-zZuB1g6yIPytPIzp0EYKWT+1d02hOQ5aU6VdtO6Qg0Wn1RjdjGh3kScsqdamMEjzt0WAfL8DjE5oqrLgvashsw==", + "dependencies": { + "body-parser": "1.20.1", + "cors": "2.8.5", + "express": "4.18.2", + "multer": "1.4.4-lts.1", + "tslib": "2.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/multer": { + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@nestjs/schematics": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.0.3.tgz", + "integrity": "sha512-kZrU/lrpVd2cnK8I3ibDb3Wi1ppl3wX3U3lVWoL+DzRRoezWKkh8upEL4q0koKmuXnsmLiu3UPxFeMOrJV7TSA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.2.1", + "@angular-devkit/schematics": "14.2.1", + "fs-extra": "10.1.0", + "jsonc-parser": "3.2.0", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": "^4.3.5" + } + }, + "node_modules/@nestjs/schematics/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/@nestjs/serve-static": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-3.0.0.tgz", + "integrity": "sha512-TpXjgs4136dQqWUjEcONqppqXDsrJhRkmKWzuBMOUAnP4HjHpNmlycvkHnDnWSoG2YD4a7Enh4ViYGWqCfHStA==", + "dependencies": { + "path-to-regexp": "0.2.5" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0" + } + }, + "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", + "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" + }, + "node_modules/@nestjs/swagger": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-6.1.3.tgz", + "integrity": "sha512-H9C/yRgLFb5QrAt6iGrYmIX9X7Q0zXkgZaTNUATljUBra+RCWrEUbLHBcGjTAOtcIyGV/vmyCLv68YSVcZoE0Q==", + "dependencies": { + "@nestjs/mapped-types": "1.2.0", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "4.15.1" + }, + "peerDependencies": { + "@fastify/static": "^6.0.0", + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + } + } + }, + "node_modules/@nestjs/swagger/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==" + }, + "node_modules/@nestjs/swagger/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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@nestjs/swagger/node_modules/swagger-ui-dist": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.15.1.tgz", + "integrity": "sha512-DlZARu6ckUFqDe0j5IPayO4k0gQvYQw9Un02MhxAgaMtVnTH2vmyyDe+yKeV0r1LiiPx3JbasdS/5Yyb/AV3iw==" + }, + "node_modules/@nestjs/testing": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.1.6.tgz", + "integrity": "sha512-3kdTgiv5DHRHMQ/befLWd/60LZWjOM2V+SwOLqGkITt1yjo+jpkDze8/f0ZXVGEa6pcWYZ5oeedbL2T1nyUKSQ==", + "dev": true, + "dependencies": { + "tslib": "2.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "@nestjs/microservices": "^9.0.0", + "@nestjs/platform-express": "^9.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nestjs/testing/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "node_modules/@nestjs/typeorm": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-9.0.1.tgz", + "integrity": "sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==", + "dependencies": { + "uuid": "8.3.2" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0", + "typeorm": "^0.3.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/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@nuxtjs/opencollective/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz", + "integrity": "sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==", + "dependencies": { + "domhandler": "^4.2.0", + "selderee": "^0.6.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/@selderee/plugin-htmlparser2/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.41.tgz", + "integrity": "sha512-TJCgQurls4FipFvHeC+gfAzb+GGstL0TDwYJKQVtTeSvJIznWzP7g3bAd5gEBlr8+bIxqnWS9VGVWREDhmE8jA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", + "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" + }, + "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==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "devOptional": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", + "dev": true + }, + "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/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true + }, + "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/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, + "node_modules/@types/ejs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.1.tgz", + "integrity": "sha512-RQul5wEfY7BjWm0sYY86cmUN/pcXWGyVxWX93DFFJvcrxax5zKlieLwA3T77xJGwNcZW0YW6CYG70p1m8xPFmA==", + "optional": true + }, + "node_modules/@types/eslint": { + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", + "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", + "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": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/facebook-js-sdk": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/facebook-js-sdk/-/facebook-js-sdk-3.3.6.tgz", + "integrity": "sha512-CxTLMVtZsgrj9Ven5Pn1vcFumCFs+CG8Jfc63xWq/8b9e6uWjGyZlMnvQk7lIVn97Zd1vpu0ZK/OFWAoap0RCw==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.2.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.3.tgz", + "integrity": "sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", + "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/passport": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.4.tgz", + "integrity": "sha512-h5OfAbfBBYSzjeU0GTuuqYEk9McTgWeGQql9g3gUw2/NNCfD7VgExVRYJVVeU13Twn202Mvk9BT0bUrl30sEgA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-anonymous": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/passport-anonymous/-/passport-anonymous-1.0.3.tgz", + "integrity": "sha512-unE2IivuYx6LUHlHokKMebx2TVi/YhqnnwM/Z3teGa/HTsRKgpD0PWrjpbw15ES8K8QNSCnRmXb/NpOyTem0tA==", + "dev": true, + "dependencies": { + "@types/passport": "*" + } + }, + "node_modules/@types/passport-jwt": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.7.tgz", + "integrity": "sha512-qRQ4qlww1Yhs3IaioDKrsDNmKy6gLDLgFsGwpCnc2YqWovO2Oxu9yCQdWHMJafQ7UIuOba4C4/TNXcGkQfEjlQ==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", + "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "optional": 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/request": { + "version": "2.48.5", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", + "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", + "dev": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/superagent": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz", + "integrity": "sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", + "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", + "dev": true + }, + "node_modules/@types/twitter": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@types/twitter/-/twitter-1.7.1.tgz", + "integrity": "sha512-i4lnx1l0AVG86jqHGiRwdmP2/IcgloEgtohFtrORSHmiiFhdsRzMl/P10CP4nqKiJnEdeU7loO0zva7wIWPY4w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/request": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz", + "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", + "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/type-utils": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/eslint-plugin/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/@typescript-eslint/parser": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", + "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/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/@typescript-eslint/parser/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/@typescript-eslint/scope-manager": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", + "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", + "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/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/@typescript-eslint/type-utils/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/@typescript-eslint/types": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", + "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", + "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", + "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", + "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "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/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accept-language-parser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/accept-language-parser/-/accept-language-parser-1.5.0.tgz", + "integrity": "sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "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/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "node_modules/apple-signin-auth": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/apple-signin-auth/-/apple-signin-auth-1.7.4.tgz", + "integrity": "sha512-gTIXCxzM2iRgq2/GOver4p4M4BwaBXUP0x3P323MSzPmqyOhuLuFEo2itgM25C21JYFGoSYpBlHkYw8eBJPu4g==", + "dependencies": { + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "node-rsa": "^1.1.1" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "optional": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1243.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1243.0.tgz", + "integrity": "sha512-EI/UrfbNMNULU9I6wsLRmnBK771LxLnhABGvcvNUrJ7evYkGsuOcBLgi2+J9Zdz0Epqlwu5vomxkNYRan434AQ==", + "dev": true, + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sdk/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/aws-sdk/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/aws-sdk/node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "node_modules/aws-sdk/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/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + }, + "node_modules/babel-jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.3.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/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/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/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/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/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/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==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "node_modules/bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "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==", + "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/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/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/bl/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/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist/node_modules/update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/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-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "dependencies": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "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/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "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.30001406", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001406.tgz", + "integrity": "sha512-bWTlaXUy/rq0BBtYShc/jArYfBPjEV95euvZ8JVtO43oQExEN/WquoqpufFjNu4kSpi5cy5kMbNvzztWDfv1Jg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "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/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio/node_modules/parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dependencies": { + "entities": "^4.3.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/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/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/class-validator": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", + "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", + "dependencies": { + "libphonenumber-js": "^1.9.43", + "validator": "^13.7.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "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-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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/cli-highlight/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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "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": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "node_modules/core-decorators": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/core-decorators/-/core-decorators-0.17.0.tgz", + "integrity": "sha1-P0MYCobSqwzFEGn0ah7D5J5869Y=" + }, + "node_modules/core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-rules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", + "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", + "dependencies": { + "cssom": "^0.5.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==", + "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==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", + "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/debug/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/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "dependencies": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "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==", + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", + "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/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==" + }, + "node_modules/editorconfig/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/editorconfig/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "optional": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.254", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", + "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-japanese": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.0.0.tgz", + "integrity": "sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==", + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dev": true, + "dependencies": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "bin": { + "env-cmd": "bin/env-cmd.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/env-cmd/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/env-cmd/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/env-cmd/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/env-cmd/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/env-cmd/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/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-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "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/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/eslint-scope/node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/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/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/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/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.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/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/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/expect/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/expect/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/expect/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/expect/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/expect/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/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/expect/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/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "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/extract-css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-3.0.0.tgz", + "integrity": "sha512-ZM2IuJkX79gys2PMN12yWrHvyK2sw1ReCdCtp/RAdgcFaBui+wY3Bsll9Em2LJXzKI8BYEBZLm2UczqyBCXSjQ==", + "dependencies": { + "batch": "^0.6.1", + "href-content": "^2.0.1", + "list-stylesheets": "^2.0.0", + "style-data": "^2.0.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb/-/fb-2.0.0.tgz", + "integrity": "sha1-kf1AMl2jTsQcaLJVMPw6Pg2s+mo=", + "dependencies": { + "any-promise": "^1.3.0", + "babel-runtime": "^6.23.0", + "core-decorators": "^0.17.0", + "debug": "^2.6.3", + "request": "^2.81.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fb/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/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/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "optional": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-util": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.9.tgz", + "integrity": "sha512-BOTMw/6rbbxVjv5JQvwgGMc2/6wWGd2VeyTvnzvvE49VRjS0tTxLbry/QVP1yPw8SaAOBYsnixmzruXoqjdUHA==" + }, + "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/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", + "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "vue-template-compiler": "*", + "webpack": "^5.11.0" + }, + "peerDependenciesMeta": { + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "dependencies": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/formidable/node_modules/qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.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==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.0.2.tgz", + "integrity": "sha512-TjtV2AJOZoMQqRYoy5eM8cCQogYwazWNYLQ72QB0kwa6vHHruYkGmhhyrlzbmgNHK1dNnuP2WSH81urfzyN2Og==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.0.1.tgz", + "integrity": "sha512-jiRJ+Fk7e8FH68Z6TLaqwea307OktJpDjmYnU7/li6ziwvVvU2RlrCyQo5vkdeP94chm0kcSCOOszvmuaioq3g==", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "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/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/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==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/get-uri/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==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-auth-library": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.7.0.tgz", + "integrity": "sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.0.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-auth-library/node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/google-auth-library/node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/google-auth-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-auth-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gtoken/node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/gtoken/node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/href-content": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.1.tgz", + "integrity": "sha512-5uiAmBCvzCFVu70kli3Hp0BONbAOfwGqR7jKolV+bAh174sIAZBL8DHfg5SnxAhId2mQmYgyL7Y62msnWJ34Xg==", + "dependencies": { + "remote-content": "^3.0.0" + } + }, + "node_modules/html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dependencies": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier/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==" + }, + "node_modules/html-to-text": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-8.2.0.tgz", + "integrity": "sha512-CLXExYn1b++Lgri+ZyVvbUEFwzkLZppjjZOwB7X1qv2jIi8MrMEvxWX5KQ7zATAzTvcqgmtO00M2kCRMtEdOKQ==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.6.0", + "deepmerge": "^4.2.2", + "he": "^1.2.0", + "htmlparser2": "^6.1.0", + "minimist": "^1.2.6", + "selderee": "^0.6.0" + }, + "bin": { + "html-to-text": "bin/cli.js" + }, + "engines": { + "node": ">=10.23.2" + } + }, + "node_modules/html-to-text/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/html-to-text/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/html-to-text/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/html-to-text/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/html-to-text/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-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==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/husky": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-css": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-4.0.1.tgz", + "integrity": "sha512-gzumhrp0waBLF5TtwQcm5bviA9ZNURXeNOs2xVSTsX60FWPFlrPJol4HI8yrozZ6V5udWKUT3LS2tMUDMMdi1Q==", + "dependencies": { + "cheerio": "^1.0.0-rc.10", + "css-rules": "^1.1.0", + "extract-css": "^3.0.0", + "flat-util": "^1.1.8", + "pick-util": "^1.1.4", + "slick": "^1.12.2", + "specificity": "^0.4.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.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/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "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/inquirer/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "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-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "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-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "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/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-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/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "optional": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/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==", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "optional": 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/jake/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==", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/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==", + "optional": true + }, + "node_modules/jake/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==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/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==", + "optional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "dev": true, + "dependencies": { + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/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/jest-circus/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/jest-circus/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/jest-circus/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/jest-circus/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-circus/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus/node_modules/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/jest-circus/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/jest-config": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.3.1", + "@jest/types": "^29.3.1", + "babel-jest": "^29.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.3.1", + "jest-environment-node": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/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/jest-config/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/jest-config/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/jest-config/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/jest-config/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-config/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/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/jest-config/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/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/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/jest-diff/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/jest-diff/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/jest-diff/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/jest-diff/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-diff/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/jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/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/jest-each/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/jest-each/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/jest-each/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/jest-each/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-each/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/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/jest-each/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/jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/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/jest-environment-node/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/jest-environment-node/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/jest-environment-node/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/jest-environment-node/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-environment-node/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/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/jest-environment-node/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/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/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/jest-haste-map/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/jest-haste-map/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/jest-haste-map/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/jest-haste-map/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/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/jest-haste-map/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/jest-haste-map/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/jest-leak-detector": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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-matcher-utils/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/jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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-message-util/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/jest-mock": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/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/jest-mock/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/jest-mock/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/jest-mock/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/jest-mock/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-mock/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/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/jest-mock/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/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/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/jest-resolve/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/jest-resolve/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/jest-resolve/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/jest-resolve/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-resolve/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/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/jest-resolve/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/jest-runner": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/environment": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-leak-detector": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-resolve": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-util": "^29.3.1", + "jest-watcher": "^29.3.1", + "jest-worker": "^29.3.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/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/jest-runner/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/jest-runner/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/jest-runner/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/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/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/jest-runner/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runner/node_modules/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/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "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/jest-runtime": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/globals": "^29.3.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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-runtime/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/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/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/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/jest-snapshot": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.3.1", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/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/jest-snapshot/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/jest-snapshot/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/jest-snapshot/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/jest-snapshot/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-snapshot/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/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/jest-snapshot/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/jest-util": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.3.tgz", + "integrity": "sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.0.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/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/jest-util/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/jest-util/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/jest-util/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/jest-util/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-util/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/jest-util/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/jest-validate": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/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/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/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/jest-validate/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/jest-validate/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/jest-validate/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-validate/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/jest-watcher": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.3.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-watcher/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-watcher/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/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/jest-watcher/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/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/jest/node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/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/jest/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/jest/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/jest/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/jest/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/node_modules/jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/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/jest/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/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-beautify": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.5.tgz", + "integrity": "sha512-P2BfZBhXchh10uZ87qMKpM2tfcDXLA+jDiWU/OV864yWdTGzLUGNAdp9Y1ID5ubpNVGls3cZ1UMcO8myUB+UyA==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.0.3", + "nopt": "^6.0.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "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-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "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": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/juice": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-7.0.0.tgz", + "integrity": "sha512-AjKQX31KKN+uJs+zaf+GW8mBO/f/0NqSh2moTMyvwBY+4/lXIYTU8D8I2h6BAV3Xnz6GGsbalUyFqbYMe+Vh+Q==", + "dependencies": { + "cheerio": "^1.0.0-rc.3", + "commander": "^5.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^5.0.0" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/juice/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libbase64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", + "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==" + }, + "node_modules/libmime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.1.0.tgz", + "integrity": "sha512-xOqorG21Va+3CjpFOfFTU7SWohHH2uIX9ZY4Byz6J+lvpfvc486tOAT/G9GfbrKtJ9O7NCX9o0aC2lxqbnZ9EA==", + "dependencies": { + "encoding-japanese": "2.0.0", + "iconv-lite": "0.6.3", + "libbase64": "1.2.1", + "libqp": "1.1.0" + } + }, + "node_modules/libmime/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.9.43", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.43.tgz", + "integrity": "sha512-tNB87ZutAiAkl3DE/Bo0Mxqn/XZbNxhPg4v9bYBwQQW4dlhBGqXl1vtmPxeDWbrijzwOA9vRjOOFm5V9SK/W3w==" + }, + "node_modules/libqp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha512-4Rgfa0hZpG++t1Vi2IiqXG9Ad1ig4QTmtuZF946QJP4bPqOYC78ixUXgz5TW/wE7lNaNKlplSYTxQ+fR2KZ0EA==" + }, + "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/linkify-it": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.0.tgz", + "integrity": "sha512-QAxkXyzT/TXgwGyY4rTgC95Ex6/lZ5/lYTV9nug6eJt93BCBQGOE47D/g2+/m5J1MrVLr2ot97OXkBZ9bBpR4A==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/list-stylesheets": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-2.0.0.tgz", + "integrity": "sha512-EMhWosVmqftbB3WZb4JWcS3tVj9rhBpkDqB87HaNdOi5gpFZNC+Od7hHPFSSlB99Qt/HxJZs8atINa/z672EDA==", + "dependencies": { + "cheerio": "1.0.0-rc.10", + "pick-util": "^1.1.4" + } + }, + "node_modules/list-stylesheets/node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/list-stylesheets/node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/list-stylesheets/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/list-stylesheets/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/list-stylesheets/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/list-stylesheets/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/list-stylesheets/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/list-stylesheets/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/list-stylesheets/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "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/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "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/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "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==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mailparser": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.5.0.tgz", + "integrity": "sha512-mdr2DFgz8LKC0/Q6io6znA0HVnzaPFT0a4TTnLeZ7mWHlkfnm227Wxlq7mHh7AgeP32h7gOUpXvyhSfJJIEeyg==", + "dependencies": { + "encoding-japanese": "2.0.0", + "he": "1.2.0", + "html-to-text": "8.2.0", + "iconv-lite": "0.6.3", + "libmime": "5.1.0", + "linkify-it": "4.0.0", + "mailsplit": "5.3.2", + "nodemailer": "6.7.3", + "tlds": "1.231.0" + } + }, + "node_modules/mailparser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mailparser/node_modules/nodemailer": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz", + "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/mailsplit": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-5.3.2.tgz", + "integrity": "sha512-coES12hhKqagkuBTJoqERX+y9bXNpxbxw3Esd07auuwKYmcagouVlgucyIVRp48fnswMKxcUtLoFn/L1a75ynQ==", + "dependencies": { + "libbase64": "1.2.1", + "libmime": "5.1.0", + "libqp": "1.1.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mediaquery-text": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", + "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", + "dependencies": { + "cssom": "^0.5.0" + } + }, + "node_modules/memfs": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.8.tgz", + "integrity": "sha512-E8QAFfd4csESWOqKIpN+khILPFSAZwPR9S+DO/5UtJNcuanF1jLZz0oWUAPF7xd2c1r6dGjGx+jH1st+MFWufA==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mjml": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml/-/mjml-4.13.0.tgz", + "integrity": "sha512-OnFKESouLshz8DPFSb6M/dE8GkhiJnoy6LAam5TiLA1anAj24yQ2ZH388LtQoEkvTisqwiTmc9ejDh5ctnFaJQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "mjml-cli": "4.13.0", + "mjml-core": "4.13.0", + "mjml-migrate": "4.13.0", + "mjml-preset-core": "4.13.0", + "mjml-validator": "4.13.0" + }, + "bin": { + "mjml": "bin/mjml" + } + }, + "node_modules/mjml-accordion": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-accordion/-/mjml-accordion-4.13.0.tgz", + "integrity": "sha512-E3yihZW5Oq2p+sWOcr8kWeRTROmiTYOGxB4IOxW/jTycdY07N3FX3e6vuh7Fv3rryHEUaydUQYto3ICVyctI7w==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-body": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-body/-/mjml-body-4.13.0.tgz", + "integrity": "sha512-S4HgwAuO9dEsyX9sr6WBf9/xr+H2ASVaLn22aurJm1S2Lvc1wifLPYBQgFmNdCjaesTCNtOMUDpG+Rbnavyaqg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-button": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-button/-/mjml-button-4.13.0.tgz", + "integrity": "sha512-3y8IAHCCxh7ESHh1aOOqobZKUgyNxOKAGQ9TlJoyaLpsKUFzkN8nmrD0KXF0ADSuzvhMZ1CdRIJuZ5mjv2TwWQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-carousel": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-carousel/-/mjml-carousel-4.13.0.tgz", + "integrity": "sha512-ORSY5bEYlMlrWSIKI/lN0Tz3uGltWAjG8DQl2Yr3pwjwOaIzGE+kozrDf+T9xItfiIIbvKajef1dg7B7XgP0zg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-cli": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-cli/-/mjml-cli-4.13.0.tgz", + "integrity": "sha512-kAZxpH0QqlTF/CcLzELgKw1ljKRxrmWJ310CJQhbPAxHvwQ/nIb+q82U+zRJAelRPPKjnOb+hSrMRqTgk9rH3w==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "chokidar": "^3.0.0", + "glob": "^7.1.1", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-migrate": "4.13.0", + "mjml-parser-xml": "4.13.0", + "mjml-validator": "4.13.0", + "yargs": "^16.1.0" + }, + "bin": { + "mjml-cli": "bin/mjml" + } + }, + "node_modules/mjml-cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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/mjml-cli/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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-column": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-column/-/mjml-column-4.13.0.tgz", + "integrity": "sha512-O8FrWKK/bCy9XpKxrKRYWNdgWNaVd4TK4RqMeVI/I70IbnYnc1uf15jnsPMxCBSbT+NyXyk8k7fn099797uwpw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-core/-/mjml-core-4.13.0.tgz", + "integrity": "sha512-kU5AoVTlZaXR/EDi3ix66xpzUe+kScYus71lBH/wo/B+LZW70GHE1AYWtsog5oJp1MuTHpMFTNuBD/wePeEgWg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "cheerio": "1.0.0-rc.10", + "detect-node": "2.0.4", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "juice": "^7.0.0", + "lodash": "^4.17.21", + "mjml-migrate": "4.13.0", + "mjml-parser-xml": "4.13.0", + "mjml-validator": "4.13.0" + } + }, + "node_modules/mjml-core/node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/mjml-core/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/mjml-core/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/mjml-core/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/mjml-divider": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-divider/-/mjml-divider-4.13.0.tgz", + "integrity": "sha512-ooPCwfmxEC+wJduqObYezMp7W5UCHjL9Y1LPB5FGna2FrOejgfd6Ix3ij8Wrmycmlol7E2N4D7c5NDH5DbRCJg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-group": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-group/-/mjml-group-4.13.0.tgz", + "integrity": "sha512-U7E8m8aaoAE/dMqjqXPjjrKcwO36B4cquAy9ASldECrIZJBcpFYO6eYf5yLXrNCUM2P0id8pgVjrUq23s00L7Q==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head/-/mjml-head-4.13.0.tgz", + "integrity": "sha512-sL2qQuoVALXBCiemu4DPo9geDr8DuUdXVJxm+4nd6k5jpLCfSDmFlNhgSsLPzsYn7VEac3/sxsjLtomQ+6/BHg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-attributes": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-attributes/-/mjml-head-attributes-4.13.0.tgz", + "integrity": "sha512-haggCafno+0lQylxJStkINCVCPMwfTpwE6yjCHeGOpQl/TkoNmjNkDr7DEEbNTZbt4Ekg070lQFn7clDy38EoA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-breakpoint": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-breakpoint/-/mjml-head-breakpoint-4.13.0.tgz", + "integrity": "sha512-D2iPDeUKQK1+rYSNa2HGOvgfPxZhNyndTG0iBEb/FxdGge2hbeDCZEN0mwDYE3wWB+qSBqlCuMI+Vr4pEjZbKg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-font": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-font/-/mjml-head-font-4.13.0.tgz", + "integrity": "sha512-mYn8aWnbrEap5vX2b4662hkUv6WifcYzYn++Yi6OHrJQi55LpzcU+myAGpfQEXXrpU8vGwExMTFKsJq5n2Kaow==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-html-attributes": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-html-attributes/-/mjml-head-html-attributes-4.13.0.tgz", + "integrity": "sha512-m30Oro297+18Zou/1qYjagtmCOWtYXeoS38OABQ5zOSzMItE3TcZI9JNcOueIIWIyFCETe8StrTAKcQ2GHwsDw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-preview": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-preview/-/mjml-head-preview-4.13.0.tgz", + "integrity": "sha512-v0K/NocjFCbaoF/0IMVNmiqov91HxqT07vNTEl0Bt9lKFrTKVC01m1S4K7AB78T/bEeJ/HwmNjr1+TMtVNGGow==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-style": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-style/-/mjml-head-style-4.13.0.tgz", + "integrity": "sha512-tBa33GL9Atn5bAM2UwE+uxv4rI29WgX/e5lXX+5GWlsb4thmiN6rxpFTNqBqWbBNRbZk4UEZF78M7Da8xC1ZGQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-title": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-title/-/mjml-head-title-4.13.0.tgz", + "integrity": "sha512-Mq0bjuZXJlwxfVcjuYihQcigZSDTKeQaG3nORR1D0jsOH2BXU4XgUK1UOcTXn2qCBIfRoIMq7rfzYs+L0CRhdw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-hero": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-hero/-/mjml-hero-4.13.0.tgz", + "integrity": "sha512-aWEOScdrhyjwdKBWG4XQaElRHP8LU5PtktkpMeBXa4yxrxNs25qRnDqMNkjSrnnmFKWZmQ166tfboY6RBNf0UA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-image": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-image/-/mjml-image-4.13.0.tgz", + "integrity": "sha512-agMmm2wRZTIrKwrUnYFlnAbtrKYSP0R2en+Vf92HPspAwmaw3/AeOW/QxmSiMhfGf+xsEJyzVvR/nd33jbT3sg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-migrate": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-migrate/-/mjml-migrate-4.13.0.tgz", + "integrity": "sha512-I1euHiAyNpaz+B5vH+Z4T+hg/YtI5p3PqQ3/zTLv8gi24V6BILjTaftWhH5+3R/gQkQhH0NUaWNnRmds+Mq5DQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-parser-xml": "4.13.0", + "yargs": "^16.1.0" + }, + "bin": { + "migrate": "lib/cli.js" + } + }, + "node_modules/mjml-migrate/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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/mjml-migrate/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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-navbar": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-navbar/-/mjml-navbar-4.13.0.tgz", + "integrity": "sha512-0Oqyyk+OdtXfsjswRb/7Ql1UOjN4MbqFPKoyltJqtj+11MRpF5+Wjd74Dj9H7l81GFwkIB9OaP+ZMiD+TPECgg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-parser-xml": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-parser-xml/-/mjml-parser-xml-4.13.0.tgz", + "integrity": "sha512-phljtI8DaW++q0aybR/Ykv9zCyP/jCFypxVNo26r2IQo//VYXyc7JuLZZT8N/LAI8lZcwbTVxQPBzJTmZ5IfwQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "detect-node": "2.0.4", + "htmlparser2": "^4.1.0", + "lodash": "^4.17.15" + } + }, + "node_modules/mjml-parser-xml/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/mjml-preset-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-preset-core/-/mjml-preset-core-4.13.0.tgz", + "integrity": "sha512-gxzYaKkvUrHuzT1oqjEPSDtdmgEnN99Hf5f1r2CR5aMOB1x66EA3T8ATvF1o7qrBTVV4KMVlQem3IubMSYJZRw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "mjml-accordion": "4.13.0", + "mjml-body": "4.13.0", + "mjml-button": "4.13.0", + "mjml-carousel": "4.13.0", + "mjml-column": "4.13.0", + "mjml-divider": "4.13.0", + "mjml-group": "4.13.0", + "mjml-head": "4.13.0", + "mjml-head-attributes": "4.13.0", + "mjml-head-breakpoint": "4.13.0", + "mjml-head-font": "4.13.0", + "mjml-head-html-attributes": "4.13.0", + "mjml-head-preview": "4.13.0", + "mjml-head-style": "4.13.0", + "mjml-head-title": "4.13.0", + "mjml-hero": "4.13.0", + "mjml-image": "4.13.0", + "mjml-navbar": "4.13.0", + "mjml-raw": "4.13.0", + "mjml-section": "4.13.0", + "mjml-social": "4.13.0", + "mjml-spacer": "4.13.0", + "mjml-table": "4.13.0", + "mjml-text": "4.13.0", + "mjml-wrapper": "4.13.0" + } + }, + "node_modules/mjml-raw": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-raw/-/mjml-raw-4.13.0.tgz", + "integrity": "sha512-JbBYxwX1a/zbqnCrlDCRNqov2xqUrMCaEdTHfqE2athj479aQXvLKFM20LilTMaClp/dR0yfvFLfFVrC5ej4FQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-section": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-section/-/mjml-section-4.13.0.tgz", + "integrity": "sha512-BLcqlhavtRakKtzDQPLv6Ae4Jt4imYWq/P0jo+Sjk7tP4QifgVA2KEQOirPK5ZUqw/lvK7Afhcths5rXZ2ItnQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-social": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-social/-/mjml-social-4.13.0.tgz", + "integrity": "sha512-zL2a7Wwsk8OXF0Bqu+1B3La1UPwdTMcEXptO8zdh2V5LL6Xb7Gfyvx6w0CmmBtG5IjyCtqaKy5wtrcpG9Hvjfg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-spacer": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-spacer/-/mjml-spacer-4.13.0.tgz", + "integrity": "sha512-Acw4QJ0MJ38W4IewXuMX7hLaW1BZaln+gEEuTfrv0xwPdTxX1ILqz4r+s9mYMxYkIDLWMCjBvXyQK6aWlid13A==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-table": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-table/-/mjml-table-4.13.0.tgz", + "integrity": "sha512-UAWPVMaGReQhf776DFdiwdcJTIHTek3zzQ1pb+E7VlypEYgIpFvdUJ39UIiiflhqtdBATmHwKBOtePwU0MzFMg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-text": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-text/-/mjml-text-4.13.0.tgz", + "integrity": "sha512-uDuraaQFdu+6xfuigCimbeznnOnJfwRdcCL1lTBTusTuEvW/5Va6m2D3mnMeEpl+bp4+cxesXIz9st6A9pcg5A==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-validator": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-validator/-/mjml-validator-4.13.0.tgz", + "integrity": "sha512-uURYfyQYtHJ6Qz/1A7/+E9ezfcoISoLZhYK3olsxKRViwaA2Mm8gy/J3yggZXnsUXWUns7Qymycm5LglLEIiQg==", + "dependencies": { + "@babel/runtime": "^7.14.6" + } + }, + "node_modules/mjml-wrapper": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-wrapper/-/mjml-wrapper-4.13.0.tgz", + "integrity": "sha512-p/44JvHg04rAFR7QDImg8nZucEokIjFH6KJMHxsO0frJtLZ+IuakctzlZAADHsqiR52BwocDsXSa+o9SE2l6Ng==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-section": "4.13.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moo": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/multer": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", + "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "deprecated": "Multer 1.x is affected by CVE-2022-24434. This is fixed in v1.4.4-lts.1 which drops support for versions of Node.js before 6. Please upgrade to at least Node.js 6 and version 1.4.4-lts.1 of Multer. If you need support for older versions of Node.js, we are open to accepting patches that would fix the CVE on the main 1.x release line, whilst maintaining compatibility with Node.js 0.10.", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/multer-s3": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/multer-s3/-/multer-s3-2.10.0.tgz", + "integrity": "sha512-RZsiqG19C9gE82lB7v8duJ+TMIf70fWYHlIwuNcsanOH1ePBoPXZvboEQxEow9jUkk7WQsuyVA2TgriOuDrVrw==", + "dependencies": { + "file-type": "^3.3.0", + "html-comment-regex": "^1.1.2", + "run-parallel": "^1.1.6" + } + }, + "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/mysql2": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", + "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "dependencies": { + "denque": "^2.0.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mysql2/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "dependencies": { + "lru-cache": "^4.1.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/named-placeholders/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, + "node_modules/nearley/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==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nestjs-i18n": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/nestjs-i18n/-/nestjs-i18n-9.2.2.tgz", + "integrity": "sha512-GxwDonBnW7MbwuUxF9IHINm0vYhVQUqUnDLxDHPzavs2T2qMDrf/muyqXc9QFIs0v16ElSKz5+aBDZK4nUrgpw==", + "dependencies": { + "accept-language-parser": "^1.5.0", + "chokidar": "^3.5.3", + "cookie": "^0.5.0", + "iterare": "^1.2.1", + "js-yaml": "^4.1.0", + "string-format": "^2.0.0" + }, + "peerDependencies": { + "@nestjs/common": "*", + "@nestjs/core": "*", + "class-validator": "~0.13", + "rxjs": "*" + } + }, + "node_modules/nestjs-i18n/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==" + }, + "node_modules/nestjs-i18n/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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-abort-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", + "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", + "dev": true + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/node-rsa": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz", + "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==", + "dependencies": { + "asn1": "^0.2.4" + } + }, + "node_modules/nodemailer": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.8.0.tgz", + "integrity": "sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "dependencies": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "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/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "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/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseley": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.7.0.tgz", + "integrity": "sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw==", + "dependencies": { + "moo": "^0.5.1", + "nearley": "^2.20.1" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-anonymous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/passport-anonymous/-/passport-anonymous-1.0.1.tgz", + "integrity": "sha1-JB43J07ETft/bK0jS0HEODhrwRc=", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-jwt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", + "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", + "dependencies": { + "jsonwebtoken": "^8.2.0", + "passport-strategy": "^1.0.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "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==" + }, + "node_modules/path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + }, + "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/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/pick-util": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", + "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", + "dependencies": { + "@jonkemp/package-utils": "^1.0.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.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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/pkg-dir/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/pkg-dir/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/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/preview-email": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/preview-email/-/preview-email-3.0.5.tgz", + "integrity": "sha512-q37jdkVw+wic0o/7xYhOTBS4kF0WX3two0OepmR1Fhxp9NTpO3rJTccAjQm95gJx/2Wa/Nv98sr9pXIQ77/foA==", + "deprecated": "Please upgrade to v3.0.7+ as we have added iOS Simulator support to previewing emails! See and screenshots at .", + "dependencies": { + "dayjs": "^1.10.6", + "debug": "^4.3.2", + "mailparser": "^3.3.0", + "nodemailer": "^6.6.3", + "open": "7", + "pug": "^3.0.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/preview-email/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/preview-email/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "dependencies": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" + }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remote-content": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-3.0.0.tgz", + "integrity": "sha512-/hjCYVqWY/jYR07ptEJpClnYrGedSQ5AxCrEeMb3NlrxTgUK/7+iCOReE3z1QMYm3UL7sJX3o7cww/NC6UgyhA==", + "dependencies": { + "proxy-from-env": "^1.1.0", + "superagent": "^7.0.2", + "superagent-proxy": "^3.0.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "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/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-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/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/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/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "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/selderee": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.6.0.tgz", + "integrity": "sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg==", + "dependencies": { + "parseley": "^0.7.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + }, + "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "engines": { + "node": "*" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/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-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "bin": { + "specificity": "bin/specificity" + } + }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-data/-/style-data-2.0.0.tgz", + "integrity": "sha512-8RJ+MnHlwFUrf3B3gUjs9KIrOk0TppHHwfIHfBd6QjYmZcuzN1OGqeMkWA3ZnD6GiRWJjCVouY/l11v4rlfnPA==", + "dependencies": { + "cheerio": "^1.0.0-rc.10", + "mediaquery-text": "^1.2.0", + "pick-util": "^1.1.4" + } + }, + "node_modules/superagent": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.5.tgz", + "integrity": "sha512-HQYyGuDRFGmZ6GNC4hq2f37KnsY9Lr0/R1marNZTgMweVDQLTLJJ6DGQ9Tj/xVVs5HEnop9EMmTbywb5P30aqw==", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "^2.5.0", + "qs": "^6.10.3", + "readable-stream": "^3.6.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", + "dependencies": { + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "superagent": ">= 0.15.4 || 1 || 2 || 3" + } + }, + "node_modules/superagent-proxy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent-proxy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/superagent/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/superagent/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/supertest": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.1.tgz", + "integrity": "sha512-hRohNeIfk/cA48Cxpa/w48hktP6ZaRqXb0QV5rLvW0C7paRsBU3Q5zydzYrslOJtj/gd48qx540jKtcs6vG1fQ==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.3" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supertest/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/supertest/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/supertest/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/supertest/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/supertest/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/supertest/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/supertest/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/supertest/node_modules/superagent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.3.tgz", + "integrity": "sha512-oBC+aNsCjzzjmO5AOPBPFS+Z7HPzlx+DQr/aHwM08kI+R24gsDmAS1LMfza1fK+P+SKlTAoNZpOvooE/pRO1HA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/supertest/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/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-ui-dist": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.13.2.tgz", + "integrity": "sha512-jHL6UyIYpvEI7NsuWd0R3hJaPQTg6Oo4qSBo+oVfOEkv6rrQm/475RGSMmZgV6ajp+Sgrp9CqrDjQYAgQqiv1A==" + }, + "node_modules/swagger-ui-express": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.5.0.tgz", + "integrity": "sha512-DHk3zFvsxrkcnurGvQlAcLuTDacAVN1JHKDgcba/gr2NFRE4HGwP1YeHIXMiGznkWR4AeS7X5vEblNn4QljuNA==", + "dependencies": { + "swagger-ui-dist": ">=4.11.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0" + } + }, + "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/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/terser": { + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "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.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "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/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-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/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/tlds": { + "version": "1.231.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.231.0.tgz", + "integrity": "sha512-L7UQwueHSkGxZHQBXHVmXW64oi+uqNtzFt2x6Ssk7NVnpIbw16CRs4eb/jmKOZ9t2JnqZ/b3Cfvo97lnXqKrhw==", + "bin": { + "tlds": "bin.js" + } + }, + "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/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" + }, + "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/ts-jest": { + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.1.tgz", + "integrity": "sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-loader": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz", + "integrity": "sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==", + "dev": true, + "dependencies": { + "json5": "^2.2.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/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/tsconfig-paths-webpack-plugin/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/tsconfig-paths-webpack-plugin/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/tsconfig-paths-webpack-plugin/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/tsconfig-paths-webpack-plugin/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/tsconfig-paths-webpack-plugin/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/tsconfig-paths/node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/twitter": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/twitter/-/twitter-1.7.1.tgz", + "integrity": "sha1-B2I3jx3BwFDkj2ZqypBOJLGpYvQ=", + "dependencies": { + "deep-extend": "^0.5.0", + "request": "^2.72.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typeorm": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.10.tgz", + "integrity": "sha512-VMKiM84EpJQ+Mz9xDIPqnfplWhyUy1d8ccaKdMY9obifxJOTFnv8GYVyPsGwG8Lk7Nb8MlttHyHWENGAhBA3WA==", + "dependencies": { + "@sqltools/formatter": "^1.2.2", + "app-root-path": "^3.0.0", + "buffer": "^6.0.3", + "chalk": "^4.1.0", + "cli-highlight": "^2.1.11", + "date-fns": "^2.28.0", + "debug": "^4.3.3", + "dotenv": "^16.0.0", + "glob": "^7.2.0", + "js-yaml": "^4.1.0", + "mkdirp": "^1.0.4", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.3.1", + "uuid": "^8.3.2", + "xml2js": "^0.4.23", + "yargs": "^17.3.1" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">= 12.9.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^3.6.0", + "mssql": "^7.3.0", + "mysql2": "^2.2.5", + "oracledb": "^5.1.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/typeorm/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==" + }, + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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.2.1" + } + }, + "node_modules/typeorm/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/typeorm/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/typeorm/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/typeorm/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/typeorm/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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/typeorm/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typeorm/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/typeorm/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/typeorm/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/typeorm/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/uglify-js": { + "version": "3.12.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.8.tgz", + "integrity": "sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/v8-to-istanbul/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/valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vm2": { + "version": "3.9.11", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.11.tgz", + "integrity": "sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg==", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-resource-inliner": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-5.0.0.tgz", + "integrity": "sha512-AIihwH+ZmdHfkJm7BjSXiEClVt4zUFqX4YlFAzjL13wLtDuUneSaFvDBTbdYRecs35SiU7iNKbMnN+++wVfb6A==", + "dependencies": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^4.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "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.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "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-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "dependencies": { + "execa": "^4.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "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==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "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==", + "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==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "engines": { + "node": "*" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "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==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dependencies": { + "cliui": "^7.0.2", + "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.0.0" + }, + "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/yargs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/yargs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/yargs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/yargs/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==", + "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/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@angular-devkit/core": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.1.tgz", + "integrity": "sha512-lW8oNGuJqr4r31FWBjfWQYkSXdiOHBGOThIEtHvUVBKfPF/oVrupLueCUgBPel+NvxENXdo93uPsqHN7bZbmsQ==", + "dev": true, + "requires": { + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.1.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.1.tgz", + "integrity": "sha512-0U18FwDYt4zROBPrvewH6iBTkf2ozVHN4/gxUb9jWrqVw8mPU5AWc/iYxQLHBSinkr2Egjo1H/i9aBqgJSeh3g==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.2.1", + "jsonc-parser": "3.1.0", + "magic-string": "0.26.2", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics-cli": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-14.2.2.tgz", + "integrity": "sha512-timCty5tO1A5VOcy8nVJ+jL98i6+ct5/Hg+4rQxc3J6agmmNL9fALboJBEz1ckTt7MewlGtrpohMMy+YGhuWOg==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.2.2", + "@angular-devkit/schematics": "14.2.2", + "ansi-colors": "4.1.3", + "inquirer": "8.2.4", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.2.tgz", + "integrity": "sha512-ofDhTmJqoAkmkJP0duwUaCxDBMxPlc+AWYwgs3rKKZeJBb0d+tchEXHXevD5bYbbRfXtnwM+Vye2XYHhA4nWAA==", + "dev": true, + "requires": { + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.1.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + } + }, + "@angular-devkit/schematics": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.2.tgz", + "integrity": "sha512-90hseNg1yQ2AR+lVr/NByZRHnYAlzCL6hr9p9q1KPHxA3Owo04yX6n6dvR/xf27hCopXInXKPsasR59XCx5ZOQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.2.2", + "jsonc-parser": "3.1.0", + "magic-string": "0.26.2", + "ora": "5.4.1", + "rxjs": "6.6.7" + } + }, + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true + }, + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "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 + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.17.tgz", + "integrity": "sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg==" + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-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, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/types": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.17.tgz", + "integrity": "sha512-tNMDjcv/4DIcHxErTgwB9q2ZcYyN0sUfgGKUK/mm1FJK7Wz+KstoEekxrl/tBiNDgLK1HGi+sppj1An/1DR4fQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@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, + "optional": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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 + } + } + }, + "@faker-js/faker": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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, + "requires": { + "p-locate": "^4.1.0" + } + }, + "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, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/reporters": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-resolve-dependencies": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "jest-watcher": "^29.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dev": true, + "requires": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + } + }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/fake-timers": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/reporters": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + } + } + }, + "@jest/test-result": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/test-sequencer": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "dev": true, + "requires": { + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.0.3.tgz", + "integrity": "sha512-coBJmOQvurXjN1Hh5PzF7cmsod0zLIOXpP8KD161mqNlroMhLcwpODiEzi7ZsRl5Z/AIuxpeNm8DCl43F4kz8A==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jonkemp/package-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", + "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==" + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz", + "integrity": "sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg==", + "devOptional": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.10.tgz", + "integrity": "sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg==", + "devOptional": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nestjs-modules/mailer": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@nestjs-modules/mailer/-/mailer-1.8.1.tgz", + "integrity": "sha512-rNlKzNB+Vr/aRDVcTibj2JCJQcTSE59EBQIpCwh/FkKg0Be1xoF3dQDZ4dmc9X1j396fkIBI5aQ5XAtJNPdxpw==", + "requires": { + "@types/ejs": "^3.0.3", + "@types/pug": "2.0.6", + "ejs": "^3.1.2", + "glob": "8.0.3", + "handlebars": "^4.7.6", + "inline-css": "4.0.1", + "mjml": "^4.12.0", + "preview-email": "3.0.5", + "pug": "^3.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@nestjs/cli": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.1.5.tgz", + "integrity": "sha512-rSp26+Nv7PFtYrRSP18Gv5ZK8rRSc2SCCF5wh4SdZaVGgkxShpNq9YEfI+ik/uziN3KC5o74ppYRXGj+aHGVsA==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.2.2", + "@angular-devkit/schematics": "14.2.2", + "@angular-devkit/schematics-cli": "14.2.2", + "@nestjs/schematics": "^9.0.0", + "chalk": "3.0.0", + "chokidar": "3.5.3", + "cli-table3": "0.6.2", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "7.2.13", + "inquirer": "7.3.3", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "os-name": "4.0.1", + "rimraf": "3.0.2", + "shelljs": "0.8.5", + "source-map-support": "0.5.21", + "tree-kill": "1.2.2", + "tsconfig-paths": "4.1.0", + "tsconfig-paths-webpack-plugin": "4.0.0", + "typescript": "4.8.4", + "webpack": "5.74.0", + "webpack-node-externals": "3.0.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.2.tgz", + "integrity": "sha512-ofDhTmJqoAkmkJP0duwUaCxDBMxPlc+AWYwgs3rKKZeJBb0d+tchEXHXevD5bYbbRfXtnwM+Vye2XYHhA4nWAA==", + "dev": true, + "requires": { + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.1.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + } + }, + "@angular-devkit/schematics": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.2.tgz", + "integrity": "sha512-90hseNg1yQ2AR+lVr/NByZRHnYAlzCL6hr9p9q1KPHxA3Owo04yX6n6dvR/xf27hCopXInXKPsasR59XCx5ZOQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.2.2", + "jsonc-parser": "3.1.0", + "magic-string": "0.26.2", + "ora": "5.4.1", + "rxjs": "6.6.7" + } + }, + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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 + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@nestjs/common": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.1.6.tgz", + "integrity": "sha512-9Ttk9va/BwEab36RSXLZdRoPUX3DZHUpzseKEfqHVhnaUIsIMt7lVd79GQ1FroQ2FZqoCwcLyBowevXhrE1Wnw==", + "requires": { + "iterare": "1.2.1", + "tslib": "2.4.0", + "uuid": "9.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, + "@nestjs/config": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.2.0.tgz", + "integrity": "sha512-78Eg6oMbCy3D/YvqeiGBTOWei1Jwi3f2pSIZcZ1QxY67kYsJzTRTkwRT8Iv30DbK0sGKc1mcloDLD5UXgZAZtg==", + "requires": { + "dotenv": "16.0.1", + "dotenv-expand": "8.0.3", + "lodash": "4.17.21", + "uuid": "8.3.2" + } + }, + "@nestjs/core": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.1.6.tgz", + "integrity": "sha512-B52nYYTDSH72f1DU0G14NQSPCviXRE9fCp2/gUHuWIfVfBwcmVBAxVgyB/jAIUAhhj1f5/2odwUiw194xYtRRA==", + "requires": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "object-hash": "3.0.0", + "path-to-regexp": "3.2.0", + "tslib": "2.4.0", + "uuid": "9.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, + "@nestjs/jwt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-9.0.0.tgz", + "integrity": "sha512-ZsXGY/wMYKzEhymw2+dxiwrHTRKIKrGszx6r2EjQqNLypdXMQu0QrujwZJ8k3+XQV4snmuJwwNakQoA2ILfq8w==", + "requires": { + "@types/jsonwebtoken": "8.5.8", + "jsonwebtoken": "8.5.1" + } + }, + "@nestjs/mapped-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.2.0.tgz", + "integrity": "sha512-NTFwPZkQWsArQH8QSyFWGZvJ08gR+R4TofglqZoihn/vU+ktHEJjMqsIsADwb7XD97DhiD+TVv5ac+jG33BHrg==", + "requires": {} + }, + "@nestjs/passport": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-9.0.0.tgz", + "integrity": "sha512-Gnh8n1wzFPOLSS/94X1sUP4IRAoXTgG4odl7/AO5h+uwscEGXxJFercrZfqdAwkWhqkKWbsntM3j5mRy/6ZQDA==", + "requires": {} + }, + "@nestjs/platform-express": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.1.6.tgz", + "integrity": "sha512-zZuB1g6yIPytPIzp0EYKWT+1d02hOQ5aU6VdtO6Qg0Wn1RjdjGh3kScsqdamMEjzt0WAfL8DjE5oqrLgvashsw==", + "requires": { + "body-parser": "1.20.1", + "cors": "2.8.5", + "express": "4.18.2", + "multer": "1.4.4-lts.1", + "tslib": "2.4.0" + }, + "dependencies": { + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "multer": { + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "@nestjs/schematics": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.0.3.tgz", + "integrity": "sha512-kZrU/lrpVd2cnK8I3ibDb3Wi1ppl3wX3U3lVWoL+DzRRoezWKkh8upEL4q0koKmuXnsmLiu3UPxFeMOrJV7TSA==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.2.1", + "@angular-devkit/schematics": "14.2.1", + "fs-extra": "10.1.0", + "jsonc-parser": "3.2.0", + "pluralize": "8.0.0" + }, + "dependencies": { + "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 + } + } + }, + "@nestjs/serve-static": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-3.0.0.tgz", + "integrity": "sha512-TpXjgs4136dQqWUjEcONqppqXDsrJhRkmKWzuBMOUAnP4HjHpNmlycvkHnDnWSoG2YD4a7Enh4ViYGWqCfHStA==", + "requires": { + "path-to-regexp": "0.2.5" + }, + "dependencies": { + "path-to-regexp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", + "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" + } + } + }, + "@nestjs/swagger": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-6.1.3.tgz", + "integrity": "sha512-H9C/yRgLFb5QrAt6iGrYmIX9X7Q0zXkgZaTNUATljUBra+RCWrEUbLHBcGjTAOtcIyGV/vmyCLv68YSVcZoE0Q==", + "requires": { + "@nestjs/mapped-types": "1.2.0", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "4.15.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "swagger-ui-dist": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.15.1.tgz", + "integrity": "sha512-DlZARu6ckUFqDe0j5IPayO4k0gQvYQw9Un02MhxAgaMtVnTH2vmyyDe+yKeV0r1LiiPx3JbasdS/5Yyb/AV3iw==" + } + } + }, + "@nestjs/testing": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.1.6.tgz", + "integrity": "sha512-3kdTgiv5DHRHMQ/befLWd/60LZWjOM2V+SwOLqGkITt1yjo+jpkDze8/f0ZXVGEa6pcWYZ5oeedbL2T1nyUKSQ==", + "dev": true, + "requires": { + "tslib": "2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, + "@nestjs/typeorm": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-9.0.1.tgz", + "integrity": "sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==", + "requires": { + "uuid": "8.3.2" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "requires": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@selderee/plugin-htmlparser2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz", + "integrity": "sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==", + "requires": { + "domhandler": "^4.2.0", + "selderee": "^0.6.0" + }, + "dependencies": { + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "@sinclair/typebox": { + "version": "0.24.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.41.tgz", + "integrity": "sha512-TJCgQurls4FipFvHeC+gfAzb+GGstL0TDwYJKQVtTeSvJIznWzP7g3bAd5gEBlr8+bIxqnWS9VGVWREDhmE8jA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sqltools/formatter": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", + "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "devOptional": true + }, + "@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/bcryptjs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", + "dev": true + }, + "@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, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, + "@types/ejs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.1.tgz", + "integrity": "sha512-RQul5wEfY7BjWm0sYY86cmUN/pcXWGyVxWX93DFFJvcrxax5zKlieLwA3T77xJGwNcZW0YW6CYG70p1m8xPFmA==", + "optional": true + }, + "@types/eslint": { + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", + "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@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, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/facebook-js-sdk": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/facebook-js-sdk/-/facebook-js-sdk-3.3.6.tgz", + "integrity": "sha512-CxTLMVtZsgrj9Ven5Pn1vcFumCFs+CG8Jfc63xWq/8b9e6uWjGyZlMnvQk7lIVn97Zd1vpu0ZK/OFWAoap0RCw==", + "dev": true + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.2.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.3.tgz", + "integrity": "sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/jsonwebtoken": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", + "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", + "requires": { + "@types/node": "*" + } + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/passport": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.4.tgz", + "integrity": "sha512-h5OfAbfBBYSzjeU0GTuuqYEk9McTgWeGQql9g3gUw2/NNCfD7VgExVRYJVVeU13Twn202Mvk9BT0bUrl30sEgA==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/passport-anonymous": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/passport-anonymous/-/passport-anonymous-1.0.3.tgz", + "integrity": "sha512-unE2IivuYx6LUHlHokKMebx2TVi/YhqnnwM/Z3teGa/HTsRKgpD0PWrjpbw15ES8K8QNSCnRmXb/NpOyTem0tA==", + "dev": true, + "requires": { + "@types/passport": "*" + } + }, + "@types/passport-jwt": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.7.tgz", + "integrity": "sha512-qRQ4qlww1Yhs3IaioDKrsDNmKy6gLDLgFsGwpCnc2YqWovO2Oxu9yCQdWHMJafQ7UIuOba4C4/TNXcGkQfEjlQ==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "@types/passport-strategy": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", + "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "optional": true + }, + "@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 + }, + "@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 + }, + "@types/request": { + "version": "2.48.5", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", + "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", + "dev": true, + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/superagent": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz", + "integrity": "sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "requires": { + "@types/superagent": "*" + } + }, + "@types/tough-cookie": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", + "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", + "dev": true + }, + "@types/twitter": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@types/twitter/-/twitter-1.7.1.tgz", + "integrity": "sha512-i4lnx1l0AVG86jqHGiRwdmP2/IcgloEgtohFtrORSHmiiFhdsRzMl/P10CP4nqKiJnEdeU7loO0zva7wIWPY4w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/request": "*" + } + }, + "@types/yargs": { + "version": "17.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz", + "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", + "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/type-utils": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "@typescript-eslint/parser": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", + "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", + "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", + "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "@typescript-eslint/types": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", + "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", + "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "@typescript-eslint/utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", + "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", + "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accept-language-parser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/accept-language-parser/-/accept-language-parser-1.5.0.tgz", + "integrity": "sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } + } + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "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==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "apple-signin-auth": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/apple-signin-auth/-/apple-signin-auth-1.7.4.tgz", + "integrity": "sha512-gTIXCxzM2iRgq2/GOver4p4M4BwaBXUP0x3P323MSzPmqyOhuLuFEo2itgM25C21JYFGoSYpBlHkYw8eBJPu4g==", + "requires": { + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "node-rsa": "^1.1.1" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "requires": { + "tslib": "^2.0.1" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "aws-sdk": { + "version": "2.1243.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1243.0.tgz", + "integrity": "sha512-EI/UrfbNMNULU9I6wsLRmnBK771LxLnhABGvcvNUrJ7evYkGsuOcBLgi2+J9Zdz0Epqlwu5vomxkNYRan434AQ==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.4.19" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + }, + "babel-jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "dev": true, + "requires": { + "@jest/transform": "^29.3.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "requires": { + "@babel/types": "^7.9.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "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==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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 + }, + "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, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "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==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "dependencies": { + "update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + } + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001406", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001406.tgz", + "integrity": "sha512-bWTlaXUy/rq0BBtYShc/jArYfBPjEV95euvZ8JVtO43oQExEN/WquoqpufFjNu4kSpi5cy5kMbNvzztWDfv1Jg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "requires": { + "is-regex": "^1.0.3" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "dependencies": { + "parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "requires": { + "entities": "^4.3.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + } + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "class-validator": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", + "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", + "requires": { + "libphonenumber-js": "^1.9.43", + "validator": "^13.7.0" + } + }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "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" + } + }, + "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==" + } + } + }, + "cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true + }, + "cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "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 + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-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, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "requires": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "core-decorators": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/core-decorators/-/core-decorators-0.17.0.tgz", + "integrity": "sha1-P0MYCobSqwzFEGn0ah7D5J5869Y=" + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-rules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", + "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", + "requires": { + "cssom": "^0.5.0" + } + }, + "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==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" + }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, + "dayjs": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", + "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + }, + "dependencies": { + "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 + } + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true + }, + "diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "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==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "dotenv": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", + "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==" + }, + "dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "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==" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "optional": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.254", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", + "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "encoding-japanese": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.0.0.tgz", + "integrity": "sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" + }, + "env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dev": true, + "requires": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "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 + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "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, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "dependencies": { + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + } + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "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 + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "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 + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "eslint-module-utils": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + } + }, + "eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "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==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "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==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "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, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extract-css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-3.0.0.tgz", + "integrity": "sha512-ZM2IuJkX79gys2PMN12yWrHvyK2sw1ReCdCtp/RAdgcFaBui+wY3Bsll9Em2LJXzKI8BYEBZLm2UczqyBCXSjQ==", + "requires": { + "batch": "^0.6.1", + "href-content": "^2.0.1", + "list-stylesheets": "^2.0.0", + "style-data": "^2.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "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==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb/-/fb-2.0.0.tgz", + "integrity": "sha1-kf1AMl2jTsQcaLJVMPw6Pg2s+mo=", + "requires": { + "any-promise": "^1.3.0", + "babel-runtime": "^6.23.0", + "core-decorators": "^0.17.0", + "debug": "^2.6.3", + "request": "^2.81.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==" + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "optional": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "optional": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "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==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flat-util": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.9.tgz", + "integrity": "sha512-BOTMw/6rbbxVjv5JQvwgGMc2/6wWGd2VeyTvnzvvE49VRjS0tTxLbry/QVP1yPw8SaAOBYsnixmzruXoqjdUHA==" + }, + "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 + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", + "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "requires": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" + }, + "dependencies": { + "qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==" + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gaxios": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.0.2.tgz", + "integrity": "sha512-TjtV2AJOZoMQqRYoy5eM8cCQogYwazWNYLQ72QB0kwa6vHHruYkGmhhyrlzbmgNHK1dNnuP2WSH81urfzyN2Og==", + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.7" + } + }, + "gcp-metadata": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.0.1.tgz", + "integrity": "sha512-jiRJ+Fk7e8FH68Z6TLaqwea307OktJpDjmYnU7/li6ziwvVvU2RlrCyQo5vkdeP94chm0kcSCOOszvmuaioq3g==", + "requires": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-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 + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "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==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "google-auth-library": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.7.0.tgz", + "integrity": "sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.0.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "requires": { + "node-forge": "^1.3.1" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "requires": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "dependencies": { + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, + "href-content": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.1.tgz", + "integrity": "sha512-5uiAmBCvzCFVu70kli3Hp0BONbAOfwGqR7jKolV+bAh174sIAZBL8DHfg5SnxAhId2mQmYgyL7Y62msnWJ34Xg==", + "requires": { + "remote-content": "^3.0.0" + } + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "requires": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "dependencies": { + "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==" + } + } + }, + "html-to-text": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-8.2.0.tgz", + "integrity": "sha512-CLXExYn1b++Lgri+ZyVvbUEFwzkLZppjjZOwB7X1qv2jIi8MrMEvxWX5KQ7zATAzTvcqgmtO00M2kCRMtEdOKQ==", + "requires": { + "@selderee/plugin-htmlparser2": "^0.6.0", + "deepmerge": "^4.2.2", + "he": "^1.2.0", + "htmlparser2": "^6.1.0", + "minimist": "^1.2.6", + "selderee": "^0.6.0" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + } + } + }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "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==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-css": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-4.0.1.tgz", + "integrity": "sha512-gzumhrp0waBLF5TtwQcm5bviA9ZNURXeNOs2xVSTsX60FWPFlrPJol4HI8yrozZ6V5udWKUT3LS2tMUDMMdi1Q==", + "requires": { + "cheerio": "^1.0.0-rc.10", + "css-rules": "^1.1.0", + "extract-css": "^3.0.0", + "flat-util": "^1.1.8", + "pick-util": "^1.1.4", + "slick": "^1.12.2", + "specificity": "^0.4.1" + } + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "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==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "requires": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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 + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "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 + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "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 + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "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 + } + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "optional": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "optional": true + }, + "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==", + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "dev": true, + "requires": { + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "dev": true, + "requires": { + "@jest/core": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.3.1", + "@jest/types": "^29.3.1", + "babel-jest": "^29.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.3.1", + "jest-environment-node": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true + }, + "jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true + }, + "jest-resolve": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "dev": true, + "requires": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" + } + }, + "jest-runner": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/environment": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-leak-detector": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-resolve": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-util": "^29.3.1", + "jest-watcher": "^29.3.1", + "jest-worker": "^29.3.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/globals": "^29.3.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-snapshot": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.3.1", + "semver": "^7.3.5" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.0.3.tgz", + "integrity": "sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ==", + "dev": true, + "requires": { + "@jest/types": "^29.0.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "dev": true, + "requires": { + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.3.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true + }, + "js-beautify": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.5.tgz", + "integrity": "sha512-P2BfZBhXchh10uZ87qMKpM2tfcDXLA+jDiWU/OV864yWdTGzLUGNAdp9Y1ID5ubpNVGls3cZ1UMcO8myUB+UyA==", + "requires": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.0.3", + "nopt": "^6.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + }, + "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 + }, + "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, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "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 + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "requires": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "juice": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-7.0.0.tgz", + "integrity": "sha512-AjKQX31KKN+uJs+zaf+GW8mBO/f/0NqSh2moTMyvwBY+4/lXIYTU8D8I2h6BAV3Xnz6GGsbalUyFqbYMe+Vh+Q==", + "requires": { + "cheerio": "^1.0.0-rc.3", + "commander": "^5.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^5.0.0" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libbase64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", + "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==" + }, + "libmime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.1.0.tgz", + "integrity": "sha512-xOqorG21Va+3CjpFOfFTU7SWohHH2uIX9ZY4Byz6J+lvpfvc486tOAT/G9GfbrKtJ9O7NCX9o0aC2lxqbnZ9EA==", + "requires": { + "encoding-japanese": "2.0.0", + "iconv-lite": "0.6.3", + "libbase64": "1.2.1", + "libqp": "1.1.0" + }, + "dependencies": { + "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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "libphonenumber-js": { + "version": "1.9.43", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.43.tgz", + "integrity": "sha512-tNB87ZutAiAkl3DE/Bo0Mxqn/XZbNxhPg4v9bYBwQQW4dlhBGqXl1vtmPxeDWbrijzwOA9vRjOOFm5V9SK/W3w==" + }, + "libqp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha512-4Rgfa0hZpG++t1Vi2IiqXG9Ad1ig4QTmtuZF946QJP4bPqOYC78ixUXgz5TW/wE7lNaNKlplSYTxQ+fR2KZ0EA==" + }, + "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 + }, + "linkify-it": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.0.tgz", + "integrity": "sha512-QAxkXyzT/TXgwGyY4rTgC95Ex6/lZ5/lYTV9nug6eJt93BCBQGOE47D/g2+/m5J1MrVLr2ot97OXkBZ9bBpR4A==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "list-stylesheets": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-2.0.0.tgz", + "integrity": "sha512-EMhWosVmqftbB3WZb4JWcS3tVj9rhBpkDqB87HaNdOi5gpFZNC+Od7hHPFSSlB99Qt/HxJZs8atINa/z672EDA==", + "requires": { + "cheerio": "1.0.0-rc.10", + "pick-util": "^1.1.4" + }, + "dependencies": { + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "requires": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + } + }, + "cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "requires": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + } + } + }, + "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 + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "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, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "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==", + "requires": { + "yallist": "^3.0.2" + } + }, + "macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true + }, + "magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "mailparser": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.5.0.tgz", + "integrity": "sha512-mdr2DFgz8LKC0/Q6io6znA0HVnzaPFT0a4TTnLeZ7mWHlkfnm227Wxlq7mHh7AgeP32h7gOUpXvyhSfJJIEeyg==", + "requires": { + "encoding-japanese": "2.0.0", + "he": "1.2.0", + "html-to-text": "8.2.0", + "iconv-lite": "0.6.3", + "libmime": "5.1.0", + "linkify-it": "4.0.0", + "mailsplit": "5.3.2", + "nodemailer": "6.7.3", + "tlds": "1.231.0" + }, + "dependencies": { + "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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "nodemailer": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz", + "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==" + } + } + }, + "mailsplit": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-5.3.2.tgz", + "integrity": "sha512-coES12hhKqagkuBTJoqERX+y9bXNpxbxw3Esd07auuwKYmcagouVlgucyIVRp48fnswMKxcUtLoFn/L1a75ynQ==", + "requires": { + "libbase64": "1.2.1", + "libmime": "5.1.0", + "libqp": "1.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mediaquery-text": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", + "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", + "requires": { + "cssom": "^0.5.0" + } + }, + "memfs": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.8.tgz", + "integrity": "sha512-E8QAFfd4csESWOqKIpN+khILPFSAZwPR9S+DO/5UtJNcuanF1jLZz0oWUAPF7xd2c1r6dGjGx+jH1st+MFWufA==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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 + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "dependencies": { + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "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 + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mjml": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml/-/mjml-4.13.0.tgz", + "integrity": "sha512-OnFKESouLshz8DPFSb6M/dE8GkhiJnoy6LAam5TiLA1anAj24yQ2ZH388LtQoEkvTisqwiTmc9ejDh5ctnFaJQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "mjml-cli": "4.13.0", + "mjml-core": "4.13.0", + "mjml-migrate": "4.13.0", + "mjml-preset-core": "4.13.0", + "mjml-validator": "4.13.0" + } + }, + "mjml-accordion": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-accordion/-/mjml-accordion-4.13.0.tgz", + "integrity": "sha512-E3yihZW5Oq2p+sWOcr8kWeRTROmiTYOGxB4IOxW/jTycdY07N3FX3e6vuh7Fv3rryHEUaydUQYto3ICVyctI7w==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-body": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-body/-/mjml-body-4.13.0.tgz", + "integrity": "sha512-S4HgwAuO9dEsyX9sr6WBf9/xr+H2ASVaLn22aurJm1S2Lvc1wifLPYBQgFmNdCjaesTCNtOMUDpG+Rbnavyaqg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-button": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-button/-/mjml-button-4.13.0.tgz", + "integrity": "sha512-3y8IAHCCxh7ESHh1aOOqobZKUgyNxOKAGQ9TlJoyaLpsKUFzkN8nmrD0KXF0ADSuzvhMZ1CdRIJuZ5mjv2TwWQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-carousel": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-carousel/-/mjml-carousel-4.13.0.tgz", + "integrity": "sha512-ORSY5bEYlMlrWSIKI/lN0Tz3uGltWAjG8DQl2Yr3pwjwOaIzGE+kozrDf+T9xItfiIIbvKajef1dg7B7XgP0zg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-cli": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-cli/-/mjml-cli-4.13.0.tgz", + "integrity": "sha512-kAZxpH0QqlTF/CcLzELgKw1ljKRxrmWJ310CJQhbPAxHvwQ/nIb+q82U+zRJAelRPPKjnOb+hSrMRqTgk9rH3w==", + "requires": { + "@babel/runtime": "^7.14.6", + "chokidar": "^3.0.0", + "glob": "^7.1.1", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-migrate": "4.13.0", + "mjml-parser-xml": "4.13.0", + "mjml-validator": "4.13.0", + "yargs": "^16.1.0" + }, + "dependencies": { + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "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" + } + }, + "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==" + } + } + }, + "mjml-column": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-column/-/mjml-column-4.13.0.tgz", + "integrity": "sha512-O8FrWKK/bCy9XpKxrKRYWNdgWNaVd4TK4RqMeVI/I70IbnYnc1uf15jnsPMxCBSbT+NyXyk8k7fn099797uwpw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-core/-/mjml-core-4.13.0.tgz", + "integrity": "sha512-kU5AoVTlZaXR/EDi3ix66xpzUe+kScYus71lBH/wo/B+LZW70GHE1AYWtsog5oJp1MuTHpMFTNuBD/wePeEgWg==", + "requires": { + "@babel/runtime": "^7.14.6", + "cheerio": "1.0.0-rc.10", + "detect-node": "2.0.4", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "juice": "^7.0.0", + "lodash": "^4.17.21", + "mjml-migrate": "4.13.0", + "mjml-parser-xml": "4.13.0", + "mjml-validator": "4.13.0" + }, + "dependencies": { + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "requires": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + } + }, + "cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "requires": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + } + } + }, + "mjml-divider": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-divider/-/mjml-divider-4.13.0.tgz", + "integrity": "sha512-ooPCwfmxEC+wJduqObYezMp7W5UCHjL9Y1LPB5FGna2FrOejgfd6Ix3ij8Wrmycmlol7E2N4D7c5NDH5DbRCJg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-group": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-group/-/mjml-group-4.13.0.tgz", + "integrity": "sha512-U7E8m8aaoAE/dMqjqXPjjrKcwO36B4cquAy9ASldECrIZJBcpFYO6eYf5yLXrNCUM2P0id8pgVjrUq23s00L7Q==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-head": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head/-/mjml-head-4.13.0.tgz", + "integrity": "sha512-sL2qQuoVALXBCiemu4DPo9geDr8DuUdXVJxm+4nd6k5jpLCfSDmFlNhgSsLPzsYn7VEac3/sxsjLtomQ+6/BHg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-head-attributes": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-attributes/-/mjml-head-attributes-4.13.0.tgz", + "integrity": "sha512-haggCafno+0lQylxJStkINCVCPMwfTpwE6yjCHeGOpQl/TkoNmjNkDr7DEEbNTZbt4Ekg070lQFn7clDy38EoA==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-head-breakpoint": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-breakpoint/-/mjml-head-breakpoint-4.13.0.tgz", + "integrity": "sha512-D2iPDeUKQK1+rYSNa2HGOvgfPxZhNyndTG0iBEb/FxdGge2hbeDCZEN0mwDYE3wWB+qSBqlCuMI+Vr4pEjZbKg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-head-font": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-font/-/mjml-head-font-4.13.0.tgz", + "integrity": "sha512-mYn8aWnbrEap5vX2b4662hkUv6WifcYzYn++Yi6OHrJQi55LpzcU+myAGpfQEXXrpU8vGwExMTFKsJq5n2Kaow==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-head-html-attributes": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-html-attributes/-/mjml-head-html-attributes-4.13.0.tgz", + "integrity": "sha512-m30Oro297+18Zou/1qYjagtmCOWtYXeoS38OABQ5zOSzMItE3TcZI9JNcOueIIWIyFCETe8StrTAKcQ2GHwsDw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-head-preview": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-preview/-/mjml-head-preview-4.13.0.tgz", + "integrity": "sha512-v0K/NocjFCbaoF/0IMVNmiqov91HxqT07vNTEl0Bt9lKFrTKVC01m1S4K7AB78T/bEeJ/HwmNjr1+TMtVNGGow==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-head-style": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-style/-/mjml-head-style-4.13.0.tgz", + "integrity": "sha512-tBa33GL9Atn5bAM2UwE+uxv4rI29WgX/e5lXX+5GWlsb4thmiN6rxpFTNqBqWbBNRbZk4UEZF78M7Da8xC1ZGQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-head-title": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-title/-/mjml-head-title-4.13.0.tgz", + "integrity": "sha512-Mq0bjuZXJlwxfVcjuYihQcigZSDTKeQaG3nORR1D0jsOH2BXU4XgUK1UOcTXn2qCBIfRoIMq7rfzYs+L0CRhdw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-hero": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-hero/-/mjml-hero-4.13.0.tgz", + "integrity": "sha512-aWEOScdrhyjwdKBWG4XQaElRHP8LU5PtktkpMeBXa4yxrxNs25qRnDqMNkjSrnnmFKWZmQ166tfboY6RBNf0UA==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-image": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-image/-/mjml-image-4.13.0.tgz", + "integrity": "sha512-agMmm2wRZTIrKwrUnYFlnAbtrKYSP0R2en+Vf92HPspAwmaw3/AeOW/QxmSiMhfGf+xsEJyzVvR/nd33jbT3sg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-migrate": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-migrate/-/mjml-migrate-4.13.0.tgz", + "integrity": "sha512-I1euHiAyNpaz+B5vH+Z4T+hg/YtI5p3PqQ3/zTLv8gi24V6BILjTaftWhH5+3R/gQkQhH0NUaWNnRmds+Mq5DQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-parser-xml": "4.13.0", + "yargs": "^16.1.0" + }, + "dependencies": { + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "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" + } + }, + "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==" + } + } + }, + "mjml-navbar": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-navbar/-/mjml-navbar-4.13.0.tgz", + "integrity": "sha512-0Oqyyk+OdtXfsjswRb/7Ql1UOjN4MbqFPKoyltJqtj+11MRpF5+Wjd74Dj9H7l81GFwkIB9OaP+ZMiD+TPECgg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-parser-xml": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-parser-xml/-/mjml-parser-xml-4.13.0.tgz", + "integrity": "sha512-phljtI8DaW++q0aybR/Ykv9zCyP/jCFypxVNo26r2IQo//VYXyc7JuLZZT8N/LAI8lZcwbTVxQPBzJTmZ5IfwQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "detect-node": "2.0.4", + "htmlparser2": "^4.1.0", + "lodash": "^4.17.15" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "dependencies": { + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + } + } + }, + "mjml-preset-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-preset-core/-/mjml-preset-core-4.13.0.tgz", + "integrity": "sha512-gxzYaKkvUrHuzT1oqjEPSDtdmgEnN99Hf5f1r2CR5aMOB1x66EA3T8ATvF1o7qrBTVV4KMVlQem3IubMSYJZRw==", + "requires": { + "@babel/runtime": "^7.14.6", + "mjml-accordion": "4.13.0", + "mjml-body": "4.13.0", + "mjml-button": "4.13.0", + "mjml-carousel": "4.13.0", + "mjml-column": "4.13.0", + "mjml-divider": "4.13.0", + "mjml-group": "4.13.0", + "mjml-head": "4.13.0", + "mjml-head-attributes": "4.13.0", + "mjml-head-breakpoint": "4.13.0", + "mjml-head-font": "4.13.0", + "mjml-head-html-attributes": "4.13.0", + "mjml-head-preview": "4.13.0", + "mjml-head-style": "4.13.0", + "mjml-head-title": "4.13.0", + "mjml-hero": "4.13.0", + "mjml-image": "4.13.0", + "mjml-navbar": "4.13.0", + "mjml-raw": "4.13.0", + "mjml-section": "4.13.0", + "mjml-social": "4.13.0", + "mjml-spacer": "4.13.0", + "mjml-table": "4.13.0", + "mjml-text": "4.13.0", + "mjml-wrapper": "4.13.0" + } + }, + "mjml-raw": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-raw/-/mjml-raw-4.13.0.tgz", + "integrity": "sha512-JbBYxwX1a/zbqnCrlDCRNqov2xqUrMCaEdTHfqE2athj479aQXvLKFM20LilTMaClp/dR0yfvFLfFVrC5ej4FQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-section": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-section/-/mjml-section-4.13.0.tgz", + "integrity": "sha512-BLcqlhavtRakKtzDQPLv6Ae4Jt4imYWq/P0jo+Sjk7tP4QifgVA2KEQOirPK5ZUqw/lvK7Afhcths5rXZ2ItnQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-social": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-social/-/mjml-social-4.13.0.tgz", + "integrity": "sha512-zL2a7Wwsk8OXF0Bqu+1B3La1UPwdTMcEXptO8zdh2V5LL6Xb7Gfyvx6w0CmmBtG5IjyCtqaKy5wtrcpG9Hvjfg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-spacer": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-spacer/-/mjml-spacer-4.13.0.tgz", + "integrity": "sha512-Acw4QJ0MJ38W4IewXuMX7hLaW1BZaln+gEEuTfrv0xwPdTxX1ILqz4r+s9mYMxYkIDLWMCjBvXyQK6aWlid13A==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-table": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-table/-/mjml-table-4.13.0.tgz", + "integrity": "sha512-UAWPVMaGReQhf776DFdiwdcJTIHTek3zzQ1pb+E7VlypEYgIpFvdUJ39UIiiflhqtdBATmHwKBOtePwU0MzFMg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-text": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-text/-/mjml-text-4.13.0.tgz", + "integrity": "sha512-uDuraaQFdu+6xfuigCimbeznnOnJfwRdcCL1lTBTusTuEvW/5Va6m2D3mnMeEpl+bp4+cxesXIz9st6A9pcg5A==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "mjml-validator": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-validator/-/mjml-validator-4.13.0.tgz", + "integrity": "sha512-uURYfyQYtHJ6Qz/1A7/+E9ezfcoISoLZhYK3olsxKRViwaA2Mm8gy/J3yggZXnsUXWUns7Qymycm5LglLEIiQg==", + "requires": { + "@babel/runtime": "^7.14.6" + } + }, + "mjml-wrapper": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-wrapper/-/mjml-wrapper-4.13.0.tgz", + "integrity": "sha512-p/44JvHg04rAFR7QDImg8nZucEokIjFH6KJMHxsO0frJtLZ+IuakctzlZAADHsqiR52BwocDsXSa+o9SE2l6Ng==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-section": "4.13.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moo": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multer": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", + "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "multer-s3": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/multer-s3/-/multer-s3-2.10.0.tgz", + "integrity": "sha512-RZsiqG19C9gE82lB7v8duJ+TMIf70fWYHlIwuNcsanOH1ePBoPXZvboEQxEow9jUkk7WQsuyVA2TgriOuDrVrw==", + "requires": { + "file-type": "^3.3.0", + "html-comment-regex": "^1.1.2", + "run-parallel": "^1.1.6" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mysql2": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", + "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "requires": { + "denque": "^2.0.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "dependencies": { + "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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "requires": { + "lru-cache": "^4.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "requires": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "dependencies": { + "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==" + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "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==" + }, + "nestjs-i18n": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/nestjs-i18n/-/nestjs-i18n-9.2.2.tgz", + "integrity": "sha512-GxwDonBnW7MbwuUxF9IHINm0vYhVQUqUnDLxDHPzavs2T2qMDrf/muyqXc9QFIs0v16ElSKz5+aBDZK4nUrgpw==", + "requires": { + "accept-language-parser": "^1.5.0", + "chokidar": "^3.5.3", + "cookie": "^0.5.0", + "iterare": "^1.2.1", + "js-yaml": "^4.1.0", + "string-format": "^2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-abort-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", + "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", + "dev": true + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node-rsa": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz", + "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==", + "requires": { + "asn1": "^0.2.4" + } + }, + "nodemailer": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.8.0.tgz", + "integrity": "sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ==" + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "requires": { + "abbrev": "^1.0.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "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, + "requires": { + "path-key": "^3.0.0" + } + }, + "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==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "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, + "requires": { + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "requires": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + } + }, + "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 + }, + "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, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "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 + }, + "pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "requires": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + } + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "requires": { + "no-case": "^2.2.0" + } + }, + "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, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + } + } + }, + "parseley": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.7.0.tgz", + "integrity": "sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw==", + "requires": { + "moo": "^0.5.1", + "nearley": "^2.20.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + } + }, + "passport-anonymous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/passport-anonymous/-/passport-anonymous-1.0.1.tgz", + "integrity": "sha1-JB43J07ETft/bK0jS0HEODhrwRc=", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-jwt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", + "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", + "requires": { + "jsonwebtoken": "^8.2.0", + "passport-strategy": "^1.0.0" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "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 + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "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 + }, + "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==" + }, + "path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + }, + "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 + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "requires": {} + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "requires": { + "split2": "^4.1.0" + } + }, + "pick-util": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", + "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", + "requires": { + "@jonkemp/package-utils": "^1.0.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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, + "requires": { + "p-locate": "^4.1.0" + } + }, + "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, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "preview-email": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/preview-email/-/preview-email-3.0.5.tgz", + "integrity": "sha512-q37jdkVw+wic0o/7xYhOTBS4kF0WX3two0OepmR1Fhxp9NTpO3rJTccAjQm95gJx/2Wa/Nv98sr9pXIQ77/foA==", + "requires": { + "dayjs": "^1.10.6", + "debug": "^4.3.2", + "mailparser": "^3.3.0", + "nodemailer": "^6.6.3", + "open": "7", + "pug": "^3.0.2", + "uuid": "^8.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "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==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "requires": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "requires": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "requires": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "requires": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" + }, + "pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "requires": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "requires": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "requires": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "requires": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "requires": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" + }, + "pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "requires": { + "pug-error": "^2.0.0" + } + }, + "pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "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==" + }, + "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==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "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==" + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + }, + "remote-content": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-3.0.0.tgz", + "integrity": "sha512-/hjCYVqWY/jYR07ptEJpClnYrGedSQ5AxCrEeMb3NlrxTgUK/7+iCOReE3z1QMYm3UL7sJX3o7cww/NC6UgyhA==", + "requires": { + "proxy-from-env": "^1.1.0", + "superagent": "^7.0.2", + "superagent-proxy": "^3.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "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 + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "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 + } + } + }, + "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 + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "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, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "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 + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "selderee": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.6.0.tgz", + "integrity": "sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg==", + "requires": { + "parseley": "^0.7.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "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==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + }, + "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 + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==" + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + } + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==" + }, + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-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 + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "style-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-data/-/style-data-2.0.0.tgz", + "integrity": "sha512-8RJ+MnHlwFUrf3B3gUjs9KIrOk0TppHHwfIHfBd6QjYmZcuzN1OGqeMkWA3ZnD6GiRWJjCVouY/l11v4rlfnPA==", + "requires": { + "cheerio": "^1.0.0-rc.10", + "mediaquery-text": "^1.2.0", + "pick-util": "^1.1.4" + } + }, + "superagent": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.5.tgz", + "integrity": "sha512-HQYyGuDRFGmZ6GNC4hq2f37KnsY9Lr0/R1marNZTgMweVDQLTLJJ6DGQ9Tj/xVVs5HEnop9EMmTbywb5P30aqw==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "^2.5.0", + "qs": "^6.10.3", + "readable-stream": "^3.6.0", + "semver": "^7.3.7" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", + "requires": { + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "supertest": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.1.tgz", + "integrity": "sha512-hRohNeIfk/cA48Cxpa/w48hktP6ZaRqXb0QV5rLvW0C7paRsBU3Q5zydzYrslOJtj/gd48qx540jKtcs6vG1fQ==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^8.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "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 + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "superagent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.3.tgz", + "integrity": "sha512-oBC+aNsCjzzjmO5AOPBPFS+Z7HPzlx+DQr/aHwM08kI+R24gsDmAS1LMfza1fK+P+SKlTAoNZpOvooE/pRO1HA==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==" + }, + "swagger-ui-dist": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.13.2.tgz", + "integrity": "sha512-jHL6UyIYpvEI7NsuWd0R3hJaPQTg6Oo4qSBo+oVfOEkv6rrQm/475RGSMmZgV6ajp+Sgrp9CqrDjQYAgQqiv1A==" + }, + "swagger-ui-express": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.5.0.tgz", + "integrity": "sha512-DHk3zFvsxrkcnurGvQlAcLuTDacAVN1JHKDgcba/gr2NFRE4HGwP1YeHIXMiGznkWR4AeS7X5vEblNn4QljuNA==", + "requires": { + "swagger-ui-dist": ">=4.11.0" + } + }, + "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 + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "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 + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "tlds": { + "version": "1.231.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.231.0.tgz", + "integrity": "sha512-L7UQwueHSkGxZHQBXHVmXW64oi+uqNtzFt2x6Ssk7NVnpIbw16CRs4eb/jmKOZ9t2JnqZ/b3Cfvo97lnXqKrhw==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" + }, + "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 + }, + "ts-jest": { + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.1.tgz", + "integrity": "sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + } + }, + "ts-loader": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "devOptional": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tsconfig-paths": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz", + "integrity": "sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==", + "dev": true, + "requires": { + "json5": "^2.2.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + } + } + }, + "tsconfig-paths-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "twitter": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/twitter/-/twitter-1.7.1.tgz", + "integrity": "sha1-B2I3jx3BwFDkj2ZqypBOJLGpYvQ=", + "requires": { + "deep-extend": "^0.5.0", + "request": "^2.72.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typeorm": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.10.tgz", + "integrity": "sha512-VMKiM84EpJQ+Mz9xDIPqnfplWhyUy1d8ccaKdMY9obifxJOTFnv8GYVyPsGwG8Lk7Nb8MlttHyHWENGAhBA3WA==", + "requires": { + "@sqltools/formatter": "^1.2.2", + "app-root-path": "^3.0.0", + "buffer": "^6.0.3", + "chalk": "^4.1.0", + "cli-highlight": "^2.1.11", + "date-fns": "^2.28.0", + "debug": "^4.3.3", + "dotenv": "^16.0.0", + "glob": "^7.2.0", + "js-yaml": "^4.1.0", + "mkdirp": "^1.0.4", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.3.1", + "uuid": "^8.3.2", + "xml2js": "^0.4.23", + "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + } + } + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "devOptional": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "uglify-js": { + "version": "3.12.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.8.tgz", + "integrity": "sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w==" + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + } + } + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "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 + } + } + }, + "valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==" + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm2": { + "version": "3.9.11", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.11.tgz", + "integrity": "sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg==", + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + } + }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "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, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "web-resource-inliner": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-5.0.0.tgz", + "integrity": "sha512-AIihwH+ZmdHfkJm7BjSXiEClVt4zUFqX4YlFAzjL13wLtDuUneSaFvDBTbdYRecs35SiU7iNKbMnN+++wVfb6A==", + "requires": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^4.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "dependencies": { + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + } + } + }, + "webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "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.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + } + } + }, + "webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + } + }, + "windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "requires": { + "execa": "^4.0.2" + }, + "dependencies": { + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "requires": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "requires": { + "cliui": "^7.0.2", + "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.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" + } + } + }, + "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 + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/myteamwallet_backend/package.json b/myteamwallet_backend/package.json new file mode 100644 index 0000000..67dbc89 --- /dev/null +++ b/myteamwallet_backend/package.json @@ -0,0 +1,124 @@ +{ + "name": "nestjs-boilerplate", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "postinstall": "is-ci || husky install", + "typeorm": "env-cmd ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js", + "migration:generate": "npm run typeorm -- --dataSource=src/database/data-source.ts migration:generate", + "migration:create": "npm run typeorm -- migration:create", + "migration:run": "npm run typeorm -- --dataSource=src/database/data-source.ts migration:run", + "migration:revert": "npm run typeorm -- --dataSource=src/database/data-source.ts migration:revert", + "schema:drop": "npm run typeorm -- --dataSource=src/database/data-source.ts schema:drop", + "seed:run": "ts-node -r tsconfig-paths/register ./src/database/seeds/run-seed.ts", + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "env-cmd jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@nestjs-modules/mailer": "1.8.1", + "@nestjs/common": "9.1.6", + "@nestjs/config": "2.2.0", + "@nestjs/core": "9.1.6", + "@nestjs/jwt": "9.0.0", + "@nestjs/passport": "9.0.0", + "@nestjs/platform-express": "9.1.6", + "@nestjs/serve-static": "^3.0.0", + "@nestjs/swagger": "6.1.3", + "@nestjs/typeorm": "9.0.1", + "apple-signin-auth": "1.7.4", + "bcryptjs": "2.4.3", + "class-transformer": "0.5.1", + "class-validator": "0.13.2", + "fb": "2.0.0", + "google-auth-library": "8.7.0", + "handlebars": "4.7.7", + "multer": "1.4.4", + "multer-s3": "2.10.0", + "mysql2": "^2.3.3", + "nestjs-i18n": "9.2.2", + "nodemailer": "6.8.0", + "passport": "0.6.0", + "passport-anonymous": "1.0.1", + "passport-jwt": "4.0.0", + "pg": "8.8.0", + "reflect-metadata": "0.1.13", + "rimraf": "3.0.2", + "rxjs": "7.5.7", + "source-map-support": "0.5.21", + "swagger-ui-express": "4.5.0", + "twitter": "1.7.1", + "typeorm": "0.3.10" + }, + "devDependencies": { + "@faker-js/faker": "^7.6.0", + "@nestjs/cli": "9.1.5", + "@nestjs/schematics": "9.0.3", + "@nestjs/testing": "9.1.6", + "@types/bcryptjs": "2.4.2", + "@types/express": "4.17.14", + "@types/facebook-js-sdk": "3.3.6", + "@types/jest": "29.2.3", + "@types/multer": "1.4.7", + "@types/node": "16.18.3", + "@types/passport-anonymous": "1.0.3", + "@types/passport-jwt": "3.0.7", + "@types/supertest": "2.0.12", + "@types/twitter": "1.7.1", + "@typescript-eslint/eslint-plugin": "5.43.0", + "@typescript-eslint/parser": "5.43.0", + "aws-sdk": "2.1243.0", + "env-cmd": "10.1.0", + "eslint": "8.27.0", + "eslint-config-prettier": "8.5.0", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-prettier": "4.2.1", + "husky": "7.0.4", + "is-ci": "3.0.1", + "jest": "29.3.1", + "prettier": "2.7.1", + "supertest": "6.3.1", + "ts-jest": "29.0.1", + "ts-loader": "9.4.1", + "ts-node": "10.9.1", + "tsconfig-paths": "4.1.0", + "tslib": "2.4.1", + "typescript": "4.8.4" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "moduleNameMapper": { + "^src/(.*)$": "/$1" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + }, + "engines": { + "node": ">=14.0.0" + } +} diff --git a/myteamwallet_backend/renovate.json b/myteamwallet_backend/renovate.json new file mode 100644 index 0000000..f45d8f1 --- /dev/null +++ b/myteamwallet_backend/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} diff --git a/myteamwallet_backend/src/app.module.ts b/myteamwallet_backend/src/app.module.ts new file mode 100644 index 0000000..7509c58 --- /dev/null +++ b/myteamwallet_backend/src/app.module.ts @@ -0,0 +1,86 @@ +import { Module } from '@nestjs/common'; +import { UsersModule } from './users/users.module'; +import { FilesModule } from './files/files.module'; +import { AuthModule } from './auth/auth.module'; +import databaseConfig from './config/database.config'; +import authConfig from './config/auth.config'; +import appConfig from './config/app.config'; +import mailConfig from './config/mail.config'; +import fileConfig from './config/file.config'; +import * as path from 'path'; +import { MailerModule } from '@nestjs-modules/mailer'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { I18nModule } from 'nestjs-i18n/dist/i18n.module'; +import { HeaderResolver } from 'nestjs-i18n'; +import { TypeOrmConfigService } from './database/typeorm-config.service'; +import { MailConfigService } from './mail/mail-config.service'; +import { ForgotModule } from './forgot/forgot.module'; +import { MailModule } from './mail/mail.module'; +import { DataSource } from 'typeorm'; +import { PlayersModule } from './players/players.module'; +import { TeamsModule } from './teams/teams.module'; +import { TransactionsModule } from './transactions/transactions.module'; +import { TeamSettingsModule } from './team-settings/team-settings.module'; +import { TeamWalletTransactionsModule } from './team-wallet-transactions/team-wallet-transactions.module'; +import { ServeStaticModule } from '@nestjs/serve-static'; +import { join } from 'path'; +import { LoggingModule } from './database/logging/logging.module'; +import { TranslateModule } from './translate/translate.module'; +import { PenaltyModule } from './penalty/penalty.module'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + load: [databaseConfig, authConfig, appConfig, mailConfig, fileConfig], + envFilePath: ['.env'], + }), + TypeOrmModule.forRootAsync({ + useClass: TypeOrmConfigService, + dataSourceFactory: async (options) => { + const dataSource = await new DataSource(options).initialize(); + return dataSource; + }, + }), + MailerModule.forRootAsync({ + useClass: MailConfigService, + }), + I18nModule.forRootAsync({ + useFactory: (configService: ConfigService) => ({ + fallbackLanguage: configService.get('app.fallbackLanguage'), + loaderOptions: { path: path.join(__dirname, '/i18n/'), watch: true }, + }), + resolvers: [ + { + use: HeaderResolver, + useFactory: (configService: ConfigService) => { + return [configService.get('app.headerLanguage')]; + }, + inject: [ConfigService], + }, + ], + imports: [ConfigModule], + inject: [ConfigService], + }), + ServeStaticModule.forRoot({ + rootPath: join(__dirname, '../client'), + exclude: ['*/api*'], + }), + UsersModule, + FilesModule, + AuthModule, + ForgotModule, + MailModule, + PlayersModule, + TeamsModule, + TransactionsModule, + TeamSettingsModule, + TeamWalletTransactionsModule, + LoggingModule, + TranslateModule, + PenaltyModule, + ], + providers: [], +}) +export class AppModule {} diff --git a/myteamwallet_backend/src/auth/auth-providers.enum.ts b/myteamwallet_backend/src/auth/auth-providers.enum.ts new file mode 100644 index 0000000..cd4d92c --- /dev/null +++ b/myteamwallet_backend/src/auth/auth-providers.enum.ts @@ -0,0 +1,7 @@ +export enum AuthProvidersEnum { + email = 'email', + facebook = 'facebook', + google = 'google', + twitter = 'twitter', + apple = 'apple', +} diff --git a/myteamwallet_backend/src/auth/auth.controller.ts b/myteamwallet_backend/src/auth/auth.controller.ts new file mode 100644 index 0000000..0da3c2a --- /dev/null +++ b/myteamwallet_backend/src/auth/auth.controller.ts @@ -0,0 +1,139 @@ +import { + Body, + Controller, + Get, + HttpCode, + HttpStatus, + Request, + Post, + UseGuards, + Patch, + Delete, + UseInterceptors, + ClassSerializerInterceptor, + SerializeOptions, +} from '@nestjs/common'; +import { AuthService } from './auth.service'; +import { AuthEmailLoginDto } from './dto/auth-email-login.dto'; +import { AuthForgotPasswordDto } from './dto/auth-forgot-password.dto'; +import { AuthConfirmEmailDto } from './dto/auth-confirm-email.dto'; +import { AuthResetPasswordDto } from './dto/auth-reset-password.dto'; +import { AuthUpdateDto } from './dto/auth-update.dto'; +import { AuthGuard } from '@nestjs/passport'; +import { + ApiTags, + ApiBearerAuth, + ApiOperation, + ApiOkResponse, +} from '@nestjs/swagger'; +import { CreateInviteDTO } from './dto/create-invite.dto'; + +@ApiTags('Auth') +@Controller({ + path: 'auth', + version: '1', +}) +@UseInterceptors(ClassSerializerInterceptor) +export class AuthController { + constructor(public service: AuthService) {} + + @Post('email/login') + @HttpCode(HttpStatus.OK) + public async login(@Body() loginDto: AuthEmailLoginDto) { + return this.service.validateLogin(loginDto); + } + + @Post('admin/email/login') + @HttpCode(HttpStatus.OK) + public async adminLogin(@Body() loginDTO: AuthEmailLoginDto) { + return this.service.validateLogin(loginDTO); + } + + @Post('email/register') + @HttpCode(HttpStatus.CREATED) + async register(@Body() createUserDto: any) { + return this.service.register(createUserDto); + } + + @Post('email/confirm') + @HttpCode(HttpStatus.OK) + async confirmEmail(@Body() confirmEmailDto: AuthConfirmEmailDto) { + return this.service.confirmEmail(confirmEmailDto.hash); + } + + @Post('forgot/password') + @HttpCode(HttpStatus.OK) + async forgotPassword(@Body() forgotPasswordDto: AuthForgotPasswordDto) { + return this.service.forgotPassword(forgotPasswordDto.email); + } + + @Post('reset/password') + @HttpCode(HttpStatus.OK) + async resetPassword(@Body() resetPasswordDto: AuthResetPasswordDto) { + return this.service.resetPassword( + resetPasswordDto.hash, + resetPasswordDto.password, + ); + } + + @ApiBearerAuth() + @SerializeOptions({ + groups: ['exposeProvider'], + }) + @Get('me') + // @UseGuards(AuthGuard('jwt')) + @HttpCode(HttpStatus.OK) + public me(@Request() request: Request) { + return this.service.me(request.headers['authorization']); + } + + @ApiBearerAuth() + @Patch('me') + @UseGuards(AuthGuard('jwt')) + @HttpCode(HttpStatus.OK) + public async update(@Request() request, @Body() userDto: AuthUpdateDto) { + return this.service.update(request.user, userDto); + } + + @ApiBearerAuth() + @Delete('me') + @UseGuards(AuthGuard('jwt')) + @HttpCode(HttpStatus.OK) + public async delete(@Request() request) { + return this.service.softDelete(request.user); + } + + @ApiOperation({ + summary: 'Erstellt Registrierungstoken', + description: + 'Encoded den JWT Token für eine Einladung für eine neue Registrierung. Team- und Rollen-Infos müssen da sein. Der Token ist dann 30 Tage gültig.', + }) + @ApiOkResponse({ + description: 'JWT Token', + isArray: false, + type: 'string', + }) + @Post('invite') + @UseGuards(AuthGuard('jwt')) + public getInvite( + @Body() + invite: any, + ) { + return this.service.createTeamInvite(invite); + } + + @ApiOperation({ + summary: 'Verifiziert Registrierungstoken', + description: + 'Decoded und prüft den JWT Token einer Einladung für die Registrierung', + }) + @ApiOkResponse({ + description: 'Object mit teamName, teamId, roleName, roleId', + isArray: false, + type: CreateInviteDTO, + }) + @Post('verify-invite') + public verifyInvite(@Body() body: any) { + return this.service.getTeamFromInvite(body.token); + } +} diff --git a/myteamwallet_backend/src/auth/auth.module.ts b/myteamwallet_backend/src/auth/auth.module.ts new file mode 100644 index 0000000..6029a36 --- /dev/null +++ b/myteamwallet_backend/src/auth/auth.module.ts @@ -0,0 +1,38 @@ +import { Module } from '@nestjs/common'; +import { AuthController } from './auth.controller'; +import { AuthService } from './auth.service'; +import { PassportModule } from '@nestjs/passport'; +import { JwtModule } from '@nestjs/jwt'; +import { JwtStrategy } from './strategies/jwt.strategy'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { AnonymousStrategy } from './strategies/anonymous.strategy'; +import { UsersModule } from 'src/users/users.module'; +import { ForgotModule } from 'src/forgot/forgot.module'; +import { MailModule } from 'src/mail/mail.module'; +import { IsExist } from 'src/utils/validators/is-exists.validator'; +import { IsNotExist } from 'src/utils/validators/is-not-exists.validator'; +import { LoggingModule } from 'src/database/logging/logging.module'; + +@Module({ + imports: [ + UsersModule, + ForgotModule, + PassportModule, + MailModule, + JwtModule.registerAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (configService: ConfigService) => ({ + secret: configService.get('auth.secret'), + signOptions: { + expiresIn: configService.get('auth.expires'), + }, + }), + }), + LoggingModule, + ], + controllers: [AuthController], + providers: [IsExist, IsNotExist, AuthService, JwtStrategy, AnonymousStrategy], + exports: [AuthService], +}) +export class AuthModule {} diff --git a/myteamwallet_backend/src/auth/auth.service.ts b/myteamwallet_backend/src/auth/auth.service.ts new file mode 100644 index 0000000..4a7ccec --- /dev/null +++ b/myteamwallet_backend/src/auth/auth.service.ts @@ -0,0 +1,405 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { User } from '../users/entities/user.entity'; +import * as bcrypt from 'bcryptjs'; +import { AuthEmailLoginDto } from './dto/auth-email-login.dto'; +import { AuthUpdateDto } from './dto/auth-update.dto'; +import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; +import { RoleEnum } from 'src/roles/roles.enum'; +import { StatusEnum } from 'src/statuses/statuses.enum'; +import * as crypto from 'crypto'; +import { plainToClass } from 'class-transformer'; +import { Status } from 'src/statuses/entities/status.entity'; +import { Role } from 'src/roles/entities/role.entity'; +import { AuthProvidersEnum } from './auth-providers.enum'; +import { SocialInterface } from 'src/social/interfaces/social.interface'; +import { AuthRegisterLoginDto } from './dto/auth-register-login.dto'; +import { UsersService } from 'src/users/users.service'; +import { ForgotService } from 'src/forgot/forgot.service'; +import { MailService } from 'src/mail/mail.service'; +import { CreateInviteDTO } from './dto/create-invite.dto'; +import { LoggingService } from 'src/database/logging/logging.service'; + +@Injectable() +export class AuthService { + constructor( + private jwtService: JwtService, + private usersService: UsersService, + private forgotService: ForgotService, + private mailService: MailService, + private logger: LoggingService, + ) {} + + async validateLogin( + loginDto: AuthEmailLoginDto, + ): Promise<{ token: string; user: User }> { + const user = await this.usersService.findOne({ + email: loginDto.email, + }); + + if (!user) { + await this.logger.info({ + event: 'user_login_fail', + details: `mail not found: ${loginDto.email}`, + userId: -1, + }); + throw new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + email: 'notFound', + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } + + if (user.provider !== AuthProvidersEnum.email) { + throw new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + email: `needLoginViaProvider:${user.provider}`, + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } + + const isValidPassword = await bcrypt.compare( + loginDto.password, + user.password, + ); + + if (isValidPassword) { + const token = await this.jwtService.sign({ + id: user.id, + role: user.role, + }); + + await this.logger.info({ + event: 'user_login_success', + details: `logged in: ${loginDto.email}`, + userId: user.id, + }); + + return { token, user: user }; + } else { + await this.logger.info({ + event: 'user_login_fail', + details: `incorrect password for user: ${loginDto.email}`, + userId: user.id, + }); + + throw new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + password: 'incorrectPassword', + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } + } + + async validateSocialLogin( + authProvider: string, + socialData: SocialInterface, + ): Promise<{ token: string; user: User }> { + let user: User; + const socialEmail = socialData.email?.toLowerCase(); + + const userByEmail = await this.usersService.findOne({ + email: socialEmail, + }); + + user = await this.usersService.findOne({ + socialId: socialData.id, + provider: authProvider, + }); + + if (user) { + if (socialEmail && !userByEmail) { + user.email = socialEmail; + } + await this.usersService.update(user.id, user); + } else if (userByEmail) { + user = userByEmail; + } else { + const role = plainToClass(Role, { + id: RoleEnum.user, + }); + const status = plainToClass(Status, { + id: StatusEnum.active, + }); + + user = await this.usersService.create({ + email: socialEmail, + firstName: socialData.firstName, + lastName: socialData.lastName, + socialId: socialData.id, + provider: authProvider, + role, + status, + }); + + user = await this.usersService.findOne({ + id: user.id, + }); + } + + const jwtToken = await this.jwtService.sign({ + id: user.id, + role: user.role, + }); + + return { + token: jwtToken, + user, + }; + } + + async register(dto: AuthRegisterLoginDto): Promise { + const hash = crypto + .createHash('sha256') + .update(randomStringGenerator()) + .digest('hex'); + + const user = await this.usersService.create({ + ...dto, + email: dto.email, + role: { + id: RoleEnum.user, + } as Role, + status: { + id: StatusEnum.inactive, + } as Status, + hash, + }); + + if (user && dto.linkPlayerId != null) { + await this.usersService.linkPlayerToUserId(user, dto.linkPlayerId); + } + + await this.logger.info({ + event: 'user_create', + details: `user created with mail: ${dto.email}`, + userId: user.id, + }); + + await this.mailService.userSignUp({ + to: user.email, + data: { + hash, + }, + }); + } + + async confirmEmail(hash: string): Promise { + const user = await this.usersService.findOne({ + hash, + }); + + if (!user) { + throw new HttpException( + { + status: HttpStatus.NOT_FOUND, + error: `notFound`, + }, + HttpStatus.NOT_FOUND, + ); + } + + user.hash = null; + user.status = plainToClass(Status, { + id: StatusEnum.active, + }); + await user.save(); + } + + async forgotPassword(email: string): Promise { + const user = await this.usersService.findOne({ + email, + }); + + if (!user) { + throw new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + email: 'emailNotExists', + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } else { + const hash = crypto + .createHash('sha256') + .update(randomStringGenerator()) + .digest('hex'); + await this.forgotService.create({ + hash, + user, + }); + + await this.mailService.forgotPassword({ + to: email, + data: { + hash, + }, + }); + } + } + + async resetPassword(hash: string, password: string): Promise { + const forgot = await this.forgotService.findOne({ + where: { + hash, + }, + }); + + if (!forgot) { + throw new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + hash: `notFound`, + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } + + const user = forgot.user; + user.password = password; + await user.save(); + await this.forgotService.softDelete(forgot.id); + } + + async me(token: string): Promise { + token = token.replace('Bearer ', ''); + let role: any; + try { + role = this.jwtService.verify(token); + + const u = await this.usersService.findOne({ + id: role.id, + }); + + await this.logger.debug({ + event: 'user_token_verification_success', + details: `Email: ${u.email}`, + userId: u.id, + }); + + return u; + } catch (error) { + const role = this.jwtService.decode(token); + + const user = await this.usersService.findOne({ + id: (role as any).id, + }); + const t = await this.jwtService.sign({ + id: user.id, + role: user.role, + }); + + user['token'] = t; + await this.logger.debug({ + event: 'user_token_verification_success', + details: `Email: ${user.email}`, + userId: user.id, + }); + return user; + } + } + + async update(user: User, userDto: AuthUpdateDto): Promise { + if (userDto.password) { + if (userDto.oldPassword) { + const currentUser = await this.usersService.findOne({ + id: user.id, + }); + + const isValidOldPassword = await bcrypt.compare( + userDto.oldPassword, + currentUser.password, + ); + + if (!isValidOldPassword) { + throw new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + oldPassword: 'incorrectOldPassword', + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } + } else { + throw new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + oldPassword: 'missingOldPassword', + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } + } + + await this.usersService.update(user.id, userDto); + + return this.usersService.findOne({ + id: user.id, + }); + } + + async softDelete(user: User): Promise { + await this.usersService.softDelete(user.id); + } + + async createTeamInvite(object: CreateInviteDTO) { + const token = await this.jwtService.sign(object, { + expiresIn: '30d', + }); + + await this.logger.info({ + event: 'user_invite_link_create', + details: `invitation created for team: ${object.teamName} , ${object.teamId}`, + userId: 0, + }); + + return { token }; + } + + async getTeamFromInvite(token: string) { + try { + const teamInfo = this.jwtService.verify(token); + delete teamInfo.iat; + delete teamInfo.exp; + + await this.logger.info({ + event: 'user_invite_link_validate', + details: `invitation validated for team: ${teamInfo.teamName} , ${teamInfo.teamId}`, + userId: 0, + }); + + return teamInfo; + } catch { + await this.logger.info({ + event: 'user_invite_link_validate_fail', + details: `validation failed for token ${token}`, + userId: 0, + }); + + throw new HttpException( + 'Token not valid', + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } + } +} diff --git a/myteamwallet_backend/src/auth/dto/auth-confirm-email.dto.ts b/myteamwallet_backend/src/auth/dto/auth-confirm-email.dto.ts new file mode 100644 index 0000000..93aabcd --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/auth-confirm-email.dto.ts @@ -0,0 +1,8 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty } from 'class-validator'; + +export class AuthConfirmEmailDto { + @ApiProperty() + @IsNotEmpty() + hash: string; +} diff --git a/myteamwallet_backend/src/auth/dto/auth-email-login.dto.ts b/myteamwallet_backend/src/auth/dto/auth-email-login.dto.ts new file mode 100644 index 0000000..cd65b34 --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/auth-email-login.dto.ts @@ -0,0 +1,17 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, Validate } from 'class-validator'; +import { IsExist } from 'src/utils/validators/is-exists.validator'; +import { Transform } from 'class-transformer'; + +export class AuthEmailLoginDto { + @ApiProperty({ example: 'test1@example.com' }) + @Transform(({ value }) => value.toLowerCase().trim()) + @Validate(IsExist, ['User'], { + message: 'emailNotExists', + }) + email: string; + + @ApiProperty() + @IsNotEmpty() + password: string; +} diff --git a/myteamwallet_backend/src/auth/dto/auth-forgot-password.dto.ts b/myteamwallet_backend/src/auth/dto/auth-forgot-password.dto.ts new file mode 100644 index 0000000..f0d2624 --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/auth-forgot-password.dto.ts @@ -0,0 +1,10 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsEmail } from 'class-validator'; +import { Transform } from 'class-transformer'; + +export class AuthForgotPasswordDto { + @ApiProperty() + @Transform(({ value }) => value.toLowerCase().trim()) + @IsEmail() + email: string; +} diff --git a/myteamwallet_backend/src/auth/dto/auth-register-login.dto.ts b/myteamwallet_backend/src/auth/dto/auth-register-login.dto.ts new file mode 100644 index 0000000..6924cb3 --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/auth-register-login.dto.ts @@ -0,0 +1,29 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsEmail, IsNotEmpty, MinLength, Validate } from 'class-validator'; +import { IsNotExist } from 'src/utils/validators/is-not-exists.validator'; +import { Transform } from 'class-transformer'; + +export class AuthRegisterLoginDto { + @ApiProperty({ example: 'test1@example.com' }) + @Transform(({ value }) => value.toLowerCase().trim()) + @Validate(IsNotExist, ['User'], { + message: 'emailAlreadyExists', + }) + @IsEmail() + email: string; + + @ApiProperty() + @MinLength(6) + password: string; + + @ApiProperty({ example: 'John' }) + @IsNotEmpty() + firstName: string; + + @ApiProperty({ example: 'Doe' }) + @IsNotEmpty() + lastName: string; + + @ApiProperty({ example: 27 }) + linkPlayerId: number | null; +} diff --git a/myteamwallet_backend/src/auth/dto/auth-reset-password.dto.ts b/myteamwallet_backend/src/auth/dto/auth-reset-password.dto.ts new file mode 100644 index 0000000..6ffd868 --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/auth-reset-password.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty } from 'class-validator'; + +export class AuthResetPasswordDto { + @ApiProperty() + @IsNotEmpty() + password: string; + + @ApiProperty() + @IsNotEmpty() + hash: string; +} diff --git a/myteamwallet_backend/src/auth/dto/auth-social-login.dto.ts b/myteamwallet_backend/src/auth/dto/auth-social-login.dto.ts new file mode 100644 index 0000000..eb27561 --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/auth-social-login.dto.ts @@ -0,0 +1,22 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Allow, IsNotEmpty } from 'class-validator'; +import { Tokens } from 'src/social/tokens'; +import { AuthProvidersEnum } from '../auth-providers.enum'; + +export class AuthSocialLoginDto { + @Allow() + @ApiProperty({ type: () => Tokens }) + tokens: Tokens; + + @ApiProperty({ enum: AuthProvidersEnum }) + @IsNotEmpty() + socialType: AuthProvidersEnum; + + @Allow() + @ApiProperty({ required: false }) + firstName?: string; + + @Allow() + @ApiProperty({ required: false }) + lastName?: string; +} diff --git a/myteamwallet_backend/src/auth/dto/auth-update.dto.ts b/myteamwallet_backend/src/auth/dto/auth-update.dto.ts new file mode 100644 index 0000000..1efe37f --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/auth-update.dto.ts @@ -0,0 +1,34 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsOptional, MinLength, Validate } from 'class-validator'; +import { IsExist } from '../../utils/validators/is-exists.validator'; +import { FileEntity } from '../../files/entities/file.entity'; + +export class AuthUpdateDto { + @ApiProperty({ type: () => FileEntity }) + @IsOptional() + @Validate(IsExist, ['FileEntity', 'id'], { + message: 'imageNotExists', + }) + photo?: FileEntity; + + @ApiProperty({ example: 'John' }) + @IsOptional() + @IsNotEmpty({ message: 'mustBeNotEmpty' }) + firstName?: string; + + @ApiProperty({ example: 'Doe' }) + @IsOptional() + @IsNotEmpty({ message: 'mustBeNotEmpty' }) + lastName?: string; + + @ApiProperty() + @IsOptional() + @IsNotEmpty() + @MinLength(6) + password?: string; + + @ApiProperty() + @IsOptional() + @IsNotEmpty({ message: 'mustBeNotEmpty' }) + oldPassword: string; +} diff --git a/myteamwallet_backend/src/auth/dto/create-invite.dto.ts b/myteamwallet_backend/src/auth/dto/create-invite.dto.ts new file mode 100644 index 0000000..86cfd5f --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/create-invite.dto.ts @@ -0,0 +1,15 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class CreateInviteDTO { + @ApiProperty() + teamId: number; + + @ApiProperty({ example: 'Development Team' }) + teamName: string; + + @ApiProperty() + playerId: number; + + @ApiProperty({ example: 'Max Mustermann' }) + playerName: string; +} diff --git a/myteamwallet_backend/src/auth/dto/verify-token.dto.ts b/myteamwallet_backend/src/auth/dto/verify-token.dto.ts new file mode 100644 index 0000000..65bb369 --- /dev/null +++ b/myteamwallet_backend/src/auth/dto/verify-token.dto.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class VerifyTokenDTO { + @ApiProperty({ example: 'JWT' }) + token: string; +} diff --git a/myteamwallet_backend/src/auth/strategies/anonymous.strategy.ts b/myteamwallet_backend/src/auth/strategies/anonymous.strategy.ts new file mode 100644 index 0000000..d21bfc7 --- /dev/null +++ b/myteamwallet_backend/src/auth/strategies/anonymous.strategy.ts @@ -0,0 +1,14 @@ +import { Strategy } from 'passport-anonymous'; +import { Injectable } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; + +@Injectable() +export class AnonymousStrategy extends PassportStrategy(Strategy) { + constructor() { + super(); + } + + public validate(payload: unknown, request: unknown): unknown { + return request; + } +} diff --git a/myteamwallet_backend/src/auth/strategies/jwt.strategy.ts b/myteamwallet_backend/src/auth/strategies/jwt.strategy.ts new file mode 100644 index 0000000..26a5c96 --- /dev/null +++ b/myteamwallet_backend/src/auth/strategies/jwt.strategy.ts @@ -0,0 +1,28 @@ +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { PassportStrategy } from '@nestjs/passport'; +import { User } from '../../users/entities/user.entity'; +import { ConfigService } from '@nestjs/config'; + +type JwtPayload = Pick & { iat: number; exp: number }; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor( + private jwtService: JwtService, + private configService: ConfigService, + ) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + secretOrKey: configService.get('auth.secret'), + }); + } + + public validate(payload: JwtPayload) { + if (!payload.id) { + throw new UnauthorizedException(); + } + return payload; + } +} diff --git a/myteamwallet_backend/src/config/app.config.ts b/myteamwallet_backend/src/config/app.config.ts new file mode 100644 index 0000000..a33cba4 --- /dev/null +++ b/myteamwallet_backend/src/config/app.config.ts @@ -0,0 +1,13 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('app', () => ({ + nodeEnv: process.env.NODE_ENV, + name: process.env.APP_NAME, + workingDirectory: process.env.PWD || process.cwd(), + frontendDomain: process.env.FRONTEND_DOMAIN, + backendDomain: process.env.BACKEND_DOMAIN, + port: parseInt(process.env.APP_PORT || process.env.PORT, 10) || 3000, + apiPrefix: process.env.API_PREFIX || 'api', + fallbackLanguage: process.env.APP_FALLBACK_LANGUAGE || 'en', + headerLanguage: process.env.APP_HEADER_LANGUAGE || 'x-custom-lang', +})); diff --git a/myteamwallet_backend/src/config/auth.config.ts b/myteamwallet_backend/src/config/auth.config.ts new file mode 100644 index 0000000..c3e8a32 --- /dev/null +++ b/myteamwallet_backend/src/config/auth.config.ts @@ -0,0 +1,6 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('auth', () => ({ + secret: process.env.AUTH_JWT_SECRET, + expires: process.env.AUTH_JWT_TOKEN_EXPIRES_IN, +})); diff --git a/myteamwallet_backend/src/config/database.config.ts b/myteamwallet_backend/src/config/database.config.ts new file mode 100644 index 0000000..18e3807 --- /dev/null +++ b/myteamwallet_backend/src/config/database.config.ts @@ -0,0 +1,17 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('database', () => ({ + url: process.env.DATABASE_URL, + type: process.env.DATABASE_TYPE, + host: process.env.DATABASE_HOST, + port: parseInt(process.env.DATABASE_PORT, 10) || 5432, + password: process.env.DATABASE_PASSWORD, + name: process.env.DATABASE_NAME, + username: process.env.DATABASE_USERNAME, + synchronize: process.env.DATABASE_SYNCHRONIZE === 'true', + sslEnabled: process.env.DATABASE_SSL_ENABLED === 'true', + rejectUnauthorized: process.env.DATABASE_REJECT_UNAUTHORIZED === 'true', + ca: process.env.DATABASE_CA, + key: process.env.DATABASE_KEY, + cert: process.env.DATABASE_CERT, +})); diff --git a/myteamwallet_backend/src/config/file.config.ts b/myteamwallet_backend/src/config/file.config.ts new file mode 100644 index 0000000..9086140 --- /dev/null +++ b/myteamwallet_backend/src/config/file.config.ts @@ -0,0 +1,11 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('file', () => ({ + driver: process.env.FILE_DRIVER, + accessKeyId: process.env.ACCESS_KEY_ID, + secretAccessKey: process.env.SECRET_ACCESS_KEY, + awsDefaultS3Bucket: process.env.AWS_DEFAULT_S3_BUCKET, + awsDefaultS3Url: process.env.AWS_DEFAULT_S3_URL, + awsS3Region: process.env.AWS_S3_REGION, + maxFileSize: 5242880, // 5mb +})); diff --git a/myteamwallet_backend/src/config/mail.config.ts b/myteamwallet_backend/src/config/mail.config.ts new file mode 100644 index 0000000..76d8b3c --- /dev/null +++ b/myteamwallet_backend/src/config/mail.config.ts @@ -0,0 +1,13 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('mail', () => ({ + port: parseInt(process.env.MAIL_PORT, 10), + host: process.env.MAIL_HOST, + user: process.env.MAIL_USER, + password: process.env.MAIL_PASSWORD, + defaultEmail: process.env.MAIL_DEFAULT_EMAIL, + defaultName: process.env.MAIL_DEFAULT_NAME, + ignoreTLS: process.env.MAIL_IGNORE_TLS === 'true', + secure: process.env.MAIL_SECURE === 'true', + requireTLS: process.env.MAIL_REQUIRE_TLS === 'true', +})); diff --git a/myteamwallet_backend/src/database/data-source.ts b/myteamwallet_backend/src/database/data-source.ts new file mode 100644 index 0000000..0a2d4ee --- /dev/null +++ b/myteamwallet_backend/src/database/data-source.ts @@ -0,0 +1,23 @@ +import 'reflect-metadata'; +import { DataSource, DataSourceOptions } from 'typeorm'; + +export const AppDataSource = new DataSource({ + type: process.env.DATABASE_TYPE, + url: process.env.DATABASE_URL, + host: process.env.DATABASE_HOST, + port: parseInt(process.env.DATABASE_PORT, 10) || 5432, + username: process.env.DATABASE_USERNAME, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE_NAME, + synchronize: process.env.DATABASE_SYNCHRONIZE === 'true', + dropSchema: false, + keepConnectionAlive: true, + logging: process.env.NODE_ENV !== 'production', + entities: [__dirname + '/../**/*.entity{.ts,.js}'], + migrations: [__dirname + '/migrations/**/*{.ts,.js}'], + cli: { + entitiesDir: 'src', + migrationsDir: 'src/database/migrations', + subscribersDir: 'subscriber', + }, +} as DataSourceOptions); diff --git a/myteamwallet_backend/src/database/logging/dto/create-log.dto.ts b/myteamwallet_backend/src/database/logging/dto/create-log.dto.ts new file mode 100644 index 0000000..81dcd0c --- /dev/null +++ b/myteamwallet_backend/src/database/logging/dto/create-log.dto.ts @@ -0,0 +1,13 @@ +import { LOGEVENT, LOGLEVEL } from '../model/logging-event.type'; + +export class CreateLogDTO { + level: LOGLEVEL; + + event: LOGEVENT; + + details: string; + + userId: number; + + duration?: number; +} diff --git a/myteamwallet_backend/src/database/logging/entities/log-entry.entity.ts b/myteamwallet_backend/src/database/logging/entities/log-entry.entity.ts new file mode 100644 index 0000000..bac4ce0 --- /dev/null +++ b/myteamwallet_backend/src/database/logging/entities/log-entry.entity.ts @@ -0,0 +1,39 @@ +import { + Column, + CreateDateColumn, + Entity, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { ApiProperty } from '@nestjs/swagger'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { LOGEVENT, LOGLEVEL } from '../model/logging-event.type'; + +@Entity() +export class LogEntry extends EntityHelper { + @ApiProperty({ example: 1 }) + @PrimaryGeneratedColumn() + id: number; + + @ApiProperty({ example: 'error' }) + @Column() + level: LOGLEVEL; + + @ApiProperty({ example: 'created new user' }) + @Column() + event: LOGEVENT; + + @ApiProperty({ example: 'created new user max mustermann' }) + @Column() + details: string; + + @ApiProperty({ example: 5 }) + @Column() + userId: number; + + @ApiProperty({ example: 5 }) + @Column({ nullable: true }) + duration?: number; + + @CreateDateColumn() + createdAt: Date; +} diff --git a/myteamwallet_backend/src/database/logging/logging.module.ts b/myteamwallet_backend/src/database/logging/logging.module.ts new file mode 100644 index 0000000..fe3f589 --- /dev/null +++ b/myteamwallet_backend/src/database/logging/logging.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { LogEntry } from './entities/log-entry.entity'; +import { LoggingService } from './logging.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([LogEntry])], + providers: [LoggingService], + exports: [LoggingService], +}) +export class LoggingModule {} diff --git a/myteamwallet_backend/src/database/logging/logging.service.spec.ts b/myteamwallet_backend/src/database/logging/logging.service.spec.ts new file mode 100644 index 0000000..35b8391 --- /dev/null +++ b/myteamwallet_backend/src/database/logging/logging.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { LoggingService } from './logging.service'; + +describe('LoggingService', () => { + let service: LoggingService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [LoggingService], + }).compile(); + + service = module.get(LoggingService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/database/logging/logging.service.ts b/myteamwallet_backend/src/database/logging/logging.service.ts new file mode 100644 index 0000000..6febd80 --- /dev/null +++ b/myteamwallet_backend/src/database/logging/logging.service.ts @@ -0,0 +1,95 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { CreateLogDTO } from './dto/create-log.dto'; +import { LogEntry } from './entities/log-entry.entity'; +import { LOGEVENT } from './model/logging-event.type'; + +@Injectable() +export class LoggingService { + constructor( + @InjectRepository(LogEntry) + private repository: Repository, + ) { + // void this.onStart(); + } + + private async onStart() { + await this.repository.save({ + level: 'DEBUG', + event: 'application_start', + details: 'application started', + userId: -1, + }); + } + + async info({ + event, + details, + userId, + }: { + event: LOGEVENT; + details: string; + userId: number; + }) { + const e: CreateLogDTO = { + event, + details, + userId, + level: 'INFO', + }; + await this.repository.save(e); + } + + async error({ + event, + details, + userId, + }: { + event: LOGEVENT; + details: string; + userId: number; + }) { + const e: CreateLogDTO = { + event, + details, + userId, + level: 'ERROR', + }; + await this.repository.save(e); + } + + async warn({ + event, + details, + userId, + }: { + event: LOGEVENT; + details: string; + userId: number; + }) { + const e: CreateLogDTO = { + event, + details, + userId, + level: 'WARN', + }; + await this.repository.save(e); + } + + async debug(data: { + event: LOGEVENT; + details: string; + userId: number; + duration?: number; + }) { + const e: CreateLogDTO = { + event: data.event, + details: data.details, + userId: data.userId, + level: 'DEBUG', + duration: data.duration, + }; + await this.repository.save(e); + } +} diff --git a/myteamwallet_backend/src/database/logging/model/log-type.enum.ts b/myteamwallet_backend/src/database/logging/model/log-type.enum.ts new file mode 100644 index 0000000..e0dfedf --- /dev/null +++ b/myteamwallet_backend/src/database/logging/model/log-type.enum.ts @@ -0,0 +1,5 @@ +export enum LogTypeEnum { + 'error' = 1, + 'info' = 2, + 'warn' = 3, +} diff --git a/myteamwallet_backend/src/database/logging/model/logging-event.type.ts b/myteamwallet_backend/src/database/logging/model/logging-event.type.ts new file mode 100644 index 0000000..08ccfe3 --- /dev/null +++ b/myteamwallet_backend/src/database/logging/model/logging-event.type.ts @@ -0,0 +1,20 @@ +export type LOGEVENT = + | 'user_create' + | 'application_start' + | 'transaction_create' + | 'team_transaction_create' + | 'team_transaction_get' + | 'user_login_success' + | 'user_login_fail' + | 'user_token_verification_success' + | 'user_token_verification_fail' + | 'user_invite_link_create' + | 'user_invite_link_validate' + | 'user_invite_link_validate_fail' + | 'transaction_create' + | 'transaction_create_fail' + | 'transaction_reverse' + | 'player_creation' + | 'team_create'; + +export type LOGLEVEL = 'FATAL' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE'; diff --git a/myteamwallet_backend/src/database/migrations/1604164774154-CreateUser.ts b/myteamwallet_backend/src/database/migrations/1604164774154-CreateUser.ts new file mode 100644 index 0000000..afec9b0 --- /dev/null +++ b/myteamwallet_backend/src/database/migrations/1604164774154-CreateUser.ts @@ -0,0 +1,75 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class CreateUser1604164774154 implements MigrationInterface { + name = 'CreateUser1604164774154'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "file" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "path" character varying NOT NULL, CONSTRAINT "PK_36b46d232307066b3a2c9ea3a1d" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE "role" ("id" integer NOT NULL, "name" character varying NOT NULL, CONSTRAINT "PK_b36bcfe02fc8de3c57a8b2391c2" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE "status" ("id" integer NOT NULL, "name" character varying NOT NULL, CONSTRAINT "PK_e12743a7086ec826733f54e1d95" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE "user" ("id" SERIAL NOT NULL, "email" character varying, "password" character varying, "provider" character varying NOT NULL DEFAULT 'email', "socialId" character varying, "firstName" character varying, "lastName" character varying, "hash" character varying, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "photoId" uuid, "roleId" integer, "statusId" integer, CONSTRAINT "UQ_e12875dfb3b1d92d7d7c5377e22" UNIQUE ("email"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX "IDX_9bd2fe7a8e694dedc4ec2f666f" ON "user" ("socialId") `, + ); + await queryRunner.query( + `CREATE INDEX "IDX_58e4dbff0e1a32a9bdc861bb29" ON "user" ("firstName") `, + ); + await queryRunner.query( + `CREATE INDEX "IDX_f0e1b4ecdca13b177e2e3a0613" ON "user" ("lastName") `, + ); + await queryRunner.query( + `CREATE INDEX "IDX_e282acb94d2e3aec10f480e4f6" ON "user" ("hash") `, + ); + await queryRunner.query( + `CREATE TABLE "forgot" ("id" SERIAL NOT NULL, "hash" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "userId" integer, CONSTRAINT "PK_087959f5bb89da4ce3d763eab75" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX "IDX_df507d27b0fb20cd5f7bef9b9a" ON "forgot" ("hash") `, + ); + await queryRunner.query( + `ALTER TABLE "user" ADD CONSTRAINT "FK_75e2be4ce11d447ef43be0e374f" FOREIGN KEY ("photoId") REFERENCES "file"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "user" ADD CONSTRAINT "FK_c28e52f758e7bbc53828db92194" FOREIGN KEY ("roleId") REFERENCES "role"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "user" ADD CONSTRAINT "FK_dc18daa696860586ba4667a9d31" FOREIGN KEY ("statusId") REFERENCES "status"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "forgot" ADD CONSTRAINT "FK_31f3c80de0525250f31e23a9b83" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "forgot" DROP CONSTRAINT "FK_31f3c80de0525250f31e23a9b83"`, + ); + await queryRunner.query( + `ALTER TABLE "user" DROP CONSTRAINT "FK_dc18daa696860586ba4667a9d31"`, + ); + await queryRunner.query( + `ALTER TABLE "user" DROP CONSTRAINT "FK_c28e52f758e7bbc53828db92194"`, + ); + await queryRunner.query( + `ALTER TABLE "user" DROP CONSTRAINT "FK_75e2be4ce11d447ef43be0e374f"`, + ); + await queryRunner.query(`DROP INDEX "IDX_df507d27b0fb20cd5f7bef9b9a"`); + await queryRunner.query(`DROP TABLE "forgot"`); + await queryRunner.query(`DROP INDEX "IDX_e282acb94d2e3aec10f480e4f6"`); + await queryRunner.query(`DROP INDEX "IDX_f0e1b4ecdca13b177e2e3a0613"`); + await queryRunner.query(`DROP INDEX "IDX_58e4dbff0e1a32a9bdc861bb29"`); + await queryRunner.query(`DROP INDEX "IDX_9bd2fe7a8e694dedc4ec2f666f"`); + await queryRunner.query(`DROP TABLE "user"`); + await queryRunner.query(`DROP TABLE "status"`); + await queryRunner.query(`DROP TABLE "role"`); + await queryRunner.query(`DROP TABLE "file"`); + } +} diff --git a/myteamwallet_backend/src/database/migrations/1785513600000-AddTeamPublicAccess.ts b/myteamwallet_backend/src/database/migrations/1785513600000-AddTeamPublicAccess.ts new file mode 100644 index 0000000..2486e4e --- /dev/null +++ b/myteamwallet_backend/src/database/migrations/1785513600000-AddTeamPublicAccess.ts @@ -0,0 +1,29 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddTeamPublicAccess1785513600000 implements MigrationInterface { + name = 'AddTeamPublicAccess1785513600000'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "team" ADD "publicAccessEnabled" boolean NOT NULL DEFAULT false`, + ); + await queryRunner.query( + `ALTER TABLE "team" ADD "publicAccessToken" character varying(64)`, + ); + await queryRunner.query( + `ALTER TABLE "team" ADD CONSTRAINT "UQ_team_public_access_token" UNIQUE ("publicAccessToken")`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "team" DROP CONSTRAINT "UQ_team_public_access_token"`, + ); + await queryRunner.query( + `ALTER TABLE "team" DROP COLUMN "publicAccessToken"`, + ); + await queryRunner.query( + `ALTER TABLE "team" DROP COLUMN "publicAccessEnabled"`, + ); + } +} diff --git a/myteamwallet_backend/src/database/seeds/player/player-seed.module.ts b/myteamwallet_backend/src/database/seeds/player/player-seed.module.ts new file mode 100644 index 0000000..984fdad --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/player/player-seed.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Player } from 'src/players/entities/player.entity'; +import { Team } from 'src/teams/entities/team.entity'; +import { User } from 'src/users/entities/user.entity'; +import { PlayersSeedService } from './player-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Player, Team, User])], + providers: [PlayersSeedService], + exports: [PlayersSeedService], +}) +export class PlayersSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/player/player-seed.service.ts b/myteamwallet_backend/src/database/seeds/player/player-seed.service.ts new file mode 100644 index 0000000..ee72d0d --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/player/player-seed.service.ts @@ -0,0 +1,69 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Player } from 'src/players/entities/player.entity'; +import { Team } from 'src/teams/entities/team.entity'; +import { Repository } from 'typeorm'; +import { faker } from '@faker-js/faker'; +import { User } from 'src/users/entities/user.entity'; + +@Injectable() +export class PlayersSeedService { + constructor( + @InjectRepository(Player) + private repository: Repository, + @InjectRepository(Team) + private teamRepository: Repository, + @InjectRepository(User) + private userRepository: Repository, + ) {} + + async run() { + const dev = await this.teamRepository.findOne({ where: { id: 1 } }); + + const countPlayer = await this.repository.count(); + + if (countPlayer === 0) { + const players = []; + for (let index = 0; index < 20; index++) { + const p = this.repository.create({ + firstName: faker.name.firstName(), + lastName: faker.name.lastName(), + teamRole: { + id: 1, + name: 'player', + }, + team: dev, + }); + players.push(p); + } + + const p2 = this.repository.create({ + firstName: 'Player', + lastName: 'Kapitän', + teamRole: { + id: 3, + name: 'captain', + }, + team: dev, + }); + + const u = await this.userRepository.findOne({ + where: { email: 'mail@bastian-wagner.de' }, + }); + + const p3 = this.repository.create({ + firstName: 'Player', + lastName: 'Kassenwart', + teamRole: { + id: 4, + name: 'treasurer', + }, + team: dev, + user: u, + }); + + await this.repository.save(players); + await this.repository.save([p2, p3]); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/role/role-seed.module.ts b/myteamwallet_backend/src/database/seeds/role/role-seed.module.ts new file mode 100644 index 0000000..a8d25f7 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/role/role-seed.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Role } from 'src/roles/entities/role.entity'; +import { RoleSeedService } from './role-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Role])], + providers: [RoleSeedService], + exports: [RoleSeedService], +}) +export class RoleSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/role/role-seed.service.ts b/myteamwallet_backend/src/database/seeds/role/role-seed.service.ts new file mode 100644 index 0000000..34885b9 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/role/role-seed.service.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Role } from 'src/roles/entities/role.entity'; +import { RoleEnum } from 'src/roles/roles.enum'; +import { Repository } from 'typeorm'; + +@Injectable() +export class RoleSeedService { + constructor( + @InjectRepository(Role) + private repository: Repository, + ) {} + + async run() { + const countPlayer = await this.repository.count({ + where: { + id: RoleEnum.user, + }, + }); + + if (countPlayer === 0) { + await this.repository.save( + this.repository.create({ + id: RoleEnum.user, + name: 'user', + }), + ); + } + + const countAdmins = await this.repository.count({ + where: { + id: RoleEnum.admin, + }, + }); + + if (countAdmins === 0) { + await this.repository.save( + this.repository.create({ + id: RoleEnum.admin, + name: 'admin', + }), + ); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/run-seed.ts b/myteamwallet_backend/src/database/seeds/run-seed.ts new file mode 100644 index 0000000..2ed4ba1 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/run-seed.ts @@ -0,0 +1,33 @@ +import { NestFactory } from '@nestjs/core'; +import { PlayersSeedService } from './player/player-seed.service'; +import { RoleSeedService } from './role/role-seed.service'; +import { SeedModule } from './seed.module'; +import { StatusSeedService } from './status/status-seed.service'; +import { TeamRoleSeedService } from './team-role/team-role-seed.service'; +import { TeamsSettingsSeedService } from './team-settings/team-settings-seed.service'; +import { TeamWalletTransactionTypeSeedService } from './team-wallet-transactions-type/team-wallet-transaction-type-seed.service'; +import { TeamWalletTransactionSeedService } from './team-wallet-transactions/team-wallet-transaction-seed.service'; +import { TeamsSeedService } from './teams/teams-seed.service'; +import { TransactionsTypeSeedService } from './transaction-type/transactions-type-seed.service'; +import { TransactionsSeedService } from './transactions/transactions-seed.service'; +import { UserSeedService } from './user/user-seed.service'; + +const runSeed = async () => { + const app = await NestFactory.create(SeedModule); + + // run + await app.get(RoleSeedService).run(); + await app.get(StatusSeedService).run(); + await app.get(UserSeedService).run(); + await app.get(TeamRoleSeedService).run(); + await app.get(TeamsSeedService).run(); + await app.get(PlayersSeedService).run(); + await app.get(TransactionsTypeSeedService).run(); + await app.get(TransactionsSeedService).run(); + await app.get(TeamsSettingsSeedService).run(); + await app.get(TeamWalletTransactionTypeSeedService).run(); + await app.get(TeamWalletTransactionSeedService).run(); + await app.close(); +}; + +void runSeed(); diff --git a/myteamwallet_backend/src/database/seeds/seed.module.ts b/myteamwallet_backend/src/database/seeds/seed.module.ts new file mode 100644 index 0000000..dad455a --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/seed.module.ts @@ -0,0 +1,47 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import appConfig from 'src/config/app.config'; +import databaseConfig from 'src/config/database.config'; +import { DataSource } from 'typeorm'; +import { TypeOrmConfigService } from '../typeorm-config.service'; +import { PlayersSeedModule } from './player/player-seed.module'; +import { RoleSeedModule } from './role/role-seed.module'; +import { StatusSeedModule } from './status/status-seed.module'; +import { TeamRolesSeedModule } from './team-role/team-role-seed.module'; +import { TeamSettingsSeedModule } from './team-settings/team-settings-seed.module'; +import { TeamWalletTransactionTypeSeedModule } from './team-wallet-transactions-type/team-wallet-transaction-type-seed.module'; +import { TeamWalletTransactionSeedModule } from './team-wallet-transactions/team-wallet-transaction-seed.module'; +import { TeamsSeedModule } from './teams/teams-seed.module'; +import { TransactionsTypeSeedModule } from './transaction-type/transactions-type-seed.module'; +import { TransactionsSeedModule } from './transactions/transactions-seed.module'; +import { UserSeedModule } from './user/user-seed.module'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + load: [databaseConfig, appConfig], + envFilePath: ['.env'], + }), + TypeOrmModule.forRootAsync({ + useClass: TypeOrmConfigService, + dataSourceFactory: async (options) => { + const dataSource = await new DataSource(options).initialize(); + return dataSource; + }, + }), + RoleSeedModule, + StatusSeedModule, + UserSeedModule, + TeamRolesSeedModule, + TeamsSeedModule, + PlayersSeedModule, + TransactionsTypeSeedModule, + TransactionsSeedModule, + TeamSettingsSeedModule, + TeamWalletTransactionTypeSeedModule, + TeamWalletTransactionSeedModule, + ], +}) +export class SeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/status/status-seed.module.ts b/myteamwallet_backend/src/database/seeds/status/status-seed.module.ts new file mode 100644 index 0000000..78209b6 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/status/status-seed.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Status } from 'src/statuses/entities/status.entity'; +import { StatusSeedService } from './status-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Status])], + providers: [StatusSeedService], + exports: [StatusSeedService], +}) +export class StatusSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/status/status-seed.service.ts b/myteamwallet_backend/src/database/seeds/status/status-seed.service.ts new file mode 100644 index 0000000..dec50b4 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/status/status-seed.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Status } from 'src/statuses/entities/status.entity'; +import { StatusEnum } from 'src/statuses/statuses.enum'; +import { Repository } from 'typeorm'; + +@Injectable() +export class StatusSeedService { + constructor( + @InjectRepository(Status) + private repository: Repository, + ) {} + + async run() { + const count = await this.repository.count(); + + if (count === 0) { + await this.repository.save([ + this.repository.create({ + id: StatusEnum.active, + name: 'Active', + }), + this.repository.create({ + id: StatusEnum.inactive, + name: 'Inactive', + }), + ]); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/team-role/team-role-seed.module.ts b/myteamwallet_backend/src/database/seeds/team-role/team-role-seed.module.ts new file mode 100644 index 0000000..f4fb65c --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/team-role/team-role-seed.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { TeamRole } from 'src/team-roles/entities/team-roles.entity'; +import { TeamRoleSeedService } from './team-role-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([TeamRole])], + providers: [TeamRoleSeedService], + exports: [TeamRoleSeedService], +}) +export class TeamRolesSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/team-role/team-role-seed.service.ts b/myteamwallet_backend/src/database/seeds/team-role/team-role-seed.service.ts new file mode 100644 index 0000000..3764d29 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/team-role/team-role-seed.service.ts @@ -0,0 +1,90 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TeamRole } from 'src/team-roles/entities/team-roles.entity'; +import { TeamRolesEnum } from 'src/team-roles/team-roles.enum'; +import { Repository } from 'typeorm'; + +@Injectable() +export class TeamRoleSeedService { + constructor( + @InjectRepository(TeamRole) + private repository: Repository, + ) {} + + async run() { + const countPlayer = await this.repository.count({ + where: { + id: TeamRolesEnum.player, + }, + }); + + if (countPlayer === 0) { + await this.repository.save( + this.repository.create({ + id: TeamRolesEnum.player, + name: 'player', + }), + ); + } + + const countScndTr = await this.repository.count({ + where: { + id: TeamRolesEnum.scnd_treasurer, + }, + }); + + if (countScndTr === 0) { + await this.repository.save( + this.repository.create({ + id: TeamRolesEnum.scnd_treasurer, + name: 'scnd_treasurer', + }), + ); + } + + const countCaptain = await this.repository.count({ + where: { + id: TeamRolesEnum.captain, + }, + }); + + if (countCaptain === 0) { + await this.repository.save( + this.repository.create({ + id: TeamRolesEnum.captain, + name: 'captain', + }), + ); + } + + const countTreasurer = await this.repository.count({ + where: { + id: TeamRolesEnum.treasurer, + }, + }); + + if (countTreasurer === 0) { + await this.repository.save( + this.repository.create({ + id: TeamRolesEnum.treasurer, + name: 'treasurer', + }), + ); + } + + const countCoach = await this.repository.count({ + where: { + id: TeamRolesEnum.coach, + }, + }); + + if (countCoach === 0) { + await this.repository.save( + this.repository.create({ + id: TeamRolesEnum.coach, + name: 'coach', + }), + ); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/team-settings/team-settings-seed.module.ts b/myteamwallet_backend/src/database/seeds/team-settings/team-settings-seed.module.ts new file mode 100644 index 0000000..cbaab61 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/team-settings/team-settings-seed.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { TeamSetting } from 'src/team-settings/entities/team-setting.entity'; +import { Team } from 'src/teams/entities/team.entity'; +import { TeamsSettingsSeedService } from './team-settings-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Team, TeamSetting])], + providers: [TeamsSettingsSeedService], + exports: [TeamsSettingsSeedService], +}) +export class TeamSettingsSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/team-settings/team-settings-seed.service.ts b/myteamwallet_backend/src/database/seeds/team-settings/team-settings-seed.service.ts new file mode 100644 index 0000000..2223e89 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/team-settings/team-settings-seed.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TeamSetting } from 'src/team-settings/entities/team-setting.entity'; +import { Team } from 'src/teams/entities/team.entity'; +import { Repository } from 'typeorm'; + +@Injectable() +export class TeamsSettingsSeedService { + constructor( + @InjectRepository(TeamSetting) + private repository: Repository, + @InjectRepository(Team) + private teamrepository: Repository, + ) {} + + async run() { + const countTeamSettings = await this.repository.count(); + + if (countTeamSettings === 0) { + const team = await this.teamrepository.findOne({ where: { id: 1 } }); + await this.repository.save( + this.repository.create({ + team, + key: 'transaction_create_min_role', + value: '2', + }), + ); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/team-wallet-transactions-type/team-wallet-transaction-type-seed.module.ts b/myteamwallet_backend/src/database/seeds/team-wallet-transactions-type/team-wallet-transaction-type-seed.module.ts new file mode 100644 index 0000000..c6f4bfd --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/team-wallet-transactions-type/team-wallet-transaction-type-seed.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { TeamWalletTransactionType } from 'src/team-wallet-transactions/entities/team-wallet-transaction-type.entity'; +import { TeamWalletTransactionTypeSeedService } from './team-wallet-transaction-type-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([TeamWalletTransactionType])], + providers: [TeamWalletTransactionTypeSeedService], + exports: [TeamWalletTransactionTypeSeedService], +}) +export class TeamWalletTransactionTypeSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/team-wallet-transactions-type/team-wallet-transaction-type-seed.service.ts b/myteamwallet_backend/src/database/seeds/team-wallet-transactions-type/team-wallet-transaction-type-seed.service.ts new file mode 100644 index 0000000..70fd7f6 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/team-wallet-transactions-type/team-wallet-transaction-type-seed.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TeamWalletTransactionType } from 'src/team-wallet-transactions/entities/team-wallet-transaction-type.entity'; +import { TeamWalletTransactionEnum } from 'src/team-wallet-transactions/team-wallet-transaction.enum'; +import { Repository } from 'typeorm'; + +@Injectable() +export class TeamWalletTransactionTypeSeedService { + constructor( + @InjectRepository(TeamWalletTransactionType) + private repository: Repository, + ) {} + + async run() { + const amount = await this.repository.count({ + where: { + id: 0, + }, + }); + + if (amount === 0) { + await this.repository.save( + this.repository.create({ + id: TeamWalletTransactionEnum.credit, + name: 'credit', + }), + ); + + await this.repository.save( + this.repository.create({ + id: TeamWalletTransactionEnum.expense, + name: 'expense', + }), + ); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/team-wallet-transactions/team-wallet-transaction-seed.module.ts b/myteamwallet_backend/src/database/seeds/team-wallet-transactions/team-wallet-transaction-seed.module.ts new file mode 100644 index 0000000..b71daa1 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/team-wallet-transactions/team-wallet-transaction-seed.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity'; +import { Team } from 'src/teams/entities/team.entity'; +import { TeamWalletTransactionSeedService } from './team-wallet-transaction-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([TeamWalletTransaction, Team])], + providers: [TeamWalletTransactionSeedService], + exports: [TeamWalletTransactionSeedService], +}) +export class TeamWalletTransactionSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/team-wallet-transactions/team-wallet-transaction-seed.service.ts b/myteamwallet_backend/src/database/seeds/team-wallet-transactions/team-wallet-transaction-seed.service.ts new file mode 100644 index 0000000..8ca4f68 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/team-wallet-transactions/team-wallet-transaction-seed.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity'; +import { TeamWalletTransactionEnum } from 'src/team-wallet-transactions/team-wallet-transaction.enum'; +import { Team } from 'src/teams/entities/team.entity'; +import { Repository } from 'typeorm'; +import { faker } from '@faker-js/faker'; + +@Injectable() +export class TeamWalletTransactionSeedService { + constructor( + @InjectRepository(TeamWalletTransaction) + private repository: Repository, + @InjectRepository(Team) + private teamrepository: Repository, + ) {} + + async run() { + const amount = await this.repository.count({ + where: { + id: 0, + }, + }); + + if (amount === 0) { + const team = await this.teamrepository.findOneBy({ id: 1 }); + + for (let index = 0; index < 20; index++) { + await this.repository.save( + this.repository.create({ + team: team, + note: '', + date: faker.date.recent(90).toISOString(), + amount: Math.random() * 10, + type: { + id: TeamWalletTransactionEnum.credit, + name: 'credit', + }, + }), + ); + } + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/teams/teams-seed.module.ts b/myteamwallet_backend/src/database/seeds/teams/teams-seed.module.ts new file mode 100644 index 0000000..587fe92 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/teams/teams-seed.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Team } from 'src/teams/entities/team.entity'; +import { TeamsSeedService } from './teams-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Team])], + providers: [TeamsSeedService], + exports: [TeamsSeedService], +}) +export class TeamsSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/teams/teams-seed.service.ts b/myteamwallet_backend/src/database/seeds/teams/teams-seed.service.ts new file mode 100644 index 0000000..6eebc1d --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/teams/teams-seed.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Team } from 'src/teams/entities/team.entity'; +import { Repository } from 'typeorm'; + +@Injectable() +export class TeamsSeedService { + constructor( + @InjectRepository(Team) + private repository: Repository, + ) {} + + async run() { + const countTeams = await this.repository.count({ + where: { + id: 1, + }, + }); + + if (countTeams === 0) { + await this.repository.save( + this.repository.create({ + id: 1, + name: 'Development Team', + alias: '9999', + }), + ); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/transaction-type/transactions-type-seed.module.ts b/myteamwallet_backend/src/database/seeds/transaction-type/transactions-type-seed.module.ts new file mode 100644 index 0000000..cbb3a1e --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/transaction-type/transactions-type-seed.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { TransactionType } from 'src/transactions/entitites/transaction-type.entity'; +import { TransactionsTypeSeedService } from './transactions-type-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([TransactionType])], + providers: [TransactionsTypeSeedService], + exports: [TransactionsTypeSeedService], +}) +export class TransactionsTypeSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/transaction-type/transactions-type-seed.service.ts b/myteamwallet_backend/src/database/seeds/transaction-type/transactions-type-seed.service.ts new file mode 100644 index 0000000..1c1826e --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/transaction-type/transactions-type-seed.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TransactionType } from 'src/transactions/entitites/transaction-type.entity'; +import { TransactionTypeEnum } from 'src/transactions/transaction-type.enum'; +import { Repository } from 'typeorm'; + +@Injectable() +export class TransactionsTypeSeedService { + constructor( + @InjectRepository(TransactionType) + private repository: Repository, + ) {} + + async run() { + const count = await this.repository.count(); + + if (count === 0) { + await this.repository.save([ + this.repository.create({ + id: TransactionTypeEnum.credit, + name: 'credit', + }), + this.repository.create({ + id: TransactionTypeEnum.fee, + name: 'fee', + }), + this.repository.create({ + id: TransactionTypeEnum.fine, + name: 'fine', + }), + this.repository.create({ + id: TransactionTypeEnum.levy, + name: 'levy', + }), + this.repository.create({ + id: TransactionTypeEnum.payment, + name: 'payment', + }), + ]); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/transactions/transactions-seed.module.ts b/myteamwallet_backend/src/database/seeds/transactions/transactions-seed.module.ts new file mode 100644 index 0000000..c9d3c58 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/transactions/transactions-seed.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Player } from 'src/players/entities/player.entity'; +import { TransactionType } from 'src/transactions/entitites/transaction-type.entity'; +import { Transaction } from 'src/transactions/entitites/transaction.entity'; +import { TransactionsSeedService } from './transactions-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([TransactionType, Transaction, Player])], + providers: [TransactionsSeedService], + exports: [TransactionsSeedService], +}) +export class TransactionsSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/transactions/transactions-seed.service.ts b/myteamwallet_backend/src/database/seeds/transactions/transactions-seed.service.ts new file mode 100644 index 0000000..b9786c8 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/transactions/transactions-seed.service.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Player } from 'src/players/entities/player.entity'; +import { TransactionType } from 'src/transactions/entitites/transaction-type.entity'; +import { Transaction } from 'src/transactions/entitites/transaction.entity'; +import { Repository } from 'typeorm'; +import { faker } from '@faker-js/faker'; + +@Injectable() +export class TransactionsSeedService { + constructor( + @InjectRepository(Transaction) + private repository: Repository, + @InjectRepository(Player) + private playerRepository: Repository, + @InjectRepository(TransactionType) + private transactionTypeRepository: Repository, + ) {} + + async run() { + const count = await this.repository.count(); + + if (count === 0) { + const players = await this.playerRepository.find(); + const transactionTypes = await this.transactionTypeRepository.find(); + + const transactions = []; + for (let x = 0; x < 500; x++) { + const p = Math.floor(Math.random() * players.length); + const type = Math.floor(Math.random() * transactionTypes.length); + + const t = this.repository.create({ + amount: Math.random() * 50, + player: players[p], + type: transactionTypes[type], + note: faker.hacker.phrase(), + date: faker.date.recent(90).toISOString(), + }); + transactions.push(t); + } + + await this.repository.save(transactions); + } + } +} diff --git a/myteamwallet_backend/src/database/seeds/user/user-seed.module.ts b/myteamwallet_backend/src/database/seeds/user/user-seed.module.ts new file mode 100644 index 0000000..e2d098f --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/user/user-seed.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { User } from 'src/users/entities/user.entity'; +import { UserSeedService } from './user-seed.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([User])], + providers: [UserSeedService], + exports: [UserSeedService], +}) +export class UserSeedModule {} diff --git a/myteamwallet_backend/src/database/seeds/user/user-seed.service.ts b/myteamwallet_backend/src/database/seeds/user/user-seed.service.ts new file mode 100644 index 0000000..af30249 --- /dev/null +++ b/myteamwallet_backend/src/database/seeds/user/user-seed.service.ts @@ -0,0 +1,70 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { RoleEnum } from 'src/roles/roles.enum'; +import { StatusEnum } from 'src/statuses/statuses.enum'; +import { User } from 'src/users/entities/user.entity'; +import { Repository } from 'typeorm'; + +@Injectable() +export class UserSeedService { + constructor( + @InjectRepository(User) + private repository: Repository, + ) {} + + async run() { + const countAdmin = await this.repository.count({ + where: { + role: { + id: RoleEnum.admin, + }, + }, + }); + + if (countAdmin === 0) { + await this.repository.save( + this.repository.create({ + firstName: 'Bastian', + lastName: 'Wagner', + email: 'mail@bastian-wagner.de', + password: 'Passwort123', + role: { + id: RoleEnum.admin, + name: 'Admin', + }, + status: { + id: StatusEnum.active, + name: 'Active', + }, + }), + ); + } + + const countUser = await this.repository.count({ + where: { + role: { + id: RoleEnum.user, + }, + }, + }); + + if (countUser === 0) { + await this.repository.save( + this.repository.create({ + firstName: 'John', + lastName: 'Doe', + email: 'john.doe@example.com', + password: 'secret', + role: { + id: RoleEnum.user, + name: 'Admin', + }, + status: { + id: StatusEnum.active, + name: 'Active', + }, + }), + ); + } + } +} diff --git a/myteamwallet_backend/src/database/typeorm-config.service.ts b/myteamwallet_backend/src/database/typeorm-config.service.ts new file mode 100644 index 0000000..3b8844b --- /dev/null +++ b/myteamwallet_backend/src/database/typeorm-config.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm'; + +@Injectable() +export class TypeOrmConfigService implements TypeOrmOptionsFactory { + constructor(private configService: ConfigService) {} + + createTypeOrmOptions(): TypeOrmModuleOptions { + return { + type: this.configService.get('database.type'), + url: this.configService.get('database.url'), + host: this.configService.get('database.host'), + port: this.configService.get('database.port'), + username: this.configService.get('database.username'), + password: this.configService.get('database.password'), + database: this.configService.get('database.name'), + synchronize: this.configService.get('database.synchronize'), + dropSchema: false, + keepConnectionAlive: true, + logging: this.configService.get('app.nodeEnv') !== 'prod', + entities: [__dirname + '/../**/*.entity{.ts,.js}'], + migrations: [__dirname + '/migrations/**/*{.ts,.js}'], + cli: { + entitiesDir: 'src', + migrationsDir: 'src/database/migrations', + subscribersDir: 'subscriber', + }, + } as TypeOrmModuleOptions; + } +} diff --git a/myteamwallet_backend/src/files/entities/file.entity.ts b/myteamwallet_backend/src/files/entities/file.entity.ts new file mode 100644 index 0000000..ecbcd5e --- /dev/null +++ b/myteamwallet_backend/src/files/entities/file.entity.ts @@ -0,0 +1,30 @@ +import { + Column, + Entity, + PrimaryGeneratedColumn, + AfterLoad, + AfterInsert, +} from 'typeorm'; +import { ApiProperty } from '@nestjs/swagger'; +import { Allow } from 'class-validator'; +import { EntityHelper } from 'src/utils/entity-helper'; +import appConfig from '../../config/app.config'; + +@Entity({ name: 'file' }) +export class FileEntity extends EntityHelper { + @ApiProperty({ example: 'cbcfa8b8-3a25-4adb-a9c6-e325f0d0f3ae' }) + @PrimaryGeneratedColumn('uuid') + id: string; + + @Allow() + @Column() + path: string; + + @AfterLoad() + @AfterInsert() + updatePath() { + if (this.path.indexOf('/') === 0) { + this.path = appConfig().backendDomain + this.path; + } + } +} diff --git a/myteamwallet_backend/src/files/files.controller.ts b/myteamwallet_backend/src/files/files.controller.ts new file mode 100644 index 0000000..0580f42 --- /dev/null +++ b/myteamwallet_backend/src/files/files.controller.ts @@ -0,0 +1,48 @@ +import { + Controller, + Get, + Param, + Post, + Response, + UploadedFile, + UseGuards, + UseInterceptors, +} from '@nestjs/common'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { ApiBearerAuth, ApiBody, ApiConsumes, ApiTags } from '@nestjs/swagger'; +import { AuthGuard } from '@nestjs/passport'; +import { FilesService } from './files.service'; + +@ApiTags('Files') +@Controller({ + path: 'files', + version: '1', +}) +export class FilesController { + constructor(private readonly filesService: FilesService) {} + + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @Post('upload') + @ApiConsumes('multipart/form-data') + @ApiBody({ + schema: { + type: 'object', + properties: { + file: { + type: 'string', + format: 'binary', + }, + }, + }, + }) + @UseInterceptors(FileInterceptor('file')) + async uploadFile(@UploadedFile() file) { + return this.filesService.uploadFile(file); + } + + @Get(':path') + download(@Param('path') path, @Response() response) { + return response.sendFile(path, { root: './files' }); + } +} diff --git a/myteamwallet_backend/src/files/files.module.ts b/myteamwallet_backend/src/files/files.module.ts new file mode 100644 index 0000000..96715a1 --- /dev/null +++ b/myteamwallet_backend/src/files/files.module.ts @@ -0,0 +1,90 @@ +import { HttpException, HttpStatus, Module } from '@nestjs/common'; +import { FilesController } from './files.controller'; +import { MulterModule } from '@nestjs/platform-express'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { diskStorage } from 'multer'; +import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; +import * as AWS from 'aws-sdk'; +import * as multerS3 from 'multer-s3'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { FileEntity } from './entities/file.entity'; +import { FilesService } from './files.service'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([FileEntity]), + MulterModule.registerAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (configService: ConfigService) => { + const storages = { + local: () => + diskStorage({ + destination: './files', + filename: (request, file, callback) => { + callback( + null, + `${randomStringGenerator()}.${file.originalname + .split('.') + .pop() + .toLowerCase()}`, + ); + }, + }), + s3: () => { + const s3 = new AWS.S3(); + AWS.config.update({ + accessKeyId: configService.get('file.accessKeyId'), + secretAccessKey: configService.get('file.secretAccessKey'), + region: configService.get('file.awsS3Region'), + }); + + return multerS3({ + s3: s3, + bucket: configService.get('file.awsDefaultS3Bucket'), + acl: 'public-read', + contentType: multerS3.AUTO_CONTENT_TYPE, + key: (request, file, callback) => { + callback( + null, + `${randomStringGenerator()}.${file.originalname + .split('.') + .pop() + .toLowerCase()}`, + ); + }, + }); + }, + }; + + return { + fileFilter: (request, file, callback) => { + if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/i)) { + return callback( + new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + file: `cantUploadFileType`, + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ), + false, + ); + } + + callback(null, true); + }, + storage: storages[configService.get('file.driver')](), + limits: { + fileSize: configService.get('file.maxFileSize'), + }, + }; + }, + }), + ], + controllers: [FilesController], + providers: [ConfigModule, ConfigService, FilesService], +}) +export class FilesModule {} diff --git a/myteamwallet_backend/src/files/files.service.ts b/myteamwallet_backend/src/files/files.service.ts new file mode 100644 index 0000000..ca14db2 --- /dev/null +++ b/myteamwallet_backend/src/files/files.service.ts @@ -0,0 +1,39 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { InjectRepository } from '@nestjs/typeorm'; +import { FileEntity } from './entities/file.entity'; +import { Repository } from 'typeorm'; + +@Injectable() +export class FilesService { + constructor( + private readonly configService: ConfigService, + @InjectRepository(FileEntity) + private fileRepository: Repository, + ) {} + + async uploadFile(file): Promise { + if (!file) { + throw new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: { + file: 'selectFile', + }, + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ); + } + + const path = { + local: `/${this.configService.get('app.apiPrefix')}/v1/${file.path}`, + s3: file.location, + }; + + return this.fileRepository.save( + this.fileRepository.create({ + path: path[this.configService.get('file.driver')], + }), + ); + } +} diff --git a/myteamwallet_backend/src/forgot/entities/forgot.entity.ts b/myteamwallet_backend/src/forgot/entities/forgot.entity.ts new file mode 100644 index 0000000..efb26e9 --- /dev/null +++ b/myteamwallet_backend/src/forgot/entities/forgot.entity.ts @@ -0,0 +1,35 @@ +import { + Column, + CreateDateColumn, + Entity, + Index, + ManyToOne, + PrimaryGeneratedColumn, + DeleteDateColumn, +} from 'typeorm'; +import { User } from '../../users/entities/user.entity'; +import { Allow } from 'class-validator'; +import { EntityHelper } from 'src/utils/entity-helper'; + +@Entity() +export class Forgot extends EntityHelper { + @PrimaryGeneratedColumn() + id: number; + + @Allow() + @Column() + @Index() + hash: string; + + @Allow() + @ManyToOne(() => User, { + eager: true, + }) + user: User; + + @CreateDateColumn() + createdAt: Date; + + @DeleteDateColumn() + deletedAt: Date; +} diff --git a/myteamwallet_backend/src/forgot/forgot.module.ts b/myteamwallet_backend/src/forgot/forgot.module.ts new file mode 100644 index 0000000..e2d6d99 --- /dev/null +++ b/myteamwallet_backend/src/forgot/forgot.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Forgot } from './entities/forgot.entity'; +import { ForgotService } from './forgot.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Forgot])], + providers: [ForgotService], + exports: [ForgotService], +}) +export class ForgotModule {} diff --git a/myteamwallet_backend/src/forgot/forgot.service.ts b/myteamwallet_backend/src/forgot/forgot.service.ts new file mode 100644 index 0000000..c44aad7 --- /dev/null +++ b/myteamwallet_backend/src/forgot/forgot.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { DeepPartial } from 'src/utils/types/deep-partial.type'; +import { FindOptions } from 'src/utils/types/find-options.type'; +import { Repository } from 'typeorm'; +import { Forgot } from './entities/forgot.entity'; + +@Injectable() +export class ForgotService { + constructor( + @InjectRepository(Forgot) + private forgotRepository: Repository, + ) {} + + async findOne(options: FindOptions) { + return this.forgotRepository.findOne({ + where: options.where, + }); + } + + async findMany(options: FindOptions) { + return this.forgotRepository.find({ + where: options.where, + }); + } + + async create(data: DeepPartial) { + return this.forgotRepository.save(this.forgotRepository.create(data)); + } + + async softDelete(id: number): Promise { + await this.forgotRepository.softDelete(id); + } +} diff --git a/myteamwallet_backend/src/home/home.controller.ts b/myteamwallet_backend/src/home/home.controller.ts new file mode 100644 index 0000000..f55dba0 --- /dev/null +++ b/myteamwallet_backend/src/home/home.controller.ts @@ -0,0 +1,15 @@ +import { Controller, Get } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; + +import { HomeService } from './home.service'; + +@ApiTags('Home') +@Controller() +export class HomeController { + constructor(private service: HomeService) {} + + @Get() + appInfo() { + return this.service.appInfo(); + } +} diff --git a/myteamwallet_backend/src/home/home.module.ts b/myteamwallet_backend/src/home/home.module.ts new file mode 100644 index 0000000..c48f86c --- /dev/null +++ b/myteamwallet_backend/src/home/home.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { HomeService } from './home.service'; +import { HomeController } from './home.controller'; +import { ConfigModule } from '@nestjs/config'; + +@Module({ + imports: [ConfigModule], + controllers: [HomeController], + providers: [HomeService], +}) +export class HomeModule {} diff --git a/myteamwallet_backend/src/home/home.service.ts b/myteamwallet_backend/src/home/home.service.ts new file mode 100644 index 0000000..9a20ba4 --- /dev/null +++ b/myteamwallet_backend/src/home/home.service.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export class HomeService { + constructor(private configService: ConfigService) {} + + appInfo() { + return { name: this.configService.get('app.name') }; + } +} diff --git a/myteamwallet_backend/src/i18n/en/common.json b/myteamwallet_backend/src/i18n/en/common.json new file mode 100644 index 0000000..b7a2419 --- /dev/null +++ b/myteamwallet_backend/src/i18n/en/common.json @@ -0,0 +1,4 @@ +{ + "confirmEmail": "Confirm email", + "resetPassword": "Reset password" +} diff --git a/myteamwallet_backend/src/i18n/en/confirm-email.json b/myteamwallet_backend/src/i18n/en/confirm-email.json new file mode 100644 index 0000000..0eb981d --- /dev/null +++ b/myteamwallet_backend/src/i18n/en/confirm-email.json @@ -0,0 +1,5 @@ +{ + "text1": "Hey!", + "text2": "You’re almost ready to start enjoying", + "text3": "Simply click the big green button below to verify your email address." +} diff --git a/myteamwallet_backend/src/i18n/en/reset-password.json b/myteamwallet_backend/src/i18n/en/reset-password.json new file mode 100644 index 0000000..6cae96a --- /dev/null +++ b/myteamwallet_backend/src/i18n/en/reset-password.json @@ -0,0 +1,6 @@ +{ + "text1": "Trouble signing in?", + "text2": "Resetting your password is easy.", + "text3": "Just press the button below and follow the instructions. We’ll have you up and running in no time.", + "text4": "If you did not make this request then please ignore this email." +} diff --git a/myteamwallet_backend/src/mail/interfaces/mail-data.interface.ts b/myteamwallet_backend/src/mail/interfaces/mail-data.interface.ts new file mode 100644 index 0000000..14e189e --- /dev/null +++ b/myteamwallet_backend/src/mail/interfaces/mail-data.interface.ts @@ -0,0 +1,4 @@ +export interface MailData { + to: string; + data: T; +} diff --git a/myteamwallet_backend/src/mail/mail-config.service.ts b/myteamwallet_backend/src/mail/mail-config.service.ts new file mode 100644 index 0000000..4a6cba6 --- /dev/null +++ b/myteamwallet_backend/src/mail/mail-config.service.ts @@ -0,0 +1,43 @@ +import * as path from 'path'; +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { MailerOptions, MailerOptionsFactory } from '@nestjs-modules/mailer'; +import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter'; + +@Injectable() +export class MailConfigService implements MailerOptionsFactory { + constructor(private configService: ConfigService) {} + + createMailerOptions(): MailerOptions { + return { + transport: { + host: this.configService.get('mail.host'), + port: this.configService.get('mail.port'), + ignoreTLS: this.configService.get('mail.ignoreTLS'), + secure: this.configService.get('mail.secure'), + requireTLS: this.configService.get('mail.requireTLS'), + auth: { + user: this.configService.get('mail.user'), + pass: this.configService.get('mail.password'), + }, + }, + defaults: { + from: `"${this.configService.get( + 'mail.defaultName', + )}" <${this.configService.get('mail.defaultEmail')}>`, + }, + template: { + dir: path.join( + this.configService.get('app.workingDirectory'), + 'src', + 'mail', + 'mail-templates', + ), + adapter: new HandlebarsAdapter(), + options: { + strict: true, + }, + }, + } as MailerOptions; + } +} diff --git a/myteamwallet_backend/src/mail/mail-templates/activation.hbs b/myteamwallet_backend/src/mail/mail-templates/activation.hbs new file mode 100644 index 0000000..edee05e --- /dev/null +++ b/myteamwallet_backend/src/mail/mail-templates/activation.hbs @@ -0,0 +1,33 @@ + + + + + + + {{title}} + + + + + + + + + + + + + +
+ {{app_name}} +
+ {{text1}}
+ {{text2}} {{app_name}}.
+ {{text3}} +
+ {{actionTitle}} +
+ + + \ No newline at end of file diff --git a/myteamwallet_backend/src/mail/mail-templates/reset-password.hbs b/myteamwallet_backend/src/mail/mail-templates/reset-password.hbs new file mode 100644 index 0000000..3c0e405 --- /dev/null +++ b/myteamwallet_backend/src/mail/mail-templates/reset-password.hbs @@ -0,0 +1,38 @@ + + + + + + + {{title}} + + + + + + + + + + + + + + + + +
+ {{app_name}} +
+ {{text1}}
+ {{text2}}
+ {{text3}} +
+ {{actionTitle}} +
+ {{text4}} +
+ + + \ No newline at end of file diff --git a/myteamwallet_backend/src/mail/mail.module.ts b/myteamwallet_backend/src/mail/mail.module.ts new file mode 100644 index 0000000..4e7ef6c --- /dev/null +++ b/myteamwallet_backend/src/mail/mail.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { MailService } from './mail.service'; + +@Module({ + imports: [ConfigModule], + providers: [MailService], + exports: [MailService], +}) +export class MailModule {} diff --git a/myteamwallet_backend/src/mail/mail.service.ts b/myteamwallet_backend/src/mail/mail.service.ts new file mode 100644 index 0000000..94ce813 --- /dev/null +++ b/myteamwallet_backend/src/mail/mail.service.ts @@ -0,0 +1,62 @@ +import { MailerService } from '@nestjs-modules/mailer'; +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { I18n, I18nRequestScopeService } from 'nestjs-i18n'; +import { MailData } from './interfaces/mail-data.interface'; + +@Injectable() +export class MailService { + constructor( + @I18n() + private i18n: I18nRequestScopeService, + private mailerService: MailerService, + private configService: ConfigService, + ) {} + + async userSignUp(mailData: MailData<{ hash: string }>) { + return; + await this.mailerService.sendMail({ + to: mailData.to, + subject: await this.i18n.t('common.confirmEmail'), + text: `${this.configService.get('app.frontendDomain')}/confirm-email/${ + mailData.data.hash + } ${await this.i18n.t('common.confirmEmail')}`, + template: 'activation', + context: { + title: await this.i18n.t('common.confirmEmail'), + url: `${this.configService.get('app.frontendDomain')}/confirm-email/${ + mailData.data.hash + }`, + actionTitle: await this.i18n.t('common.confirmEmail'), + app_name: this.configService.get('app.name'), + text1: await this.i18n.t('confirm-email.text1'), + text2: await this.i18n.t('confirm-email.text2'), + text3: await this.i18n.t('confirm-email.text3'), + }, + }); + } + + async forgotPassword(mailData: MailData<{ hash: string }>) { + return; + await this.mailerService.sendMail({ + to: mailData.to, + subject: await this.i18n.t('common.resetPassword'), + text: `${this.configService.get('app.frontendDomain')}/password-change/${ + mailData.data.hash + } ${await this.i18n.t('common.resetPassword')}`, + template: 'reset-password', + context: { + title: await this.i18n.t('common.resetPassword'), + url: `${this.configService.get('app.frontendDomain')}/password-change/${ + mailData.data.hash + }`, + actionTitle: await this.i18n.t('common.resetPassword'), + app_name: this.configService.get('app.name'), + text1: await this.i18n.t('reset-password.text1'), + text2: await this.i18n.t('reset-password.text2'), + text3: await this.i18n.t('reset-password.text3'), + text4: await this.i18n.t('reset-password.text4'), + }, + }); + } +} diff --git a/myteamwallet_backend/src/main.ts b/myteamwallet_backend/src/main.ts new file mode 100644 index 0000000..3ce3753 --- /dev/null +++ b/myteamwallet_backend/src/main.ts @@ -0,0 +1,35 @@ +import { ValidationPipe, VersioningType } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { NestFactory } from '@nestjs/core'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { useContainer } from 'class-validator'; +import { AppModule } from './app.module'; +import validationOptions from './utils/validation-options'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule, { cors: true }); + useContainer(app.select(AppModule), { fallbackOnErrors: true }); + const configService = app.get(ConfigService); + + app.enableShutdownHooks(); + app.setGlobalPrefix(configService.get('app.apiPrefix'), { + exclude: ['/'], + }); + app.enableVersioning({ + type: VersioningType.URI, + }); + app.useGlobalPipes(new ValidationPipe(validationOptions)); + + const options = new DocumentBuilder() + .setTitle('API') + .setDescription('API docs') + .setVersion('1.0') + .addBearerAuth() + .build(); + + const document = SwaggerModule.createDocument(app, options); + SwaggerModule.setup('docs', app, document); + + await app.listen(configService.get('app.port')); +} +void bootstrap(); diff --git a/myteamwallet_backend/src/penalty/dto/create-penalty.dto.ts b/myteamwallet_backend/src/penalty/dto/create-penalty.dto.ts new file mode 100644 index 0000000..cad0955 --- /dev/null +++ b/myteamwallet_backend/src/penalty/dto/create-penalty.dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty } from 'class-validator'; +import { Team } from 'src/teams/entities/team.entity'; + +export class CreatePenaltyDTO { + @ApiProperty({ example: 2342 }) + @IsNotEmpty() + teamId: number; + + @ApiProperty({ example: 1 }) + @IsNotEmpty() + amount: number; + + team?: Team; + + @ApiProperty({ example: 'Zu spät kommen' }) + @IsNotEmpty() + description: string; +} diff --git a/myteamwallet_backend/src/penalty/entities/penalty.entity.ts b/myteamwallet_backend/src/penalty/entities/penalty.entity.ts new file mode 100644 index 0000000..3b5e29d --- /dev/null +++ b/myteamwallet_backend/src/penalty/entities/penalty.entity.ts @@ -0,0 +1,29 @@ +import { + Column, + CreateDateColumn, + Entity, + ManyToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { Team } from 'src/teams/entities/team.entity'; + +@Entity() +export class PenaltyEntity extends EntityHelper { + @PrimaryGeneratedColumn() + id: number; + + @ManyToOne(() => Team, { + eager: false, + }) + team: Team; + + @Column({ default: '' }) + description: string; + + @Column({ type: 'decimal', precision: 10, scale: 2, default: 0 }) + amount: number; + + @CreateDateColumn() + createdAt: Date; +} diff --git a/myteamwallet_backend/src/penalty/penalty.controller.ts b/myteamwallet_backend/src/penalty/penalty.controller.ts new file mode 100644 index 0000000..553bca6 --- /dev/null +++ b/myteamwallet_backend/src/penalty/penalty.controller.ts @@ -0,0 +1,45 @@ +import { + Body, + Controller, + Get, + Param, + Post, + Req, + UseGuards, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiBearerAuth } from '@nestjs/swagger'; +import { Roles } from 'src/roles/roles.decorator'; +import { RolesGuard } from 'src/roles/roles.guard'; +import { CreatePenaltyDTO } from './dto/create-penalty.dto'; +import { PenaltyService } from './penalty.service'; + +@ApiBearerAuth() +@Controller({ + path: 'penalty', + version: '1', +}) +export class PenaltyController { + constructor(private service: PenaltyService) {} + + @Roles([]) + @Get() + getIt(@Req() req: any) { + const userId = req.user?.id; + return this.service.getAll(userId); + } + + @Roles([]) + @UseGuards(AuthGuard('jwt'), RolesGuard) + @Get(':id') + getTeams(@Param('id') teamId: string) { + return this.service.getTeamPenalties(teamId); + } + + @UseGuards(AuthGuard('jwt'), RolesGuard) + @Post() + createPenalty(@Req() req: any, @Body() createPenaltyDto: CreatePenaltyDTO) { + const userId = req.user?.id; + return this.service.createPenalty(createPenaltyDto, userId); + } +} diff --git a/myteamwallet_backend/src/penalty/penalty.module.ts b/myteamwallet_backend/src/penalty/penalty.module.ts new file mode 100644 index 0000000..a3208f9 --- /dev/null +++ b/myteamwallet_backend/src/penalty/penalty.module.ts @@ -0,0 +1,30 @@ +import { Module } from '@nestjs/common'; +import { PenaltyController } from './penalty.controller'; +import { PenaltyService } from './penalty.service'; +import { LoggingModule } from 'src/database/logging/logging.module'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { TeamWalletTransactionType } from 'src/team-wallet-transactions/entities/team-wallet-transaction-type.entity'; +import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity'; +import { Team } from 'src/teams/entities/team.entity'; +import { User } from 'src/users/entities/user.entity'; +import { Role } from 'src/roles/entities/role.entity'; +import { PenaltyEntity } from './entities/penalty.entity'; +import { Player } from 'src/players/entities/player.entity'; + +@Module({ + controllers: [PenaltyController], + providers: [PenaltyService], + imports: [ + TypeOrmModule.forFeature([ + User, + Role, + TeamWalletTransaction, + TeamWalletTransactionType, + Team, + PenaltyEntity, + Player, + ]), + LoggingModule, + ], +}) +export class PenaltyModule {} diff --git a/myteamwallet_backend/src/penalty/penalty.service.ts b/myteamwallet_backend/src/penalty/penalty.service.ts new file mode 100644 index 0000000..1e5ece3 --- /dev/null +++ b/myteamwallet_backend/src/penalty/penalty.service.ts @@ -0,0 +1,61 @@ +import { Injectable } from '@nestjs/common'; +import { CreatePenaltyDTO } from './dto/create-penalty.dto'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Team } from 'src/teams/entities/team.entity'; +import { Repository } from 'typeorm'; +import { PenaltyEntity } from './entities/penalty.entity'; +import { Player } from 'src/players/entities/player.entity'; + +@Injectable() +export class PenaltyService { + constructor( + @InjectRepository(Team) + private teamRepository: Repository, + @InjectRepository(Player) + private playerRepository: Repository, + @InjectRepository(PenaltyEntity) + private repository: Repository, + ) {} + + async createPenalty(dto: CreatePenaltyDTO, userId: string) { + const player = await this.playerRepository.findOne({ + where: { user: { id: Number(userId) }, team: { id: dto.teamId } }, + relations: ['team'], + }); + + if (!player || !player.team) { + return; + } + + dto.team = player.team; + + const e = this.repository.create(dto); + + return this.repository.save(e); + } + + getAll(userId: string) { + const id = Number(userId); + + return this.repository.find({ + where: { + team: { players: { user: { id } } }, + }, + relations: ['team'], + }); + } + + async getTeamPenalties(teamId: string | number) { + teamId = Number(teamId); + + const res = await this.repository.find({ + where: { + team: { id: teamId }, + }, + }); + return res.map((r) => { + r.amount = Number(r.amount); + return r; + }); + } +} diff --git a/myteamwallet_backend/src/players/entities/player.entity.ts b/myteamwallet_backend/src/players/entities/player.entity.ts new file mode 100644 index 0000000..bf0a89b --- /dev/null +++ b/myteamwallet_backend/src/players/entities/player.entity.ts @@ -0,0 +1,66 @@ +import { + AfterLoad, + BeforeInsert, + Column, + Entity, + ManyToOne, + OneToMany, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { TeamRole } from 'src/team-roles/entities/team-roles.entity'; +import { Team } from 'src/teams/entities/team.entity'; +import { User } from 'src/users/entities/user.entity'; +import { Transaction } from 'src/transactions/entitites/transaction.entity'; + +@Entity() +export class Player extends EntityHelper { + @PrimaryGeneratedColumn() + id: number; + + @Column() + firstName: string; + + @Column() + lastName: string; + + @ManyToOne(() => TeamRole, { + eager: true, + }) + teamRole?: TeamRole | null; + + @ManyToOne(() => Team, { + eager: true, + }) + team: Team; + + @Column({ type: 'decimal', precision: 10, scale: 2, default: 0 }) + balance: number; + + @ManyToOne(() => User, (user) => user.players, { + eager: true, + }) + user?: User | null; + + @OneToMany(() => Transaction, (transaction) => transaction.player) + transactions: Transaction[]; + + @AfterLoad() + updateValue() { + this.balance = Number(this.balance); + } + + @Column({ default: true }) + active: boolean; + + @BeforeInsert() + prepareData() { + if (this.balance == null) { + this.balance = 0; + } + + if (this.transactions == null) { + this.transactions = []; + } + } +} diff --git a/myteamwallet_backend/src/players/players.module.ts b/myteamwallet_backend/src/players/players.module.ts new file mode 100644 index 0000000..e330235 --- /dev/null +++ b/myteamwallet_backend/src/players/players.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { User } from 'src/users/entities/user.entity'; +import { Player } from './entities/player.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([Player, User])], +}) +export class PlayersModule {} diff --git a/myteamwallet_backend/src/roles/entities/role.entity.ts b/myteamwallet_backend/src/roles/entities/role.entity.ts new file mode 100644 index 0000000..05b397a --- /dev/null +++ b/myteamwallet_backend/src/roles/entities/role.entity.ts @@ -0,0 +1,16 @@ +import { Column, Entity, PrimaryColumn } from 'typeorm'; +import { ApiProperty } from '@nestjs/swagger'; +import { Allow } from 'class-validator'; +import { EntityHelper } from 'src/utils/entity-helper'; + +@Entity() +export class Role extends EntityHelper { + @ApiProperty({ example: 1 }) + @PrimaryColumn() + id: number; + + @Allow() + @ApiProperty({ example: 'Admin' }) + @Column() + name?: string; +} diff --git a/myteamwallet_backend/src/roles/roles.decorator.ts b/myteamwallet_backend/src/roles/roles.decorator.ts new file mode 100644 index 0000000..4878e3c --- /dev/null +++ b/myteamwallet_backend/src/roles/roles.decorator.ts @@ -0,0 +1,3 @@ +import { SetMetadata } from '@nestjs/common'; + +export const Roles = (roles: number[]) => SetMetadata('roles', roles); diff --git a/myteamwallet_backend/src/roles/roles.enum.ts b/myteamwallet_backend/src/roles/roles.enum.ts new file mode 100644 index 0000000..a092681 --- /dev/null +++ b/myteamwallet_backend/src/roles/roles.enum.ts @@ -0,0 +1,4 @@ +export enum RoleEnum { + 'admin' = 1, + 'user' = 2, +} diff --git a/myteamwallet_backend/src/roles/roles.guard.ts b/myteamwallet_backend/src/roles/roles.guard.ts new file mode 100644 index 0000000..ad0ebe4 --- /dev/null +++ b/myteamwallet_backend/src/roles/roles.guard.ts @@ -0,0 +1,20 @@ +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const roles = this.reflector.getAllAndOverride('roles', [ + context.getClass(), + context.getHandler(), + ]); + + if (!roles || !roles.length) { + return true; + } + const request = context.switchToHttp().getRequest(); + return roles.includes(request.user?.role?.id); + } +} diff --git a/myteamwallet_backend/src/social/interfaces/social.interface.ts b/myteamwallet_backend/src/social/interfaces/social.interface.ts new file mode 100644 index 0000000..90bb515 --- /dev/null +++ b/myteamwallet_backend/src/social/interfaces/social.interface.ts @@ -0,0 +1,6 @@ +export interface SocialInterface { + id: string; + firstName?: string; + lastName?: string; + email?: string; +} diff --git a/myteamwallet_backend/src/social/tokens.ts b/myteamwallet_backend/src/social/tokens.ts new file mode 100644 index 0000000..4db5d01 --- /dev/null +++ b/myteamwallet_backend/src/social/tokens.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Allow, IsNotEmpty } from 'class-validator'; + +export class Tokens { + @ApiProperty() + @IsNotEmpty() + token1: string; + + @Allow() + @ApiProperty() + token2?: string; +} diff --git a/myteamwallet_backend/src/statuses/entities/status.entity.ts b/myteamwallet_backend/src/statuses/entities/status.entity.ts new file mode 100644 index 0000000..71f6e2c --- /dev/null +++ b/myteamwallet_backend/src/statuses/entities/status.entity.ts @@ -0,0 +1,16 @@ +import { Column, Entity, PrimaryColumn } from 'typeorm'; +import { ApiProperty } from '@nestjs/swagger'; +import { Allow } from 'class-validator'; +import { EntityHelper } from 'src/utils/entity-helper'; + +@Entity() +export class Status extends EntityHelper { + @ApiProperty({ example: 1 }) + @PrimaryColumn() + id: number; + + @Allow() + @ApiProperty({ example: 'Active' }) + @Column() + name?: string; +} diff --git a/myteamwallet_backend/src/statuses/statuses.enum.ts b/myteamwallet_backend/src/statuses/statuses.enum.ts new file mode 100644 index 0000000..d80db88 --- /dev/null +++ b/myteamwallet_backend/src/statuses/statuses.enum.ts @@ -0,0 +1,4 @@ +export enum StatusEnum { + 'active' = 1, + 'inactive' = 2, +} diff --git a/myteamwallet_backend/src/team-roles/entities/team-roles.entity.ts b/myteamwallet_backend/src/team-roles/entities/team-roles.entity.ts new file mode 100644 index 0000000..7b1bfdd --- /dev/null +++ b/myteamwallet_backend/src/team-roles/entities/team-roles.entity.ts @@ -0,0 +1,16 @@ +import { Column, Entity, PrimaryColumn } from 'typeorm'; +import { ApiProperty } from '@nestjs/swagger'; +import { Allow } from 'class-validator'; +import { EntityHelper } from 'src/utils/entity-helper'; + +@Entity() +export class TeamRole extends EntityHelper { + @ApiProperty({ example: 1 }) + @PrimaryColumn() + id: number; + + @Allow() + @ApiProperty({ example: 'player' }) + @Column() + name?: string; +} diff --git a/myteamwallet_backend/src/team-roles/team-roles.decorator.ts b/myteamwallet_backend/src/team-roles/team-roles.decorator.ts new file mode 100644 index 0000000..784de44 --- /dev/null +++ b/myteamwallet_backend/src/team-roles/team-roles.decorator.ts @@ -0,0 +1,4 @@ +import { SetMetadata } from '@nestjs/common'; + +export const TeamRoles = (...teamRoles: number[]) => + SetMetadata('teamRoles', teamRoles); diff --git a/myteamwallet_backend/src/team-roles/team-roles.enum.ts b/myteamwallet_backend/src/team-roles/team-roles.enum.ts new file mode 100644 index 0000000..9f66746 --- /dev/null +++ b/myteamwallet_backend/src/team-roles/team-roles.enum.ts @@ -0,0 +1,7 @@ +export enum TeamRolesEnum { + 'player' = 1, + 'scnd_treasurer' = 2, + 'captain' = 3, + 'treasurer' = 4, + 'coach' = 5, +} diff --git a/myteamwallet_backend/src/team-roles/team-roles.guard.ts b/myteamwallet_backend/src/team-roles/team-roles.guard.ts new file mode 100644 index 0000000..b62a141 --- /dev/null +++ b/myteamwallet_backend/src/team-roles/team-roles.guard.ts @@ -0,0 +1,20 @@ +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; + +@Injectable() +export class TeamRolesGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const roles = this.reflector.getAllAndOverride('teamRoles', [ + context.getClass(), + context.getHandler(), + ]); + if (!roles.length) { + return true; + } + const request = context.switchToHttp().getRequest(); + + return roles.includes(request.user?.teamRoles?.id); + } +} diff --git a/myteamwallet_backend/src/team-settings/dto/create-team-setting.dto.ts b/myteamwallet_backend/src/team-settings/dto/create-team-setting.dto.ts new file mode 100644 index 0000000..86be0c7 --- /dev/null +++ b/myteamwallet_backend/src/team-settings/dto/create-team-setting.dto.ts @@ -0,0 +1,18 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty } from 'class-validator'; +import { Team } from 'src/teams/entities/team.entity'; +import { TeamSettingType } from 'src/teams/model/team-settings-type'; + +export class CreateTeamSettingDTO { + @ApiProperty({ example: '1. Herren' }) + @IsNotEmpty() + key: TeamSettingType; + + @ApiProperty({ example: '1. Herren' }) + @IsNotEmpty() + value: string; + + @ApiProperty({ example: '1. Herren' }) + @IsNotEmpty() + team: Team; +} diff --git a/myteamwallet_backend/src/team-settings/entities/team-setting.entity.ts b/myteamwallet_backend/src/team-settings/entities/team-setting.entity.ts new file mode 100644 index 0000000..1ec7c40 --- /dev/null +++ b/myteamwallet_backend/src/team-settings/entities/team-setting.entity.ts @@ -0,0 +1,24 @@ +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { ApiProperty } from '@nestjs/swagger'; +import { Allow } from 'class-validator'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { Team } from 'src/teams/entities/team.entity'; +import { TeamSettingType } from 'src/teams/model/team-settings-type'; + +@Entity() +export class TeamSetting extends EntityHelper { + @ApiProperty({ example: 0 }) + @PrimaryGeneratedColumn('increment') + id: number; + + @Allow() + @ApiProperty({ example: 0 }) + @ManyToOne(() => Team, (team) => team.settings) + team: Team; + + @Column() + key: TeamSettingType; + + @Column() + value: string; +} diff --git a/myteamwallet_backend/src/team-settings/team-settings.module.ts b/myteamwallet_backend/src/team-settings/team-settings.module.ts new file mode 100644 index 0000000..fc876b2 --- /dev/null +++ b/myteamwallet_backend/src/team-settings/team-settings.module.ts @@ -0,0 +1,7 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +@Module({ + imports: [TypeOrmModule.forFeature([TeamSettingsModule])], +}) +export class TeamSettingsModule {} diff --git a/myteamwallet_backend/src/team-wallet-transactions/dto/create-team-wallet-transaction.dto.ts b/myteamwallet_backend/src/team-wallet-transactions/dto/create-team-wallet-transaction.dto.ts new file mode 100644 index 0000000..b43c5f4 --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/dto/create-team-wallet-transaction.dto.ts @@ -0,0 +1,23 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty } from 'class-validator'; +import { TeamWalletTransactionEnum } from '../team-wallet-transaction.enum'; + +export class CreateTeamWalletTransactionDto { + @ApiProperty({ example: 0 }) + @IsNotEmpty() + teamId: number; + + @ApiProperty({ example: 'Extra teuer wegen diskutierens' }) + note?: string | null; + + @ApiProperty({ example: 'isotimestring' }) + date: string; + + @ApiProperty({ example: 10 }) + @IsNotEmpty() + amount: number; + + @ApiProperty({ enum: TeamWalletTransactionEnum }) + @IsNotEmpty() + type: TeamWalletTransactionEnum; +} diff --git a/myteamwallet_backend/src/team-wallet-transactions/entities/team-wallet-transaction-type.entity.ts b/myteamwallet_backend/src/team-wallet-transactions/entities/team-wallet-transaction-type.entity.ts new file mode 100644 index 0000000..a0524a8 --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/entities/team-wallet-transaction-type.entity.ts @@ -0,0 +1,16 @@ +import { Column, Entity, PrimaryColumn } from 'typeorm'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { ApiProperty } from '@nestjs/swagger'; +import { Allow } from 'class-validator'; + +@Entity() +export class TeamWalletTransactionType extends EntityHelper { + @ApiProperty({ example: 1 }) + @PrimaryColumn() + id: number; + + @Allow() + @ApiProperty({ example: 'credit' }) + @Column() + name?: string; +} diff --git a/myteamwallet_backend/src/team-wallet-transactions/entities/team-wallet-transaction.entity.ts b/myteamwallet_backend/src/team-wallet-transactions/entities/team-wallet-transaction.entity.ts new file mode 100644 index 0000000..a72d67a --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/entities/team-wallet-transaction.entity.ts @@ -0,0 +1,52 @@ +import { + BeforeInsert, + Column, + CreateDateColumn, + Entity, + ManyToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { TeamWalletTransactionType } from './team-wallet-transaction-type.entity'; +import { Team } from 'src/teams/entities/team.entity'; + +@Entity() +export class TeamWalletTransaction extends EntityHelper { + @PrimaryGeneratedColumn() + id: number; + + @ManyToOne(() => Team, { + eager: false, + }) + team: Team; + + @Column({ default: '' }) + note: string; + + @Column() + date: string; + + @Column({ type: 'decimal', precision: 10, scale: 2, default: 0 }) + amount: number; + + @ManyToOne(() => TeamWalletTransactionType, { + eager: true, + }) + type?: TeamWalletTransactionType | null; + + @CreateDateColumn() + createdAt: Date; + + @BeforeInsert() + async setBalance() { + if (!this.date) { + this.date = new Date().toISOString(); + } + let amount = this.amount; + if (this.type.id > 10 && amount > 0) { + amount = amount * -1; + } + this.team.balance = Number(this.team.balance) + amount; + await this.team.save(); + } +} diff --git a/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.controller.spec.ts b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.controller.spec.ts new file mode 100644 index 0000000..fd309b0 --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TeamWalletTransactionsController } from './team-wallet-transactions.controller'; + +describe('TeamWalletTransactionController', () => { + let controller: TeamWalletTransactionsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [TeamWalletTransactionsController], + }).compile(); + + controller = module.get( + TeamWalletTransactionsController, + ); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.enum.ts b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.enum.ts new file mode 100644 index 0000000..9f4a8bf --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.enum.ts @@ -0,0 +1,4 @@ +export enum TeamWalletTransactionEnum { + 'credit' = 1, + 'expense' = 14, +} diff --git a/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.service.spec.ts b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.service.spec.ts new file mode 100644 index 0000000..b3d53f0 --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transaction.service.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TeamWalletTransactionsService } from './team-wallet-transactions.service'; + +describe('TeamWalletTransactionService', () => { + let service: TeamWalletTransactionsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [TeamWalletTransactionsService], + }).compile(); + + service = module.get( + TeamWalletTransactionsService, + ); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.controller.ts b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.controller.ts new file mode 100644 index 0000000..f2675a6 --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.controller.ts @@ -0,0 +1,43 @@ +import { + Body, + Controller, + HttpCode, + HttpStatus, + Post, + Req, + UseGuards, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; +import { Roles } from 'src/roles/roles.decorator'; +import { RoleEnum } from 'src/roles/roles.enum'; +import { RolesGuard } from 'src/roles/roles.guard'; +import { CreateTeamWalletTransactionDto } from './dto/create-team-wallet-transaction.dto'; +import { TeamWalletTransactionsService } from './team-wallet-transactions.service'; + +@ApiTags('Transactions') +@ApiBearerAuth() +@UseGuards(AuthGuard('jwt'), RolesGuard) +@Controller({ + path: 'team-wallet-transactions', + version: '1', +}) +export class TeamWalletTransactionsController { + constructor( + private teamWalletTransactionsService: TeamWalletTransactionsService, + ) {} + + @Roles([RoleEnum.admin, RoleEnum.user]) + @Post() + @HttpCode(HttpStatus.CREATED) + create( + @Req() req, + @Body() createTransactionDto: CreateTeamWalletTransactionDto, + ) { + const userId = req.user?.id; + return this.teamWalletTransactionsService.create( + createTransactionDto, + userId, + ); + } +} diff --git a/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.module.ts b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.module.ts new file mode 100644 index 0000000..3f618bc --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.module.ts @@ -0,0 +1,24 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { LoggingModule } from 'src/database/logging/logging.module'; +import { Team } from 'src/teams/entities/team.entity'; +import { User } from 'src/users/entities/user.entity'; +import { TeamWalletTransactionType } from './entities/team-wallet-transaction-type.entity'; +import { TeamWalletTransaction } from './entities/team-wallet-transaction.entity'; +import { TeamWalletTransactionsController } from './team-wallet-transactions.controller'; +import { TeamWalletTransactionsService } from './team-wallet-transactions.service'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([ + User, + TeamWalletTransaction, + TeamWalletTransactionType, + Team, + ]), + LoggingModule, + ], + controllers: [TeamWalletTransactionsController], + providers: [TeamWalletTransactionsService], +}) +export class TeamWalletTransactionsModule {} diff --git a/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.service.ts b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.service.ts new file mode 100644 index 0000000..86f449d --- /dev/null +++ b/myteamwallet_backend/src/team-wallet-transactions/team-wallet-transactions.service.ts @@ -0,0 +1,83 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { LoggingService } from 'src/database/logging/logging.service'; +import { Team } from 'src/teams/entities/team.entity'; +import { User } from 'src/users/entities/user.entity'; +import { Repository } from 'typeorm'; +import { CreateTeamWalletTransactionDto } from './dto/create-team-wallet-transaction.dto'; +import { TeamWalletTransactionType } from './entities/team-wallet-transaction-type.entity'; +import { TeamWalletTransaction } from './entities/team-wallet-transaction.entity'; +import { TeamWalletTransactionEnum } from './team-wallet-transaction.enum'; + +@Injectable() +export class TeamWalletTransactionsService { + constructor( + @InjectRepository(User) + private usersRepository: Repository, + @InjectRepository(TeamWalletTransaction) + private teamWalletTransactionRepository: Repository, + @InjectRepository(TeamWalletTransactionType) + private teamWalletTransactionTypeRepository: Repository, + @InjectRepository(Team) + private teamRepository: Repository, + private logger: LoggingService, + ) {} + + async create(data: CreateTeamWalletTransactionDto, userId: string) { + const creatingUser = await this.usersRepository.findOne({ + where: { + id: Number(userId), + }, + relations: ['players', 'players.team', 'players.team.settings'], + }); + + const teamPlayer = creatingUser.players.find( + (p) => + p.team.id == data.teamId && + p.teamRole.id >= + Number( + p.team.settings.find((s) => s.key == 'transaction_create_min_role')[ + 'value' + ], + ), + ); + + if (creatingUser.role.id != 1 && !teamPlayer) { + return; + } + + let team: Team; + if (teamPlayer && teamPlayer.team) { + team = teamPlayer.team; + } else { + team = await this.teamRepository.findOneByOrFail({ + id: data.teamId, + }); + } + + const transactionType = + await this.teamWalletTransactionTypeRepository.findOne({ + where: { + id: TeamWalletTransactionEnum[TeamWalletTransactionEnum[data.type]], + }, + }); + + // darf es anlegen + const transaction = await this.teamWalletTransactionRepository.save( + this.teamWalletTransactionRepository.create({ + amount: data.amount, + team: team, + date: data.date, + type: transactionType, + }), + ); + + await this.logger.info({ + event: 'team_transaction_create', + details: `Teambuchung ${transaction.id} angelegt`, + userId: Number(userId), + }); + + return transaction; + } +} diff --git a/myteamwallet_backend/src/teams/dto/create-team.dto.ts b/myteamwallet_backend/src/teams/dto/create-team.dto.ts new file mode 100644 index 0000000..48f61b1 --- /dev/null +++ b/myteamwallet_backend/src/teams/dto/create-team.dto.ts @@ -0,0 +1,8 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty } from 'class-validator'; + +export class CreateTeamDTO { + @ApiProperty({ example: '1. Herren' }) + @IsNotEmpty() + name: string; +} diff --git a/myteamwallet_backend/src/teams/dto/public-access.dto.ts b/myteamwallet_backend/src/teams/dto/public-access.dto.ts new file mode 100644 index 0000000..8cd835e --- /dev/null +++ b/myteamwallet_backend/src/teams/dto/public-access.dto.ts @@ -0,0 +1,46 @@ +import { IsBoolean } from 'class-validator'; + +export class UpdatePublicAccessDto { + @IsBoolean() + enabled: boolean; +} + +export interface PublicAccessStatusDto { + enabled: boolean; + token: string | null; +} + +export interface PublicPlayerDto { + id: number; + firstName: string; + lastName: string; + balance: number; + active: boolean; +} + +export interface PublicPenaltyDto { + id: number; + description: string; + amount: number; +} + +export interface PublicTransactionDto { + id: number; + note: string; + date: string; + amount: number; + type: { id: number; name: string } | null; +} + +export interface PublicTeamDto { + name: string; + balance: number; + outstanding: number; + players: PublicPlayerDto[]; + penalties: PublicPenaltyDto[]; +} + +export interface PublicPlayerHistoryDto { + player: PublicPlayerDto; + transactions: PublicTransactionDto[]; +} diff --git a/myteamwallet_backend/src/teams/entities/team.entity.ts b/myteamwallet_backend/src/teams/entities/team.entity.ts new file mode 100644 index 0000000..b3e829b --- /dev/null +++ b/myteamwallet_backend/src/teams/entities/team.entity.ts @@ -0,0 +1,60 @@ +import { + AfterLoad, + BeforeInsert, + Column, + Entity, + OneToMany, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { TeamSetting } from 'src/team-settings/entities/team-setting.entity'; +import { Player } from 'src/players/entities/player.entity'; +import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity'; + +@Entity() +export class Team extends EntityHelper { + @PrimaryGeneratedColumn() + id: number; + + @Column() + name: string; + + @Column({ unique: true }) + alias: string; + + @Column({ default: false }) + publicAccessEnabled: boolean; + + @Column({ length: 64, nullable: true, unique: true, select: false }) + publicAccessToken?: string | null; + + @OneToMany(() => TeamSetting, (setting) => setting.team, { + eager: true, + }) + settings: TeamSetting[]; + + @OneToMany(() => TeamWalletTransaction, (transaction) => transaction.team, { + eager: false, + }) + transactions: TeamWalletTransaction[]; + + @Column({ type: 'decimal', precision: 10, scale: 2, default: 0 }) + balance: number; + + @OneToMany(() => Player, (player) => player.team) + players: Player[]; + + outstanding?: number; + + @BeforeInsert() + setAlias() { + if (!this.alias) { + this.alias = Date.now() + ''; + } + } + + @AfterLoad() + updateValue() { + this.balance = Number(this.balance); + } +} diff --git a/myteamwallet_backend/src/teams/model/team-settings-type.ts b/myteamwallet_backend/src/teams/model/team-settings-type.ts new file mode 100644 index 0000000..c85ae3e --- /dev/null +++ b/myteamwallet_backend/src/teams/model/team-settings-type.ts @@ -0,0 +1 @@ +export type TeamSettingType = 'transaction_create_min_role' | ''; diff --git a/myteamwallet_backend/src/teams/public-team-access.service.spec.ts b/myteamwallet_backend/src/teams/public-team-access.service.spec.ts new file mode 100644 index 0000000..a9dbfc6 --- /dev/null +++ b/myteamwallet_backend/src/teams/public-team-access.service.spec.ts @@ -0,0 +1,178 @@ +import { NotFoundException } from '@nestjs/common'; +import { PublicTeamAccessService } from './public-team-access.service'; + +describe('PublicTeamAccessService', () => { + const teamRepository = { + createQueryBuilder: jest.fn(), + findOne: jest.fn(), + save: jest.fn(async (team) => team), + }; + const playerRepository = { find: jest.fn(), findOne: jest.fn() }; + const transactionRepository = { find: jest.fn() }; + const penaltyRepository = { find: jest.fn() }; + const access = { assertMember: jest.fn(), assertManager: jest.fn() }; + let service: PublicTeamAccessService; + + const managedTeam = { + id: 7, + name: 'Team A', + balance: 125, + publicAccessEnabled: false, + publicAccessToken: null, + }; + + beforeEach(() => { + jest.resetAllMocks(); + teamRepository.save.mockImplementation(async (team) => team); + service = new PublicTeamAccessService( + teamRepository as any, + playerRepository as any, + transactionRepository as any, + penaltyRepository as any, + access as any, + ); + }); + + function mockManagedTeam(team = { ...managedTeam }) { + const getOne = jest.fn().mockResolvedValue(team); + teamRepository.createQueryBuilder.mockReturnValue({ + addSelect: jest.fn().mockReturnThis(), + where: jest.fn().mockReturnThis(), + getOne, + }); + return team; + } + + it('creates a 64 character token on first activation', async () => { + const team = mockManagedTeam(); + + const status = await service.setEnabled(4, 7, true); + + expect(access.assertManager).toHaveBeenCalledWith(4, 7); + expect(status.enabled).toBe(true); + expect(status.token).toMatch(/^[a-f0-9]{64}$/); + expect(teamRepository.save).toHaveBeenCalledWith(team); + }); + + it('keeps the existing token when re-enabled', async () => { + mockManagedTeam({ ...managedTeam, publicAccessToken: 'a'.repeat(64) }); + + const status = await service.setEnabled(4, 7, true); + + expect(status.token).toBe('a'.repeat(64)); + }); + + it('rotates the token without changing enabled state', async () => { + mockManagedTeam({ + ...managedTeam, + publicAccessEnabled: true, + publicAccessToken: 'a'.repeat(64), + }); + + const status = await service.rotate(4, 7); + + expect(status.enabled).toBe(true); + expect(status.token).toMatch(/^[a-f0-9]{64}$/); + expect(status.token).not.toBe('a'.repeat(64)); + }); + + it('returns only whitelisted public team fields and active players', async () => { + teamRepository.findOne.mockResolvedValue({ + id: 7, + name: 'Team A', + balance: 125, + }); + playerRepository.find.mockResolvedValue([ + { + id: 3, + firstName: 'Ada', + lastName: 'Lovelace', + balance: -20, + active: true, + user: { email: 'must-not-leak@example.com' }, + }, + ]); + penaltyRepository.find.mockResolvedValue([ + { id: 8, description: 'Zu spät', amount: 5, user: { email: 'hidden' } }, + ]); + + await expect(service.getPublicTeam('b'.repeat(64))).resolves.toEqual({ + name: 'Team A', + balance: 125, + outstanding: 20, + players: [ + { + id: 3, + firstName: 'Ada', + lastName: 'Lovelace', + balance: -20, + active: true, + }, + ], + penalties: [{ id: 8, description: 'Zu spät', amount: 5 }], + }); + }); + + it('rejects a player that does not belong to the shared team', async () => { + teamRepository.findOne.mockResolvedValue({ + id: 7, + name: 'Team A', + balance: 125, + }); + playerRepository.findOne.mockResolvedValue(null); + + await expect( + service.getPublicPlayerHistory('b'.repeat(64), 99), + ).rejects.toBeInstanceOf(NotFoundException); + expect(transactionRepository.find).not.toHaveBeenCalled(); + }); + + it('returns player identity and the latest 20 transactions', async () => { + teamRepository.findOne.mockResolvedValue({ + id: 7, + name: 'Team A', + balance: 125, + }); + playerRepository.findOne.mockResolvedValue({ + id: 3, + firstName: 'Ada', + lastName: 'Lovelace', + balance: -20, + active: true, + }); + transactionRepository.find.mockResolvedValue([ + { + id: 11, + note: 'Training', + date: '2026-07-30', + amount: 5, + type: { id: 11, name: 'fine' }, + player: { id: 3 }, + }, + ]); + + await expect( + service.getPublicPlayerHistory('b'.repeat(64), 3), + ).resolves.toEqual({ + player: { + id: 3, + firstName: 'Ada', + lastName: 'Lovelace', + balance: -20, + active: true, + }, + transactions: [ + { + id: 11, + note: 'Training', + date: '2026-07-30', + amount: 5, + type: { id: 11, name: 'fine' }, + }, + ], + }); + expect(transactionRepository.find).toHaveBeenCalledWith( + expect.objectContaining({ order: { date: 'DESC' }, take: 20 }), + ); + }); +}); diff --git a/myteamwallet_backend/src/teams/public-team-access.service.ts b/myteamwallet_backend/src/teams/public-team-access.service.ts new file mode 100644 index 0000000..fa9093d --- /dev/null +++ b/myteamwallet_backend/src/teams/public-team-access.service.ts @@ -0,0 +1,189 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { randomBytes } from 'crypto'; +import { PenaltyEntity } from '../penalty/entities/penalty.entity'; +import { Player } from '../players/entities/player.entity'; +import { Transaction } from '../transactions/entitites/transaction.entity'; +import { Repository } from 'typeorm'; +import { + PublicAccessStatusDto, + PublicPlayerDto, + PublicPlayerHistoryDto, + PublicTeamDto, + PublicTransactionDto, +} from './dto/public-access.dto'; +import { Team } from './entities/team.entity'; +import { TeamAccessService } from './team-access.service'; + +@Injectable() +export class PublicTeamAccessService { + constructor( + @InjectRepository(Team) + private readonly teamRepository: Repository, + @InjectRepository(Player) + private readonly playerRepository: Repository, + @InjectRepository(Transaction) + private readonly transactionRepository: Repository, + @InjectRepository(PenaltyEntity) + private readonly penaltyRepository: Repository, + private readonly access: TeamAccessService, + ) {} + + async getStatus( + userId: number, + teamId: number, + ): Promise { + await this.access.assertMember(userId, teamId); + return this.toStatus(await this.loadManagedTeam(teamId)); + } + + async setEnabled( + userId: number, + teamId: number, + enabled: boolean, + ): Promise { + await this.access.assertManager(userId, teamId); + const team = await this.loadManagedTeam(teamId); + if (enabled && !team.publicAccessToken) { + team.publicAccessToken = this.createToken(); + } + team.publicAccessEnabled = enabled; + await this.teamRepository.save(team); + return this.toStatus(team); + } + + async rotate(userId: number, teamId: number): Promise { + await this.access.assertManager(userId, teamId); + const team = await this.loadManagedTeam(teamId); + team.publicAccessToken = this.createToken(); + await this.teamRepository.save(team); + return this.toStatus(team); + } + + async getPublicTeam(token: string): Promise { + const team = await this.loadPublicTeam(token); + const [players, penalties] = await Promise.all([ + this.playerRepository.find({ + where: { team: { id: team.id }, active: true }, + order: { lastName: 'ASC', firstName: 'ASC' }, + }), + this.penaltyRepository.find({ + where: { team: { id: team.id } }, + order: { description: 'ASC' }, + }), + ]); + const publicPlayers = players.map((player) => this.toPublicPlayer(player)); + + return { + name: team.name, + balance: Number(team.balance), + outstanding: publicPlayers.reduce( + (total, player) => total - Number(player.balance), + 0, + ), + players: publicPlayers, + penalties: penalties.map((penalty) => ({ + id: penalty.id, + description: penalty.description, + amount: Number(penalty.amount), + })), + }; + } + + async getPublicPlayerHistory( + token: string, + playerId: number, + ): Promise { + const team = await this.loadPublicTeam(token); + const player = await this.playerRepository.findOne({ + where: { id: playerId, team: { id: team.id }, active: true }, + }); + if (!player) throw new NotFoundException('Freigabe nicht gefunden.'); + + return { + player: this.toPublicPlayer(player), + transactions: await this.loadTransactions(player.id), + }; + } + + async getMemberPlayerTransactions( + userId: number, + teamId: number, + playerId: number, + ): Promise { + await this.access.assertMember(userId, teamId); + const player = await this.playerRepository.findOne({ + where: { id: playerId, team: { id: teamId } }, + }); + if (!player) throw new NotFoundException('Spieler nicht gefunden.'); + return this.loadTransactions(player.id); + } + + private async loadManagedTeam(teamId: number): Promise { + const team = await this.teamRepository + .createQueryBuilder('team') + .addSelect('team.publicAccessToken') + .where('team.id = :teamId', { teamId }) + .getOne(); + if (!team) throw new NotFoundException('Team nicht gefunden.'); + return team; + } + + private async loadPublicTeam(token: string): Promise { + if (!/^[a-f0-9]{64}$/.test(token)) { + throw new NotFoundException('Freigabe nicht gefunden.'); + } + const team = await this.teamRepository.findOne({ + where: { publicAccessToken: token, publicAccessEnabled: true }, + select: { + id: true, + name: true, + balance: true, + publicAccessEnabled: true, + publicAccessToken: true, + }, + }); + if (!team) throw new NotFoundException('Freigabe nicht gefunden.'); + return team; + } + + private async loadTransactions( + playerId: number, + ): Promise { + const transactions = await this.transactionRepository.find({ + where: { player: { id: playerId } }, + order: { date: 'DESC' }, + take: 20, + }); + return transactions.map((transaction) => ({ + id: transaction.id, + note: transaction.note, + date: transaction.date, + amount: Number(transaction.amount), + type: transaction.type + ? { id: transaction.type.id, name: transaction.type.name } + : null, + })); + } + + private toPublicPlayer(player: Player): PublicPlayerDto { + return { + id: player.id, + firstName: player.firstName, + lastName: player.lastName, + balance: Number(player.balance), + active: player.active, + }; + } + + private toStatus(team: Team): PublicAccessStatusDto { + return { + enabled: team.publicAccessEnabled, + token: team.publicAccessToken ?? null, + }; + } + + private createToken(): string { + return randomBytes(32).toString('hex'); + } +} diff --git a/myteamwallet_backend/src/teams/public-teams.controller.ts b/myteamwallet_backend/src/teams/public-teams.controller.ts new file mode 100644 index 0000000..9f3e60e --- /dev/null +++ b/myteamwallet_backend/src/teams/public-teams.controller.ts @@ -0,0 +1,20 @@ +import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common'; +import { PublicTeamAccessService } from './public-team-access.service'; + +@Controller({ path: 'public/teams', version: '1' }) +export class PublicTeamsController { + constructor(private readonly publicAccess: PublicTeamAccessService) {} + + @Get(':token') + getTeam(@Param('token') token: string) { + return this.publicAccess.getPublicTeam(token); + } + + @Get(':token/players/:playerId/transactions') + getPlayerHistory( + @Param('token') token: string, + @Param('playerId', ParseIntPipe) playerId: number, + ) { + return this.publicAccess.getPublicPlayerHistory(token, playerId); + } +} diff --git a/myteamwallet_backend/src/teams/team-access.service.spec.ts b/myteamwallet_backend/src/teams/team-access.service.spec.ts new file mode 100644 index 0000000..6e39348 --- /dev/null +++ b/myteamwallet_backend/src/teams/team-access.service.spec.ts @@ -0,0 +1,84 @@ +import { ForbiddenException } from '@nestjs/common'; +import { RoleEnum } from '../roles/roles.enum'; +import { TeamAccessService } from './team-access.service'; + +describe('TeamAccessService', () => { + const userRepository = { findOne: jest.fn() }; + const playerRepository = { find: jest.fn() }; + let service: TeamAccessService; + + beforeEach(() => { + jest.resetAllMocks(); + service = new TeamAccessService( + userRepository as any, + playerRepository as any, + ); + }); + + it('allows a global admin without a team membership', async () => { + userRepository.findOne.mockResolvedValue({ + id: 1, + role: { id: RoleEnum.admin }, + }); + + await expect(service.assertManager(1, 9)).resolves.toBeUndefined(); + expect(playerRepository.find).not.toHaveBeenCalled(); + }); + + it('allows an active team member to read sharing status', async () => { + userRepository.findOne.mockResolvedValue({ + id: 2, + role: { id: RoleEnum.user }, + }); + playerRepository.find.mockResolvedValue([ + { active: true, teamRole: { id: 1 } }, + ]); + + await expect(service.assertMember(2, 9)).resolves.toBeUndefined(); + }); + + it.each([3, 4, 5])( + 'allows active team role %s to manage sharing', + async (roleId) => { + userRepository.findOne.mockResolvedValue({ + id: 2, + role: { id: RoleEnum.user }, + }); + playerRepository.find.mockResolvedValue([ + { active: true, teamRole: { id: roleId } }, + ]); + + await expect(service.assertManager(2, 9)).resolves.toBeUndefined(); + }, + ); + + it('uses the highest role when one user has multiple players in a team', async () => { + userRepository.findOne.mockResolvedValue({ + id: 2, + role: { id: RoleEnum.user }, + }); + playerRepository.find.mockResolvedValue([ + { active: true, teamRole: { id: 1 } }, + { active: true, teamRole: { id: 3 } }, + ]); + + await expect(service.assertManager(2, 9)).resolves.toBeUndefined(); + }); + + it.each([ + ['a player', [{ active: true, teamRole: { id: 1 } }]], + ['a second treasurer', [{ active: true, teamRole: { id: 2 } }]], + ['an inactive captain', [{ active: false, teamRole: { id: 3 } }]], + ['a non-member', []], + ])('rejects %s from managing sharing', async (_label, players) => { + userRepository.findOne.mockResolvedValue({ + id: 2, + role: { id: RoleEnum.user }, + }); + playerRepository.find.mockResolvedValue(players); + + await expect(service.assertManager(2, 9)).rejects.toBeInstanceOf( + ForbiddenException, + ); + }); +}); diff --git a/myteamwallet_backend/src/teams/team-access.service.ts b/myteamwallet_backend/src/teams/team-access.service.ts new file mode 100644 index 0000000..b5bcd38 --- /dev/null +++ b/myteamwallet_backend/src/teams/team-access.service.ts @@ -0,0 +1,47 @@ +import { ForbiddenException, Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Player } from '../players/entities/player.entity'; +import { RoleEnum } from '../roles/roles.enum'; +import { User } from '../users/entities/user.entity'; +import { Repository } from 'typeorm'; + +@Injectable() +export class TeamAccessService { + constructor( + @InjectRepository(User) + private readonly userRepository: Repository, + @InjectRepository(Player) + private readonly playerRepository: Repository, + ) {} + + async assertMember(userId: number, teamId: number): Promise { + await this.assertMinimumRole(userId, teamId, 1); + } + + async assertManager(userId: number, teamId: number): Promise { + await this.assertMinimumRole(userId, teamId, 3); + } + + private async assertMinimumRole( + userId: number, + teamId: number, + minimumRole: number, + ): Promise { + const user = await this.userRepository.findOne({ where: { id: userId } }); + if (user?.role?.id === RoleEnum.admin) return; + + const players = await this.playerRepository.find({ + where: { user: { id: userId }, team: { id: teamId } }, + }); + const highestActiveRole = players + .filter((player) => player.active) + .reduce( + (highest, player) => Math.max(highest, player.teamRole?.id ?? 0), + 0, + ); + + if (highestActiveRole < minimumRole) { + throw new ForbiddenException('Keine Berechtigung für dieses Team.'); + } + } +} diff --git a/myteamwallet_backend/src/teams/teams.controller.spec.ts b/myteamwallet_backend/src/teams/teams.controller.spec.ts new file mode 100644 index 0000000..4cdb9f9 --- /dev/null +++ b/myteamwallet_backend/src/teams/teams.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TeamsController } from './teams.controller'; + +describe('TeamsController', () => { + let controller: TeamsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [TeamsController], + }).compile(); + + controller = module.get(TeamsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/teams/teams.controller.ts b/myteamwallet_backend/src/teams/teams.controller.ts new file mode 100644 index 0000000..da73de9 --- /dev/null +++ b/myteamwallet_backend/src/teams/teams.controller.ts @@ -0,0 +1,140 @@ +import { + Body, + Controller, + Get, + HttpCode, + HttpStatus, + Param, + Post, + Put, + Patch, + ParseIntPipe, + Req, + UseGuards, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; +import { Roles } from 'src/roles/roles.decorator'; +import { RoleEnum } from 'src/roles/roles.enum'; +import { RolesGuard } from 'src/roles/roles.guard'; +import { CreateTeamDTO } from './dto/create-team.dto'; +import { TeamsService } from './teams.service'; +import { PublicTeamAccessService } from './public-team-access.service'; +import { UpdatePublicAccessDto } from './dto/public-access.dto'; + +@ApiTags('Teams') +@Controller({ + path: 'teams', + version: '1', +}) +export class TeamsController { + constructor( + private service: TeamsService, + private publicAccess: PublicTeamAccessService, + ) {} + + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @Get(':id/public-access') + getPublicAccess(@Req() req, @Param('id', ParseIntPipe) id: number) { + return this.publicAccess.getStatus(Number(req.user.id), id); + } + + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @Patch(':id/public-access') + setPublicAccess( + @Req() req, + @Param('id', ParseIntPipe) id: number, + @Body() body: UpdatePublicAccessDto, + ) { + return this.publicAccess.setEnabled(Number(req.user.id), id, body.enabled); + } + + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @Post(':id/public-access/rotate') + rotatePublicAccess(@Req() req, @Param('id', ParseIntPipe) id: number) { + return this.publicAccess.rotate(Number(req.user.id), id); + } + + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @Get(':id/players/:playerId/transactions') + getPlayerTransactions( + @Req() req, + @Param('id', ParseIntPipe) id: number, + @Param('playerId', ParseIntPipe) playerId: number, + ) { + return this.publicAccess.getMemberPlayerTransactions( + Number(req.user.id), + id, + playerId, + ); + } + + @ApiBearerAuth() + @Roles([RoleEnum.user, RoleEnum.admin]) + @UseGuards(AuthGuard('jwt'), RolesGuard) + @Get(':id/overview') + @HttpCode(HttpStatus.OK) + findOne(@Param('id') id: string) { + return this.service.getOverview(id); + } + + @ApiOperation({ + summary: 'Transactionen für ein Team', + description: + 'Gibt alle Transaktionen, Spieler und Teamwallet, für ein bestimmtes Team zurück und sortiert absteigend nach Datum', + }) + @ApiBearerAuth() + @Roles([RoleEnum.user, RoleEnum.admin]) + @UseGuards(AuthGuard('jwt'), RolesGuard) + @Get(':id/transactions') + @HttpCode(HttpStatus.OK) + getAllTransactions(@Req() req, @Param('id') id: string) { + const userId = req.user?.id; + return this.service.getTeamTransactions(id, userId); + } + + @ApiOperation({ + summary: 'Neuen Spieler anlegen', + description: + 'Erstellt einen neuen Spieler für das Team mit der ID aus der URL', + }) + @ApiBearerAuth() + @Roles([RoleEnum.user, RoleEnum.admin]) + @UseGuards(AuthGuard('jwt'), RolesGuard) + @Post(':id/players') + @HttpCode(HttpStatus.CREATED) + createPlayer(@Param('id') id: string, @Body() playerDto: any) { + return this.service.createNewPlayer(id, playerDto); + } + + @Roles([RoleEnum.user, RoleEnum.admin]) + @UseGuards(AuthGuard('jwt'), RolesGuard) + @ApiOperation({ + summary: 'Spieler updaten', + description: 'verändert den Spieler mit der team id', + }) + @Put(':id/players') + @HttpCode(HttpStatus.CREATED) + updatePlayer(@Param('id') id: string, @Body() playerDto: any) { + return this.service.updatePlayer(playerDto); + } + + @ApiOperation({ + summary: 'Neues Team anlegen', + description: + 'Erstellt ein neues Team mit gegebenem Namen und gibt es zurück.', + }) + @ApiBearerAuth() + @Roles([RoleEnum.admin]) + @UseGuards(AuthGuard('jwt'), RolesGuard) + @Post() + @HttpCode(HttpStatus.CREATED) + create(@Req() req, @Body() teamDto: CreateTeamDTO) { + const userId = req.user?.id; + return this.service.createNewTeam(teamDto, userId); + } +} diff --git a/myteamwallet_backend/src/teams/teams.module.ts b/myteamwallet_backend/src/teams/teams.module.ts new file mode 100644 index 0000000..fb5e832 --- /dev/null +++ b/myteamwallet_backend/src/teams/teams.module.ts @@ -0,0 +1,35 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { LoggingModule } from 'src/database/logging/logging.module'; +import { Player } from 'src/players/entities/player.entity'; +import { TeamRole } from 'src/team-roles/entities/team-roles.entity'; +import { TeamSetting } from 'src/team-settings/entities/team-setting.entity'; +import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity'; +import { Transaction } from 'src/transactions/entitites/transaction.entity'; +import { Team } from './entities/team.entity'; +import { TeamsController } from './teams.controller'; +import { TeamsService } from './teams.service'; +import { User } from '../users/entities/user.entity'; +import { TeamAccessService } from './team-access.service'; +import { PublicTeamAccessService } from './public-team-access.service'; +import { PublicTeamsController } from './public-teams.controller'; +import { PenaltyEntity } from '../penalty/entities/penalty.entity'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([ + Team, + Player, + Transaction, + TeamRole, + TeamSetting, + TeamWalletTransaction, + User, + PenaltyEntity, + ]), + LoggingModule, + ], + controllers: [TeamsController, PublicTeamsController], + providers: [TeamsService, TeamAccessService, PublicTeamAccessService], +}) +export class TeamsModule {} diff --git a/myteamwallet_backend/src/teams/teams.service.spec.ts b/myteamwallet_backend/src/teams/teams.service.spec.ts new file mode 100644 index 0000000..88b4987 --- /dev/null +++ b/myteamwallet_backend/src/teams/teams.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TeamsService } from './teams.service'; + +describe('TeamsService', () => { + let service: TeamsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [TeamsService], + }).compile(); + + service = module.get(TeamsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/teams/teams.service.ts b/myteamwallet_backend/src/teams/teams.service.ts new file mode 100644 index 0000000..0d42752 --- /dev/null +++ b/myteamwallet_backend/src/teams/teams.service.ts @@ -0,0 +1,254 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { LoggingService } from 'src/database/logging/logging.service'; +import { Player } from 'src/players/entities/player.entity'; +import { TeamRole } from 'src/team-roles/entities/team-roles.entity'; +import { CreateTeamSettingDTO } from 'src/team-settings/dto/create-team-setting.dto'; +import { TeamSetting } from 'src/team-settings/entities/team-setting.entity'; +import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity'; +import { Transaction } from 'src/transactions/entitites/transaction.entity'; +import { Repository } from 'typeorm'; +import { CreateTeamDTO } from './dto/create-team.dto'; +import { Team } from './entities/team.entity'; + +@Injectable() +export class TeamsService { + constructor( + @InjectRepository(Team) + private repository: Repository, + @InjectRepository(Player) + private playerRepository: Repository, + @InjectRepository(Transaction) + private transactionsRepository: Repository, + @InjectRepository(TeamRole) + private rolesRepository: Repository, + @InjectRepository(TeamSetting) + private settingsRepository: Repository, + @InjectRepository(TeamWalletTransaction) + private teamWalletTransactionRepository: Repository, + private logger: LoggingService, + ) {} + + async getOverview(teamId: string) { + const id = Number(teamId); + + const team = await this.repository.findOneOrFail({ + where: { id }, + relations: ['players'], + }); + + if (team.players) { + const out = team.players + .filter((p) => p.active) + .reduce((acc, succ) => acc + Number(succ.balance), 0); + team.outstanding = out * -1; + } else { + team.outstanding = 0; + } + team.balance = Number(team.balance); + + return team; + } + + async getOverviewByAlias(alias: string) { + const team = await this.repository.findOneOrFail({ + where: { alias }, + relations: ['players'], + }); + + if (team.players) { + const out = team.players + .filter((p) => p.active) + .reduce((acc, succ) => acc + Number(succ.balance), 0); + team.outstanding = out * -1; + } else { + team.outstanding = 0; + } + return team; + } + + async getUserTransactionsFromTeam(teamId: string, userId: string) { + const player = await this.playerRepository.findOne({ + where: { id: Number(userId) }, + relations: ['transactions'], + }); + + if (!player) { + throw new HttpException( + { + status: HttpStatus.NOT_FOUND, + errors: { + user: 'user_not_found', + }, + }, + HttpStatus.NOT_FOUND, + ); + } + const transactions = await this.transactionsRepository.find({ + where: { + player: { + id: player.id, + }, + }, + order: { + date: 'DESC', + }, + take: 20, + }); + return transactions; + } + + async createNewPlayer( + id: string, + player: { firstName: string; lastName: string; teamRole: any }, + ) { + if (typeof player.teamRole == 'string') { + player.teamRole = await this.rolesRepository.findOneBy({ + name: player.teamRole, + }); + } else if (typeof player.teamRole == 'number') { + player.teamRole = await this.rolesRepository.findOneBy({ + id: player.teamRole, + }); + } else if (!player.teamRole) { + player.teamRole = await this.rolesRepository.findOneBy({ + id: 1, // player + }); + } + const team = await this.repository.findOneBy({ + id: Number(id), + }); + + if (!team) { + throw new HttpException('No Team Found', HttpStatus.UNPROCESSABLE_ENTITY); + } + const p = { + ...player, + team, + }; + + const created: Player = this.playerRepository.create(p); + + const playerSaved: Player = await this.playerRepository.save(created); + + await this.logger.info({ + event: 'player_creation', + details: `Spieler ${playerSaved.id}, ${p.firstName} ${p.lastName} erstellt`, + userId: Number(id), + }); + return playerSaved; + } + + async createNewTeam(teamdto: CreateTeamDTO, userId: string) { + const createTeam = this.repository.create(teamdto); + + const team = await this.repository.save(createTeam); + await this.generateBasicTeamSettings(team); + + await this.logger.info({ + event: 'team_create', + details: `created team id: ${team.id}`, + userId: Number(userId), + }); + return team; + } + + private generateBasicTeamSettings(team: Team): Promise { + return new Promise(async (resolve) => { + const s: CreateTeamSettingDTO = { + key: 'transaction_create_min_role', + value: '2', + team, + }; + + const setting = this.settingsRepository.create(s); + await this.settingsRepository.save(setting); + resolve(); + }); + } + + async getTeamTransactions(teamId: string | number, userId: string | number) { + const start = new Date(); + teamId = Number(teamId); + + const team = await this.repository.findOneOrFail({ + where: { + id: teamId, + }, + relations: ['players', 'players.transactions', 'transactions'], + }); + + const transactions = []; + + for (const t of team.transactions) { + transactions.push({ + id: t.id, + date: t.date, + amount: t.amount, + type: t.type.name, + note: t.note, + isTeamWalletTransaction: true, + }); + } + + for (const p of team.players) { + for (const t of p.transactions) { + transactions.push({ + id: t.id, + date: t.date, + amount: t.amount, + type: t.type.name, + note: t.note, + playerName: p.firstName + ' ' + p.lastName, + isTeamWalletTransaction: false, + }); + } + } + + const result = transactions.sort((a, b) => (a.date < b.date ? 1 : -1)); + const duration = new Date().getTime() - start.getTime(); + + await this.logger.debug({ + event: 'team_transaction_get', + details: `load ${result.length} transactions for TeamID: ${team.id}`, + userId: Number(userId), + duration, + }); + return result; + } + + async updatePlayer(playerDTO: any) { + const player = await this.playerRepository.findOneOrFail({ + where: { + id: playerDTO.id, + }, + relations: ['teamRole', 'transactions', 'team', 'transactions.type'], + }); + + player.active = playerDTO.active; + player.balance = playerDTO.balance; + player.firstName = playerDTO.firstName; + player.lastName = playerDTO.lastName; + + if (player.teamRole.id != playerDTO.teamRole.id) { + player.teamRole = await this.rolesRepository.findOneByOrFail({ + id: playerDTO.reamRole.id, + }); + } + let balance = player.balance; + if (!player.active && player.balance != 0) { + player.balance = 0; + } else if (player.active && player.balance == 0) { + balance = player.transactions.reduce((acc, succ) => { + let b = succ.amount; + if (succ.type?.id > 10 && succ.amount > 0) { + b = b * -1; + } + return acc + b; + }, 0); + player.balance = balance; + } + const res = await this.playerRepository.save(player); + return res; + } +} diff --git a/myteamwallet_backend/src/transactions/dto/create-transaction.dto.ts b/myteamwallet_backend/src/transactions/dto/create-transaction.dto.ts new file mode 100644 index 0000000..e172a4a --- /dev/null +++ b/myteamwallet_backend/src/transactions/dto/create-transaction.dto.ts @@ -0,0 +1,26 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsIn, IsNotEmpty, IsNumber, IsPositive, Max } from 'class-validator'; +import { TransactionTypeEnum } from '../transaction-type.enum'; + +export class CreateTransactionDto { + @ApiProperty({ example: 0 }) + @IsNotEmpty() + playerId: number; + + @ApiProperty({ example: 'Extra teuer wegen diskutierens' }) + note?: string | null; + + @ApiProperty({ example: 'isotimestring' }) + @IsNotEmpty() + date: string; + + @ApiProperty({ example: 10 }) + @IsNumber({ maxDecimalPlaces: 2 }) + @IsPositive() + @Max(10000) + amount: number; + + @ApiProperty({ enum: TransactionTypeEnum }) + @IsIn(Object.values(TransactionTypeEnum).filter((v) => typeof v === 'number')) + type: TransactionTypeEnum; +} diff --git a/myteamwallet_backend/src/transactions/entitites/transaction-type.entity.ts b/myteamwallet_backend/src/transactions/entitites/transaction-type.entity.ts new file mode 100644 index 0000000..7719acc --- /dev/null +++ b/myteamwallet_backend/src/transactions/entitites/transaction-type.entity.ts @@ -0,0 +1,16 @@ +import { Column, Entity, PrimaryColumn } from 'typeorm'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { ApiProperty } from '@nestjs/swagger'; +import { Allow } from 'class-validator'; + +@Entity() +export class TransactionType extends EntityHelper { + @ApiProperty({ example: 1 }) + @PrimaryColumn() + id: number; + + @Allow() + @ApiProperty({ example: 'credit' }) + @Column() + name?: string; +} diff --git a/myteamwallet_backend/src/transactions/entitites/transaction.entity.ts b/myteamwallet_backend/src/transactions/entitites/transaction.entity.ts new file mode 100644 index 0000000..4199908 --- /dev/null +++ b/myteamwallet_backend/src/transactions/entitites/transaction.entity.ts @@ -0,0 +1,62 @@ +import { + AfterLoad, + BeforeInsert, + Column, + CreateDateColumn, + Entity, + ManyToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { Player } from 'src/players/entities/player.entity'; +import { TransactionType } from './transaction-type.entity'; + +@Entity() +export class Transaction extends EntityHelper { + @PrimaryGeneratedColumn() + id: number; + + @ManyToOne(() => Player, { + eager: false, + }) + player: Player; + + @Column() + note: string; + + @Column() + date: string; + + @Column({ type: 'decimal', precision: 10, scale: 2, default: 0 }) + amount: number; + + @ManyToOne(() => TransactionType, { + eager: true, + }) + type?: TransactionType | null; + + @CreateDateColumn() + createdAt: Date; + + @BeforeInsert() + async setBalance() { + if (!this.date) { + this.date = new Date().toISOString(); + } + let amount = this.amount; + if (this.type.id > 10 && amount > 0) { + amount = amount * -1; + } + this.player.balance = Number(this.player.balance) + amount; + if (this.type.id == 0) { + this.player.team.balance = Number(this.player.team.balance) + amount; + await this.player.team.save(); + } + await this.player.save(); + } + + @AfterLoad() + updateValue() { + this.amount = Number(this.amount); + } +} diff --git a/myteamwallet_backend/src/transactions/transaction-type.enum.ts b/myteamwallet_backend/src/transactions/transaction-type.enum.ts new file mode 100644 index 0000000..018a970 --- /dev/null +++ b/myteamwallet_backend/src/transactions/transaction-type.enum.ts @@ -0,0 +1,7 @@ +export enum TransactionTypeEnum { + 'payment' = 0, + 'credit' = 1, + 'fine' = 11, + 'levy' = 12, + 'fee' = 13, +} diff --git a/myteamwallet_backend/src/transactions/transactions.controller.spec.ts b/myteamwallet_backend/src/transactions/transactions.controller.spec.ts new file mode 100644 index 0000000..1c6d2dd --- /dev/null +++ b/myteamwallet_backend/src/transactions/transactions.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TransactionsController } from './transactions.controller'; + +describe('TransactionsController', () => { + let controller: TransactionsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [TransactionsController], + }).compile(); + + controller = module.get(TransactionsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/transactions/transactions.controller.ts b/myteamwallet_backend/src/transactions/transactions.controller.ts new file mode 100644 index 0000000..320e4d3 --- /dev/null +++ b/myteamwallet_backend/src/transactions/transactions.controller.ts @@ -0,0 +1,52 @@ +import { + Body, + Controller, + HttpCode, + HttpStatus, + Param, + Post, + Req, + UseGuards, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; +import { Roles } from 'src/roles/roles.decorator'; +import { RoleEnum } from 'src/roles/roles.enum'; +import { RolesGuard } from 'src/roles/roles.guard'; +import { CreateTransactionDto } from './dto/create-transaction.dto'; +import { TransactionsService } from './transactions.service'; + +@ApiTags('Transactions') +@ApiBearerAuth() +@UseGuards(AuthGuard('jwt'), RolesGuard) +@Controller({ + path: 'transactions', + version: '1', +}) +export class TransactionsController { + constructor(private transactionsService: TransactionsService) {} + + @Roles([RoleEnum.admin, RoleEnum.user]) + @Post() + @HttpCode(HttpStatus.CREATED) + create(@Req() req, @Body() createTransactionDtos: CreateTransactionDto[]) { + const userId = req.user?.id; + return this.transactionsService.createTransactions( + createTransactionDtos, + userId, + ); + } + + @ApiOperation({ + summary: 'Buchung stornieren', + description: + 'Erstellt eine Ausgleichsbuchung, die eine fehlerhafte Buchung rückgängig macht. Die Originalbuchung bleibt zur Nachvollziehbarkeit erhalten.', + }) + @Roles([RoleEnum.admin, RoleEnum.user]) + @Post(':id/reverse') + @HttpCode(HttpStatus.CREATED) + reverse(@Req() req, @Param('id') id: string) { + const userId = req.user?.id; + return this.transactionsService.reverse(Number(id), userId); + } +} diff --git a/myteamwallet_backend/src/transactions/transactions.module.ts b/myteamwallet_backend/src/transactions/transactions.module.ts new file mode 100644 index 0000000..7493d07 --- /dev/null +++ b/myteamwallet_backend/src/transactions/transactions.module.ts @@ -0,0 +1,26 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { TransactionType } from './entitites/transaction-type.entity'; +import { Transaction } from './entitites/transaction.entity'; +import { TransactionsService } from './transactions.service'; +import { TransactionsController } from './transactions.controller'; +import { Player } from 'src/players/entities/player.entity'; +import { User } from 'src/users/entities/user.entity'; +import { TeamSetting } from 'src/team-settings/entities/team-setting.entity'; +import { LoggingModule } from 'src/database/logging/logging.module'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([ + TransactionType, + Transaction, + Player, + User, + TeamSetting, + ]), + LoggingModule, + ], + providers: [TransactionsService], + controllers: [TransactionsController], +}) +export class TransactionsModule {} diff --git a/myteamwallet_backend/src/transactions/transactions.service.spec.ts b/myteamwallet_backend/src/transactions/transactions.service.spec.ts new file mode 100644 index 0000000..8c7b3d9 --- /dev/null +++ b/myteamwallet_backend/src/transactions/transactions.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TransactionsService } from './transactions.service'; + +describe('TransactionsService', () => { + let service: TransactionsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [TransactionsService], + }).compile(); + + service = module.get(TransactionsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/transactions/transactions.service.ts b/myteamwallet_backend/src/transactions/transactions.service.ts new file mode 100644 index 0000000..48b01e6 --- /dev/null +++ b/myteamwallet_backend/src/transactions/transactions.service.ts @@ -0,0 +1,188 @@ +import { + BadRequestException, + ForbiddenException, + Injectable, + NotFoundException, +} from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { LoggingService } from 'src/database/logging/logging.service'; +import { Player } from 'src/players/entities/player.entity'; +import { RoleEnum } from 'src/roles/roles.enum'; +import { User } from 'src/users/entities/user.entity'; +import { Repository } from 'typeorm'; +import { CreateTransactionDto } from './dto/create-transaction.dto'; +import { TransactionType } from './entitites/transaction-type.entity'; +import { Transaction } from './entitites/transaction.entity'; +import { TransactionTypeEnum } from './transaction-type.enum'; + +@Injectable() +export class TransactionsService { + constructor( + @InjectRepository(Transaction) + private transactionsRepository: Repository, + @InjectRepository(Player) + private playersRepository: Repository, + @InjectRepository(TransactionType) + private transactionTypesRepository: Repository, + @InjectRepository(User) + private usersRepository: Repository, + private logger: LoggingService, + ) {} + + async createTransactions(data: CreateTransactionDto[], userId: string) { + const res = []; + for (const d of data) { + const r = await this.create(d, userId); + res.push(r); + } + return res; + } + async create(data: CreateTransactionDto, userId: string) { + const player = await this.playersRepository.findOne({ + where: { id: data.playerId }, + }); + + const creatingUser = await this.usersRepository.findOne({ + where: { + id: Number(userId), + }, + relations: ['players'], + }); + + const transactionType = await this.transactionTypesRepository.findOne({ + where: { id: TransactionTypeEnum[TransactionTypeEnum[data.type]] }, + }); + + if (creatingUser.role.id != RoleEnum.admin) { + if ( + !player || + !transactionType || + !creatingUser || + !creatingUser.players || + creatingUser.players.length == 0 + ) { + await this.logger.warn({ + event: 'transaction_create_fail', + details: `Player: ${data.playerId}, amount: ${data.amount}, typeEnum: ${data.type}`, + userId: Number(userId), + }); + + return; + } + + const teamPlayer = creatingUser.players.find( + (p) => + p.team.id == player.team.id && + p.teamRole.id >= + Number( + player.team.settings.find( + (s) => s.key == 'transaction_create_min_role', + )['value'], + ), + ); + + if (!teamPlayer) { + return; + } + } + + const transaction = this.transactionsRepository.create({ + amount: data.amount, + date: data.date, + player: player, + note: data.note || '', + type: transactionType, + }); + + await this.logger.info({ + event: 'transaction_create', + details: `Player: ${transaction.player.id}, amount: ${transaction.amount}, type: ${transaction.type?.name}`, + userId: Number(userId), + }); + + return this.transactionsRepository.save(transaction); + } + + async reverse(transactionId: number, userId: string) { + const original = await this.transactionsRepository.findOne({ + where: { id: transactionId }, + relations: ['player', 'type'], + }); + + if (!original) { + throw new NotFoundException('Buchung nicht gefunden'); + } + + if (original.note?.startsWith('Stornierung von Buchung #')) { + throw new BadRequestException( + 'Eine Stornobuchung kann nicht erneut storniert werden', + ); + } + + const alreadyReversed = await this.transactionsRepository.findOne({ + where: { + player: { id: original.player.id }, + note: `Stornierung von Buchung #${original.id}`, + }, + }); + if (alreadyReversed) { + throw new BadRequestException('Diese Buchung wurde bereits storniert'); + } + + const creatingUser = await this.usersRepository.findOne({ + where: { id: Number(userId) }, + relations: ['players'], + }); + + if (creatingUser.role.id != RoleEnum.admin) { + const teamPlayer = creatingUser.players?.find( + (p) => + p.team.id == original.player.team.id && + p.teamRole.id >= + Number( + original.player.team.settings.find( + (s) => s.key == 'transaction_create_min_role', + )?.['value'] ?? 0, + ), + ); + + if (!teamPlayer) { + throw new ForbiddenException( + 'Keine Berechtigung, diese Buchung zu stornieren', + ); + } + } + + const originalAmount = Math.abs(Number(original.amount)); + let reversalType = original.type; + let reversalAmount = -originalAmount; + + // Buchungstypen > 10 (z.B. Strafe/Umlage/Gebühr) ziehen im Entity-Hook + // immer vom Guthaben ab, egal welches Vorzeichen der Betrag hat. Um sie + // auszugleichen, wird die Gegenbuchung stattdessen als "credit" gebucht. + if (original.type.id > 10) { + reversalType = await this.transactionTypesRepository.findOne({ + where: { id: TransactionTypeEnum.credit }, + }); + reversalAmount = originalAmount; + } + + const reversal = this.transactionsRepository.create({ + amount: reversalAmount, + date: new Date().toISOString(), + player: original.player, + note: `Stornierung von Buchung #${original.id}`, + type: reversalType, + }); + + const saved = await this.transactionsRepository.save(reversal); + + await this.logger.info({ + event: 'transaction_reverse', + details: `Buchung #${original.id} storniert durch Buchung #${saved.id}, Player: ${original.player.id}, amount: ${original.amount}`, + userId: Number(userId), + }); + + return saved; + } +} diff --git a/myteamwallet_backend/src/translate/model/translation.entity.ts b/myteamwallet_backend/src/translate/model/translation.entity.ts new file mode 100644 index 0000000..aba6515 --- /dev/null +++ b/myteamwallet_backend/src/translate/model/translation.entity.ts @@ -0,0 +1,17 @@ +import { Column, Entity, PrimaryColumn } from 'typeorm'; +import { ApiProperty } from '@nestjs/swagger'; +import { EntityHelper } from 'src/utils/entity-helper'; + +@Entity() +export class Translation extends EntityHelper { + @ApiProperty({ example: 1 }) + @PrimaryColumn() + key: string; + + @PrimaryColumn() + language: 'de' | 'en'; + + @ApiProperty({ example: 'Admin' }) + @Column() + value: string; +} diff --git a/myteamwallet_backend/src/translate/translate.controller.spec.ts b/myteamwallet_backend/src/translate/translate.controller.spec.ts new file mode 100644 index 0000000..91b3dd4 --- /dev/null +++ b/myteamwallet_backend/src/translate/translate.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TranslateController } from './translate.controller'; + +describe('TranslateController', () => { + let controller: TranslateController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [TranslateController], + }).compile(); + + controller = module.get(TranslateController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/translate/translate.controller.ts b/myteamwallet_backend/src/translate/translate.controller.ts new file mode 100644 index 0000000..b182fa6 --- /dev/null +++ b/myteamwallet_backend/src/translate/translate.controller.ts @@ -0,0 +1,16 @@ +import { Controller, Get, HttpCode, HttpStatus, Param } from '@nestjs/common'; +import { TranslateService } from './translate.service'; + +@Controller({ + path: 'translations', + version: '1', +}) +export class TranslateController { + constructor(private translateService: TranslateService) {} + + @Get(':language') + @HttpCode(HttpStatus.OK) + getTranslations(@Param('language') language: any) { + return this.translateService.getTranslations(language); + } +} diff --git a/myteamwallet_backend/src/translate/translate.module.ts b/myteamwallet_backend/src/translate/translate.module.ts new file mode 100644 index 0000000..c61b5db --- /dev/null +++ b/myteamwallet_backend/src/translate/translate.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Translation } from './model/translation.entity'; +import { TranslateController } from './translate.controller'; +import { TranslateService } from './translate.service'; + +@Module({ + controllers: [TranslateController], + providers: [TranslateService], + imports: [TypeOrmModule.forFeature([Translation])], +}) +export class TranslateModule {} diff --git a/myteamwallet_backend/src/translate/translate.service.spec.ts b/myteamwallet_backend/src/translate/translate.service.spec.ts new file mode 100644 index 0000000..55e0990 --- /dev/null +++ b/myteamwallet_backend/src/translate/translate.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TranslateService } from './translate.service'; + +describe('TranslateService', () => { + let service: TranslateService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [TranslateService], + }).compile(); + + service = module.get(TranslateService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/myteamwallet_backend/src/translate/translate.service.ts b/myteamwallet_backend/src/translate/translate.service.ts new file mode 100644 index 0000000..6b6efa4 --- /dev/null +++ b/myteamwallet_backend/src/translate/translate.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Translation } from './model/translation.entity'; + +@Injectable() +export class TranslateService { + constructor( + @InjectRepository(Translation) + private translationsRepository: Repository, + ) {} + + async getTranslations(language: 'de' | 'en') { + const db = await this.translationsRepository.findBy({ + language: language, + }); + + const result = {}; + for (const d of db) { + result[d.key] = d.value; + } + return result; + } +} diff --git a/myteamwallet_backend/src/users/dto/create-user.dto.ts b/myteamwallet_backend/src/users/dto/create-user.dto.ts new file mode 100644 index 0000000..c208f8f --- /dev/null +++ b/myteamwallet_backend/src/users/dto/create-user.dto.ts @@ -0,0 +1,64 @@ +import { Transform } from 'class-transformer'; +import { ApiProperty } from '@nestjs/swagger'; +import { Role } from '../../roles/entities/role.entity'; +import { + IsEmail, + IsNotEmpty, + IsOptional, + MinLength, + Validate, +} from 'class-validator'; +import { Status } from '../../statuses/entities/status.entity'; +import { IsNotExist } from '../../utils/validators/is-not-exists.validator'; +import { FileEntity } from '../../files/entities/file.entity'; +import { IsExist } from '../../utils/validators/is-exists.validator'; + +export class CreateUserDto { + @ApiProperty({ example: 'test1@example.com' }) + @Transform(({ value }) => value?.toLowerCase().trim()) + @IsNotEmpty() + @Validate(IsNotExist, ['User'], { + message: 'emailAlreadyExists', + }) + @IsEmail() + email: string | null; + + @ApiProperty() + @MinLength(6) + password?: string; + + provider?: string; + + socialId?: string | null; + + @ApiProperty({ example: 'John' }) + @IsNotEmpty() + firstName: string | null; + + @ApiProperty({ example: 'Doe' }) + @IsNotEmpty() + lastName: string | null; + + @ApiProperty({ type: () => FileEntity }) + @IsOptional() + @Validate(IsExist, ['FileEntity', 'id'], { + message: 'imageNotExists', + }) + photo?: FileEntity | null; + + @ApiProperty({ type: Role }) + @Validate(IsExist, ['Role', 'id'], { + message: 'roleNotExists', + }) + role?: Role | null; + + @ApiProperty({ type: Status }) + @Validate(IsExist, ['Status', 'id'], { + message: 'statusNotExists', + }) + status?: Status; + + hash?: string | null; + + linkPlayerId?: number | null; +} diff --git a/myteamwallet_backend/src/users/dto/update-user.dto.ts b/myteamwallet_backend/src/users/dto/update-user.dto.ts new file mode 100644 index 0000000..6072a33 --- /dev/null +++ b/myteamwallet_backend/src/users/dto/update-user.dto.ts @@ -0,0 +1,62 @@ +import { PartialType } from '@nestjs/swagger'; +import { CreateUserDto } from './create-user.dto'; + +import { Transform } from 'class-transformer'; +import { ApiProperty } from '@nestjs/swagger'; +import { Role } from '../../roles/entities/role.entity'; +import { IsEmail, IsOptional, MinLength, Validate } from 'class-validator'; +import { Status } from '../../statuses/entities/status.entity'; +import { IsNotExist } from '../../utils/validators/is-not-exists.validator'; +import { FileEntity } from '../../files/entities/file.entity'; +import { IsExist } from '../../utils/validators/is-exists.validator'; + +export class UpdateUserDto extends PartialType(CreateUserDto) { + @ApiProperty({ example: 'test1@example.com' }) + @Transform(({ value }) => value?.toLowerCase().trim()) + @IsOptional() + @Validate(IsNotExist, ['User'], { + message: 'emailAlreadyExists', + }) + @IsEmail() + email?: string | null; + + @ApiProperty() + @IsOptional() + @MinLength(6) + password?: string; + + provider?: string; + + socialId?: string | null; + + @ApiProperty({ example: 'John' }) + @IsOptional() + firstName?: string | null; + + @ApiProperty({ example: 'Doe' }) + @IsOptional() + lastName?: string | null; + + @ApiProperty({ type: () => FileEntity }) + @IsOptional() + @Validate(IsExist, ['FileEntity', 'id'], { + message: 'imageNotExists', + }) + photo?: FileEntity | null; + + @ApiProperty({ type: Role }) + @IsOptional() + @Validate(IsExist, ['Role', 'id'], { + message: 'roleNotExists', + }) + role?: Role | null; + + @ApiProperty({ type: Status }) + @IsOptional() + @Validate(IsExist, ['Status', 'id'], { + message: 'statusNotExists', + }) + status?: Status; + + hash?: string | null; +} diff --git a/myteamwallet_backend/src/users/entities/user.entity.ts b/myteamwallet_backend/src/users/entities/user.entity.ts new file mode 100644 index 0000000..8a8d007 --- /dev/null +++ b/myteamwallet_backend/src/users/entities/user.entity.ts @@ -0,0 +1,100 @@ +import { + Column, + AfterLoad, + CreateDateColumn, + DeleteDateColumn, + Entity, + Index, + ManyToOne, + PrimaryGeneratedColumn, + UpdateDateColumn, + BeforeInsert, + BeforeUpdate, + OneToMany, +} from 'typeorm'; +import { Role } from '../../roles/entities/role.entity'; +import { Status } from '../../statuses/entities/status.entity'; +import { FileEntity } from '../../files/entities/file.entity'; +import * as bcrypt from 'bcryptjs'; +import { EntityHelper } from 'src/utils/entity-helper'; +import { AuthProvidersEnum } from 'src/auth/auth-providers.enum'; +import { Exclude, Expose } from 'class-transformer'; +import { Player } from 'src/players/entities/player.entity'; + +@Entity() +export class User extends EntityHelper { + @PrimaryGeneratedColumn() + id: number; + + @Column({ unique: true, nullable: true }) + email: string | null; + + @Column({ nullable: true }) + @Exclude({ toPlainOnly: true }) + password: string; + + @Exclude({ toPlainOnly: true }) + public previousPassword: string; + + @AfterLoad() + public loadPreviousPassword(): void { + this.previousPassword = this.password; + } + + @BeforeInsert() + @BeforeUpdate() + async setPassword() { + if (this.previousPassword !== this.password && this.password) { + const salt = await bcrypt.genSalt(); + this.password = await bcrypt.hash(this.password, salt); + } + } + + @Column({ default: AuthProvidersEnum.email }) + @Expose({ groups: ['exposeProvider'] }) + provider: string; + + @Index() + @Column({ nullable: true }) + socialId: string | null; + + @Index() + @Column({ nullable: true }) + firstName: string | null; + + @Index() + @Column({ nullable: true }) + lastName: string | null; + + @ManyToOne(() => FileEntity, { + eager: true, + }) + photo?: FileEntity | null; + + @ManyToOne(() => Role, { + eager: true, + }) + role?: Role | null; + + @ManyToOne(() => Status, { + eager: true, + }) + status?: Status; + + @OneToMany(() => Player, (player) => player.user) + players: Player[]; + + @Column({ nullable: true }) + @Index() + @Exclude({ toPlainOnly: true }) + hash: string | null; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; + + @DeleteDateColumn() + deletedAt: Date; +} diff --git a/myteamwallet_backend/src/users/users.controller.ts b/myteamwallet_backend/src/users/users.controller.ts new file mode 100644 index 0000000..57f4f54 --- /dev/null +++ b/myteamwallet_backend/src/users/users.controller.ts @@ -0,0 +1,89 @@ +import { + Controller, + Get, + Post, + Body, + Patch, + Param, + Delete, + UseGuards, + Query, + DefaultValuePipe, + ParseIntPipe, + HttpStatus, + HttpCode, +} from '@nestjs/common'; +import { UsersService } from './users.service'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UpdateUserDto } from './dto/update-user.dto'; +import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { Roles } from 'src/roles/roles.decorator'; +import { RoleEnum } from 'src/roles/roles.enum'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from 'src/roles/roles.guard'; +import { infinityPagination } from 'src/utils/infinity-pagination'; + +@ApiBearerAuth() +@UseGuards(AuthGuard('jwt'), RolesGuard) +@ApiTags('Users') +@Controller({ + path: 'users', + version: '1', +}) +export class UsersController { + constructor(private readonly usersService: UsersService) {} + + @Roles([RoleEnum.admin]) + @Post() + @HttpCode(HttpStatus.CREATED) + create(@Body() createProfileDto: CreateUserDto) { + return this.usersService.create(createProfileDto); + } + + @Roles([RoleEnum.admin]) + @Get() + @HttpCode(HttpStatus.OK) + async findAll( + @Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number, + @Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number, + ) { + if (limit > 50) { + limit = 50; + } + + return infinityPagination( + await this.usersService.findManyWithPagination({ + page, + limit, + }), + { page, limit }, + ); + } + + @Roles([RoleEnum.admin]) + @Get(':id') + @HttpCode(HttpStatus.OK) + findOne(@Param('id') id: string) { + return this.usersService.findOne({ id: +id }); + } + + @Roles([RoleEnum.user, RoleEnum.admin]) + @Get(':id/teams') + @HttpCode(HttpStatus.OK) + findTeamsOfPlayer(@Param('id') id: string) { + return this.usersService.findTeams({ id: +id }); + } + + @Roles([RoleEnum.admin]) + @Patch(':id') + @HttpCode(HttpStatus.OK) + update(@Param('id') id: number, @Body() updateProfileDto: UpdateUserDto) { + return this.usersService.update(id, updateProfileDto); + } + + @Roles([RoleEnum.admin]) + @Delete(':id') + remove(@Param('id') id: number) { + return this.usersService.softDelete(id); + } +} diff --git a/myteamwallet_backend/src/users/users.module.ts b/myteamwallet_backend/src/users/users.module.ts new file mode 100644 index 0000000..39bb9a6 --- /dev/null +++ b/myteamwallet_backend/src/users/users.module.ts @@ -0,0 +1,17 @@ +import { Module } from '@nestjs/common'; +import { UsersService } from './users.service'; +import { UsersController } from './users.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { User } from './entities/user.entity'; +import { IsExist } from 'src/utils/validators/is-exists.validator'; +import { IsNotExist } from 'src/utils/validators/is-not-exists.validator'; +import { Team } from 'src/teams/entities/team.entity'; +import { Player } from 'src/players/entities/player.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([User, Team, Player])], + controllers: [UsersController], + providers: [IsExist, IsNotExist, UsersService], + exports: [UsersService], +}) +export class UsersModule {} diff --git a/myteamwallet_backend/src/users/users.service.ts b/myteamwallet_backend/src/users/users.service.ts new file mode 100644 index 0000000..e7ddc52 --- /dev/null +++ b/myteamwallet_backend/src/users/users.service.ts @@ -0,0 +1,80 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Player } from 'src/players/entities/player.entity'; +import { EntityCondition } from 'src/utils/types/entity-condition.type'; +import { IPaginationOptions } from 'src/utils/types/pagination-options'; +import { Repository } from 'typeorm'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UpdateUserDto } from './dto/update-user.dto'; +import { User } from './entities/user.entity'; + +@Injectable() +export class UsersService { + constructor( + @InjectRepository(User) + private usersRepository: Repository, + @InjectRepository(Player) + private playersRepository: Repository, + ) {} + + create(createProfileDto: CreateUserDto) { + return this.usersRepository.save( + this.usersRepository.create(createProfileDto), + ); + } + + findManyWithPagination(paginationOptions: IPaginationOptions) { + return this.usersRepository.find({ + skip: (paginationOptions.page - 1) * paginationOptions.limit, + take: paginationOptions.limit, + }); + } + + findOne(fields: EntityCondition) { + return this.usersRepository.findOne({ + where: fields, + }); + } + + update(id: number, updateProfileDto: UpdateUserDto) { + return this.usersRepository.save( + this.usersRepository.create({ + id, + ...updateProfileDto, + }), + ); + } + + async softDelete(id: number): Promise { + await this.usersRepository.softDelete(id); + } + + async findTeams(fields: EntityCondition) { + const user = await this.findOne(fields); + if (!user) { + return []; + } + + const players = await this.playersRepository.find({ + where: { + user: { + id: user.id, + }, + }, + relations: ['team'], + }); + return players; + } + + async linkPlayerToUserId(user: User, playerId: number): Promise { + return new Promise(async (resolve) => { + const player = await this.playersRepository.findOneByOrFail({ + id: playerId, + }); + + player.user = user; + await this.playersRepository.save(player); + return resolve(true); + }); + } +} diff --git a/myteamwallet_backend/src/utils/entity-helper.ts b/myteamwallet_backend/src/utils/entity-helper.ts new file mode 100644 index 0000000..1e755bb --- /dev/null +++ b/myteamwallet_backend/src/utils/entity-helper.ts @@ -0,0 +1,15 @@ +import { instanceToPlain } from 'class-transformer'; +import { AfterLoad, BaseEntity } from 'typeorm'; + +export class EntityHelper extends BaseEntity { + __entity?: string; + + @AfterLoad() + setEntityName() { + this.__entity = this.constructor.name; + } + + toJSON() { + return instanceToPlain(this); + } +} diff --git a/myteamwallet_backend/src/utils/infinity-pagination.ts b/myteamwallet_backend/src/utils/infinity-pagination.ts new file mode 100644 index 0000000..38bf91d --- /dev/null +++ b/myteamwallet_backend/src/utils/infinity-pagination.ts @@ -0,0 +1,11 @@ +import { IPaginationOptions } from './types/pagination-options'; + +export const infinityPagination = ( + data: T[], + options: IPaginationOptions, +) => { + return { + data, + hasNextPage: data.length === options.limit, + }; +}; diff --git a/myteamwallet_backend/src/utils/types/deep-partial.type.ts b/myteamwallet_backend/src/utils/types/deep-partial.type.ts new file mode 100644 index 0000000..8e28c69 --- /dev/null +++ b/myteamwallet_backend/src/utils/types/deep-partial.type.ts @@ -0,0 +1,7 @@ +export declare type DeepPartial = { + [P in keyof T]?: T[P] extends Array + ? Array> + : T[P] extends ReadonlyArray + ? ReadonlyArray> + : DeepPartial | T[P]; +}; diff --git a/myteamwallet_backend/src/utils/types/entity-condition.type.ts b/myteamwallet_backend/src/utils/types/entity-condition.type.ts new file mode 100644 index 0000000..6297d29 --- /dev/null +++ b/myteamwallet_backend/src/utils/types/entity-condition.type.ts @@ -0,0 +1,3 @@ +import { FindOptionsWhere } from 'typeorm'; + +export type EntityCondition = FindOptionsWhere; diff --git a/myteamwallet_backend/src/utils/types/find-options.type.ts b/myteamwallet_backend/src/utils/types/find-options.type.ts new file mode 100644 index 0000000..ecdb75d --- /dev/null +++ b/myteamwallet_backend/src/utils/types/find-options.type.ts @@ -0,0 +1,5 @@ +import { EntityCondition } from './entity-condition.type'; + +export type FindOptions = { + where: EntityCondition[] | EntityCondition; +}; diff --git a/myteamwallet_backend/src/utils/types/pagination-options.ts b/myteamwallet_backend/src/utils/types/pagination-options.ts new file mode 100644 index 0000000..7616a0b --- /dev/null +++ b/myteamwallet_backend/src/utils/types/pagination-options.ts @@ -0,0 +1,4 @@ +export interface IPaginationOptions { + page: number; + limit: number; +} diff --git a/myteamwallet_backend/src/utils/validation-options.ts b/myteamwallet_backend/src/utils/validation-options.ts new file mode 100644 index 0000000..c972b3b --- /dev/null +++ b/myteamwallet_backend/src/utils/validation-options.ts @@ -0,0 +1,30 @@ +import { + HttpException, + HttpStatus, + ValidationError, + ValidationPipeOptions, +} from '@nestjs/common'; + +const validationOptions: ValidationPipeOptions = { + transform: true, + whitelist: true, + errorHttpStatusCode: HttpStatus.UNPROCESSABLE_ENTITY, + exceptionFactory: (errors: ValidationError[]) => + new HttpException( + { + status: HttpStatus.UNPROCESSABLE_ENTITY, + errors: errors.reduce( + (accumulator, currentValue) => ({ + ...accumulator, + [currentValue.property]: Object.values( + currentValue.constraints, + ).join(', '), + }), + {}, + ), + }, + HttpStatus.UNPROCESSABLE_ENTITY, + ), +}; + +export default validationOptions; diff --git a/myteamwallet_backend/src/utils/validators/is-exists.validator.ts b/myteamwallet_backend/src/utils/validators/is-exists.validator.ts new file mode 100644 index 0000000..08fa645 --- /dev/null +++ b/myteamwallet_backend/src/utils/validators/is-exists.validator.ts @@ -0,0 +1,32 @@ +import { + ValidatorConstraint, + ValidatorConstraintInterface, +} from 'class-validator'; +import { DataSource } from 'typeorm'; +import { InjectDataSource } from '@nestjs/typeorm'; +import { ValidationArguments } from 'class-validator/types/validation/ValidationArguments'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +@ValidatorConstraint({ name: 'IsExist', async: true }) +export class IsExist implements ValidatorConstraintInterface { + constructor( + @InjectDataSource() + private dataSource: DataSource, + ) {} + + async validate(value: string, validationArguments: ValidationArguments) { + const repository = validationArguments.constraints[0]; + const pathToProperty = validationArguments.constraints[1]; + const entity: unknown = await this.dataSource + .getRepository(repository) + .findOne({ + where: { + [pathToProperty ? pathToProperty : validationArguments.property]: + pathToProperty ? value?.[pathToProperty] : value, + }, + }); + + return Boolean(entity); + } +} diff --git a/myteamwallet_backend/src/utils/validators/is-not-exists.validator.ts b/myteamwallet_backend/src/utils/validators/is-not-exists.validator.ts new file mode 100644 index 0000000..ca15815 --- /dev/null +++ b/myteamwallet_backend/src/utils/validators/is-not-exists.validator.ts @@ -0,0 +1,39 @@ +import { + ValidatorConstraint, + ValidatorConstraintInterface, +} from 'class-validator'; +import { DataSource } from 'typeorm'; +import { ValidationArguments } from 'class-validator/types/validation/ValidationArguments'; +import { Injectable } from '@nestjs/common'; +import { InjectDataSource } from '@nestjs/typeorm'; + +type ValidationEntity = + | { + id?: number | string; + } + | undefined; + +@Injectable() +@ValidatorConstraint({ name: 'IsNotExist', async: true }) +export class IsNotExist implements ValidatorConstraintInterface { + constructor( + @InjectDataSource() + private dataSource: DataSource, + ) {} + + async validate(value: string, validationArguments: ValidationArguments) { + const repository = validationArguments.constraints[0] as string; + const currentValue = validationArguments.object as ValidationEntity; + const entity = (await this.dataSource.getRepository(repository).findOne({ + where: { + [validationArguments.property]: value, + }, + })) as ValidationEntity; + + if (entity?.id === currentValue?.id) { + return true; + } + + return !entity; + } +} diff --git a/myteamwallet_backend/startup.ci.sh b/myteamwallet_backend/startup.ci.sh new file mode 100644 index 0000000..75557d6 --- /dev/null +++ b/myteamwallet_backend/startup.ci.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -e + +/opt/wait-for-it.sh postgres:5432 +npm run migration:run +npm run seed:run +npm run start:prod > /dev/null 2>&1 & +/opt/wait-for-it.sh maildev:1080 +/opt/wait-for-it.sh localhost:3000 +npm run lint +npm run test:e2e -- --runInBand diff --git a/myteamwallet_backend/startup.dev.sh b/myteamwallet_backend/startup.dev.sh new file mode 100644 index 0000000..83b0bb3 --- /dev/null +++ b/myteamwallet_backend/startup.dev.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -e + +/opt/wait-for-it.sh postgres:5432 +npm run migration:run +npm run seed:run +npm run start:prod diff --git a/myteamwallet_backend/test/admin/auth.e2e-spec.ts b/myteamwallet_backend/test/admin/auth.e2e-spec.ts new file mode 100644 index 0000000..1b3c9db --- /dev/null +++ b/myteamwallet_backend/test/admin/auth.e2e-spec.ts @@ -0,0 +1,23 @@ +import * as request from 'supertest'; +import { ADMIN_EMAIL, ADMIN_PASSWORD, APP_URL } from '../utils/constants'; + +describe('Auth admin (e2e)', () => { + const app = APP_URL; + + it('Login: /api/v1/auth/admin/email/login (POST)', () => { + return request(app) + .post('/api/v1/auth/admin/email/login') + .send({ email: ADMIN_EMAIL, password: ADMIN_PASSWORD }) + .expect(200) + .expect(({ body }) => { + expect(body.token).toBeDefined(); + }); + }); + + it('Login via user endpoint: /api/v1/auth/email/login (POST)', () => { + return request(app) + .post('/api/v1/auth/email/login') + .send({ email: ADMIN_EMAIL, password: ADMIN_PASSWORD }) + .expect(422); + }); +}); diff --git a/myteamwallet_backend/test/admin/users.e2e-spec.ts b/myteamwallet_backend/test/admin/users.e2e-spec.ts new file mode 100644 index 0000000..d2408e1 --- /dev/null +++ b/myteamwallet_backend/test/admin/users.e2e-spec.ts @@ -0,0 +1,104 @@ +import { APP_URL, ADMIN_EMAIL, ADMIN_PASSWORD } from '../utils/constants'; +import * as request from 'supertest'; +import { RoleEnum } from '../../src/roles/roles.enum'; +import { StatusEnum } from '../../src/statuses/statuses.enum'; + +describe('Users admin (e2e)', () => { + const app = APP_URL; + let newUserFirst; + const newUserEmailFirst = `user-first.${Date.now()}@example.com`; + const newUserPasswordFirst = `secret`; + const newUserChangedPasswordFirst = `new-secret`; + const newUserByAdminEmailFirst = `user-created-by-admin.${Date.now()}@example.com`; + const newUserByAdminPasswordFirst = `secret`; + let apiToken; + + beforeAll(async () => { + await request(app) + .post('/api/v1/auth/admin/email/login') + .send({ email: ADMIN_EMAIL, password: ADMIN_PASSWORD }) + .then(({ body }) => { + apiToken = body.token; + }); + + await request(app) + .post('/api/v1/auth/email/register') + .send({ + email: newUserEmailFirst, + password: newUserPasswordFirst, + firstName: `First${Date.now()}`, + lastName: 'E2E', + }); + + await request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmailFirst, password: newUserPasswordFirst }) + .then(({ body }) => { + newUserFirst = body.user; + }); + }); + + it('Change password for new user: /api/v1/users/:id (PATCH)', () => { + return request(app) + .patch(`/api/v1/users/${newUserFirst.id}`) + .auth(apiToken, { + type: 'bearer', + }) + .send({ password: newUserChangedPasswordFirst }) + .expect(200); + }); + + it('Login via registered user: /api/v1/auth/email/login (GET)', () => { + return request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmailFirst, password: newUserChangedPasswordFirst }) + .expect(200) + .expect(({ body }) => { + expect(body.token).toBeDefined(); + }); + }); + + it('Fail create new user by admin: /api/v1/users (POST)', () => { + return request(app) + .post(`/api/v1/users`) + .auth(apiToken, { + type: 'bearer', + }) + .send({ email: 'fail-data' }) + .expect(422); + }); + + it('Success create new user by admin: /api/v1/users (POST)', () => { + return request(app) + .post(`/api/v1/users`) + .auth(apiToken, { + type: 'bearer', + }) + .send({ + email: newUserByAdminEmailFirst, + password: newUserByAdminPasswordFirst, + firstName: `UserByAdmin${Date.now()}`, + lastName: 'E2E', + role: { + id: RoleEnum.user, + }, + status: { + id: StatusEnum.active, + }, + }) + .expect(201); + }); + + it('Login via created by admin user: /api/v1/auth/email/login (GET)', () => { + return request(app) + .post('/api/v1/auth/email/login') + .send({ + email: newUserByAdminEmailFirst, + password: newUserByAdminPasswordFirst, + }) + .expect(200) + .expect(({ body }) => { + expect(body.token).toBeDefined(); + }); + }); +}); diff --git a/myteamwallet_backend/test/jest-e2e.json b/myteamwallet_backend/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/myteamwallet_backend/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/myteamwallet_backend/test/user/auth.e2e-spec.ts b/myteamwallet_backend/test/user/auth.e2e-spec.ts new file mode 100644 index 0000000..7ad565b --- /dev/null +++ b/myteamwallet_backend/test/user/auth.e2e-spec.ts @@ -0,0 +1,198 @@ +import * as request from 'supertest'; +import { + APP_URL, + TESTER_EMAIL, + TESTER_PASSWORD, + MAIL_HOST, + MAIL_PORT, +} from '../utils/constants'; + +describe('Auth user (e2e)', () => { + const app = APP_URL; + const mail = `http://${MAIL_HOST}:${MAIL_PORT}`; + const newUserFirstName = `Tester${Date.now()}`; + const newUserLastName = `E2E`; + const newUserEmail = `User.${Date.now()}@example.com`; + const newUserPassword = `secret`; + + it('Login: /api/v1/auth/email/login (POST)', () => { + return request(app) + .post('/api/v1/auth/email/login') + .send({ email: TESTER_EMAIL, password: TESTER_PASSWORD }) + .expect(200) + .expect(({ body }) => { + expect(body.token).toBeDefined(); + expect(body.user.provider).not.toBeDefined(); + expect(body.user.hash).not.toBeDefined(); + expect(body.user.password).not.toBeDefined(); + expect(body.user.previousPassword).not.toBeDefined(); + }); + }); + + it('Login via admin endpoint: /api/v1/auth/admin/email/login (POST)', () => { + return request(app) + .post('/api/v1/auth/admin/email/login') + .send({ email: TESTER_EMAIL, password: TESTER_PASSWORD }) + .expect(422); + }); + + it('Login via admin endpoint with extra spaced: /api/v1/auth/admin/email/login (POST)', () => { + return request(app) + .post('/api/v1/auth/admin/email/login') + .send({ email: TESTER_EMAIL + ' ', password: TESTER_PASSWORD }) + .expect(422); + }); + + it('Do not allow register user with exists email: /api/v1/auth/email/register (POST)', () => { + return request(app) + .post('/api/v1/auth/email/register') + .send({ + email: TESTER_EMAIL, + password: TESTER_PASSWORD, + firstName: 'Tester', + lastName: 'E2E', + }) + .expect(422) + .expect(({ body }) => { + expect(body.errors.email).toBeDefined(); + }); + }); + + it('Register new user: /api/v1/auth/email/register (POST)', async () => { + return request(app) + .post('/api/v1/auth/email/register') + .send({ + email: newUserEmail, + password: newUserPassword, + firstName: newUserFirstName, + lastName: newUserLastName, + }) + .expect(201); + }); + + it('Login unconfirmed user: /api/v1/auth/email/login (POST)', () => { + return request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmail, password: newUserPassword }) + .expect(200) + .expect(({ body }) => { + expect(body.token).toBeDefined(); + }); + }); + + it('Confirm email: /api/v1/auth/email/confirm (POST)', async () => { + const hash = await request(mail) + .get('/email') + .then(({ body }) => + body + .find( + (letter) => + letter.to[0].address.toLowerCase() === + newUserEmail.toLowerCase() && + /.*confirm\-email\/(\w+).*/g.test(letter.text), + ) + ?.text.replace(/.*confirm\-email\/(\w+).*/g, '$1'), + ); + + return request(app) + .post('/api/v1/auth/email/confirm') + .send({ + hash, + }) + .expect(200); + }); + + it('Login confirmed user: /api/v1/auth/email/login (POST)', () => { + return request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmail, password: newUserPassword }) + .expect(200) + .expect(({ body }) => { + expect(body.token).toBeDefined(); + }); + }); + + it('Confirmed user retrieve profile: /api/v1/auth/me (GET)', async () => { + const newUserApiToken = await request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmail, password: newUserPassword }) + .then(({ body }) => body.token); + + await request(app) + .get('/api/v1/auth/me') + .auth(newUserApiToken, { + type: 'bearer', + }) + .send() + .expect(({ body }) => { + expect(body.provider).toBeDefined(); + expect(body.hash).not.toBeDefined(); + expect(body.password).not.toBeDefined(); + expect(body.previousPassword).not.toBeDefined(); + }); + }); + + it('New user update profile: /api/v1/auth/me (PATCH)', async () => { + const newUserNewName = Date.now(); + const newUserNewPassword = 'new-secret'; + const newUserApiToken = await request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmail, password: newUserPassword }) + .then(({ body }) => body.token); + + await request(app) + .patch('/api/v1/auth/me') + .auth(newUserApiToken, { + type: 'bearer', + }) + .send({ + firstName: newUserNewName, + password: newUserNewPassword, + }) + .expect(422); + + await request(app) + .patch('/api/v1/auth/me') + .auth(newUserApiToken, { + type: 'bearer', + }) + .send({ + firstName: newUserNewName, + password: newUserNewPassword, + oldPassword: newUserPassword, + }) + .expect(200); + + await request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmail, password: newUserNewPassword }) + .expect(200) + .expect(({ body }) => { + expect(body.token).toBeDefined(); + }); + + await request(app) + .patch('/api/v1/auth/me') + .auth(newUserApiToken, { + type: 'bearer', + }) + .send({ password: newUserPassword, oldPassword: newUserNewPassword }) + .expect(200); + }); + + it('New user delete profile: /api/v1/auth/me (DELETE)', async () => { + const newUserApiToken = await request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmail, password: newUserPassword }) + .then(({ body }) => body.token); + + await request(app).delete('/api/v1/auth/me').auth(newUserApiToken, { + type: 'bearer', + }); + + return request(app) + .post('/api/v1/auth/email/login') + .send({ email: newUserEmail, password: newUserPassword }) + .expect(422); + }); +}); diff --git a/myteamwallet_backend/test/utils/constants.ts b/myteamwallet_backend/test/utils/constants.ts new file mode 100644 index 0000000..b1bfb95 --- /dev/null +++ b/myteamwallet_backend/test/utils/constants.ts @@ -0,0 +1,7 @@ +export const APP_URL = `http://localhost:${process.env.APP_PORT}`; +export const TESTER_EMAIL = 'john.doe@example.com'; +export const TESTER_PASSWORD = 'secret'; +export const ADMIN_EMAIL = 'admin@example.com'; +export const ADMIN_PASSWORD = 'secret'; +export const MAIL_HOST = process.env.MAIL_HOST; +export const MAIL_PORT = process.env.MAIL_CLIENT_PORT; diff --git a/myteamwallet_backend/tsconfig.build.json b/myteamwallet_backend/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/myteamwallet_backend/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/myteamwallet_backend/tsconfig.json b/myteamwallet_backend/tsconfig.json new file mode 100644 index 0000000..adb614c --- /dev/null +++ b/myteamwallet_backend/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false + } +} diff --git a/myteamwallet_backend/wait-for-it.sh b/myteamwallet_backend/wait-for-it.sh new file mode 100644 index 0000000..d990e0d --- /dev/null +++ b/myteamwallet_backend/wait-for-it.sh @@ -0,0 +1,182 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +WAITFORIT_cmdname=${0##*/} + +echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + else + echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" + fi + WAITFORIT_start_ts=$(date +%s) + while : + do + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi + if [[ $WAITFORIT_result -eq 0 ]]; then + WAITFORIT_end_ts=$(date +%s) + echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" + break + fi + sleep 1 + done + return $WAITFORIT_result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $WAITFORIT_QUIET -eq 1 ]]; then + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + else + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + fi + WAITFORIT_PID=$! + trap "kill -INT -$WAITFORIT_PID" INT + wait $WAITFORIT_PID + WAITFORIT_RESULT=$? + if [[ $WAITFORIT_RESULT -ne 0 ]]; then + echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + fi + return $WAITFORIT_RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + WAITFORIT_hostport=(${1//:/ }) + WAITFORIT_HOST=${WAITFORIT_hostport[0]} + WAITFORIT_PORT=${WAITFORIT_hostport[1]} + shift 1 + ;; + --child) + WAITFORIT_CHILD=1 + shift 1 + ;; + -q | --quiet) + WAITFORIT_QUIET=1 + shift 1 + ;; + -s | --strict) + WAITFORIT_STRICT=1 + shift 1 + ;; + -h) + WAITFORIT_HOST="$2" + if [[ $WAITFORIT_HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + WAITFORIT_HOST="${1#*=}" + shift 1 + ;; + -p) + WAITFORIT_PORT="$2" + if [[ $WAITFORIT_PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + WAITFORIT_PORT="${1#*=}" + shift 1 + ;; + -t) + WAITFORIT_TIMEOUT="$2" + if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + WAITFORIT_TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + WAITFORIT_CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} +WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} +WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} +WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} + +# Check to see if timeout is from busybox? +WAITFORIT_TIMEOUT_PATH=$(type -p timeout) +WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) + +WAITFORIT_BUSYTIMEFLAG="" +if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then + WAITFORIT_ISBUSY=1 + # Check if busybox timeout uses -t flag + # (recent Alpine versions don't support -t anymore) + if timeout &>/dev/stdout | grep -q -e '-t '; then + WAITFORIT_BUSYTIMEFLAG="-t" + fi +else + WAITFORIT_ISBUSY=0 +fi + +if [[ $WAITFORIT_CHILD -gt 0 ]]; then + wait_for + WAITFORIT_RESULT=$? + exit $WAITFORIT_RESULT +else + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + wait_for_wrapper + WAITFORIT_RESULT=$? + else + wait_for + WAITFORIT_RESULT=$? + fi +fi + +if [[ $WAITFORIT_CLI != "" ]]; then + if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then + echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" + exit $WAITFORIT_RESULT + fi + exec "${WAITFORIT_CLI[@]}" +else + exit $WAITFORIT_RESULT +fi diff --git a/myteamwallet_frontend/.editorconfig b/myteamwallet_frontend/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/myteamwallet_frontend/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/myteamwallet_frontend/.gitignore b/myteamwallet_frontend/.gitignore new file mode 100644 index 0000000..6edc436 --- /dev/null +++ b/myteamwallet_frontend/.gitignore @@ -0,0 +1,49 @@ +# 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 + +# Claude Code worktrees / plan tooling +/.claude +/.superpowers + +# git +package-lock.json diff --git a/myteamwallet_frontend/.vscode/extensions.json b/myteamwallet_frontend/.vscode/extensions.json new file mode 100644 index 0000000..77b3745 --- /dev/null +++ b/myteamwallet_frontend/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/myteamwallet_frontend/.vscode/launch.json b/myteamwallet_frontend/.vscode/launch.json new file mode 100644 index 0000000..740e35a --- /dev/null +++ b/myteamwallet_frontend/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "pwa-chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/myteamwallet_frontend/.vscode/settings.json b/myteamwallet_frontend/.vscode/settings.json new file mode 100644 index 0000000..36c12fd --- /dev/null +++ b/myteamwallet_frontend/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "CodeGPT.apiKey": "CodeGPT Plus Beta" +} \ No newline at end of file diff --git a/myteamwallet_frontend/.vscode/tasks.json b/myteamwallet_frontend/.vscode/tasks.json new file mode 100644 index 0000000..a298b5b --- /dev/null +++ b/myteamwallet_frontend/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + } + ] +} diff --git a/myteamwallet_frontend/README.md b/myteamwallet_frontend/README.md new file mode 100644 index 0000000..5d4bb95 --- /dev/null +++ b/myteamwallet_frontend/README.md @@ -0,0 +1,27 @@ +# MyteamwalletFrontend + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.0.1. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/myteamwallet_frontend/angular.json b/myteamwallet_frontend/angular.json new file mode 100644 index 0000000..944229f --- /dev/null +++ b/myteamwallet_frontend/angular.json @@ -0,0 +1,135 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "myteamwallet_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", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": [ + "zone.js" + ], + "statsJson": true, + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + "src/favicon.ico", + "src/assets", + "src/manifest.webmanifest" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [], + "serviceWorker": true, + "ngswConfigPath": "ngsw-config.json" + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all", + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.dev.ts" + } + ] + }, + "remote": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true, + "fileReplacements": [] + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "myteamwallet_frontend:build:production" + }, + "development": { + "buildTarget": "myteamwallet_frontend:build:development" + }, + "remote": { + "buildTarget": "myteamwallet_frontend:build:remote" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "myteamwallet_frontend:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing" + ], + "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + } + } + } + } + }, + "cli": { + "analytics": false + } +} diff --git a/myteamwallet_frontend/docs/superpowers/plans/2026-07-31-design-foundation.md b/myteamwallet_frontend/docs/superpowers/plans/2026-07-31-design-foundation.md new file mode 100644 index 0000000..2c0f415 --- /dev/null +++ b/myteamwallet_frontend/docs/superpowers/plans/2026-07-31-design-foundation.md @@ -0,0 +1,374 @@ +# Design-System-Fundament Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Legt die technische und visuelle Basis für das TeamWallet-Redesign: Design-Tokens, ein eigenes Material-3-Theme (fintech-modern, Indigo/Grün), ein konsistentes Icon-System und ein bereinigtes Notification-System — ohne die bestehenden Bildschirme inhaltlich umzubauen (das folgt in Folge-Plänen für Public-Übersicht, Dashboard/Team-Workspace, Auth-Flows). + +**Architecture:** Zwei neue SCSS-Partials (`src/styles/_tokens.scss`, `src/styles/_theme.scss`) werden aus `src/styles.scss` eingebunden. Die Angular-Material-Theming-API (`mat.define-theme`, installiert in `node_modules/@angular/material/core/theming/_definition.scss`) erzeugt das Theme aus vordefinierten M3-Paletten (`mat.$blue-palette` als Primary, `mat.$spring-green-palette` als Tertiary) statt des Stock-Themes `azure-blue`. Reine CSS-Custom-Properties (nicht Sass-Variablen) tragen Spacing/Radius/Elevation/Balance-Farben, damit sie direkt in Komponenten-Templates/-Styles nutzbar sind, auch außerhalb von Sass-Kontext. + +**Tech Stack:** Angular 18.1, Angular Material 18.1 (M3-Theming-API), SCSS, Angular CLI Builder (`@angular-devkit/build-angular:browser`), Karma/Jasmine. + +## Global Constraints + +- Kein Dark Mode in diesem Plan — Tokens müssen aber so benannt/strukturiert sein, dass ein späteres Dark-Theme sie überschreiben kann (semantische Namen, keine rohen Paletten-Referenzen in Komponenten). +- Keine neuen Abhängigkeiten hinzufügen; stattdessen wird die ungenutzte Abhängigkeit `@ngxpert/hot-toast` entfernt. +- Bestehende deutsche UI-Texte bleiben unverändert (i18n-Audit ist ein separater Folge-Plan). +- Nach jedem Task muss `npm run build` (aus `myteamwallet_frontend/`) fehlerfrei durchlaufen. +- Angular Material 18 M3-Theming bietet **keine** Funktion, aus einem beliebigen Hex-Wert eine Palette zu generieren (verifiziert: `_palettes.scss` enthält nur die zwölf vordefinierten Paletten `red/green/blue/yellow/cyan/magenta/orange/chartreuse/spring-green/azure/violet/rose`). Primary/Tertiary werden daher aus diesen vordefinierten Paletten gewählt, nicht aus Wunsch-Hexcodes. + +--- + +### Task 1: Design-Tokens (Spacing, Radius, Elevation, Balance-Farben) + +**Files:** +- Create: `myteamwallet_frontend/src/styles/_tokens.scss` +- Modify: `myteamwallet_frontend/src/styles.scss` + +**Interfaces:** +- Produces: CSS-Custom-Properties auf `:root` — `--tw-space-{1,2,3,4,6,8}`, `--tw-radius-{sm,md,lg}`, `--tw-elevation-{1,2}`, `--tw-balance-positive`, `--tw-balance-negative`, `--tw-balance-neutral`, `--tw-surface-bg`, `--tw-surface-card`. Alle Folge-Tasks/-Pläne referenzieren ausschließlich diese Namen, nie rohe Hex-Werte. + +- [ ] **Step 1: `_tokens.scss` anlegen** + +```scss +// myteamwallet_frontend/src/styles/_tokens.scss +:root { + // Spacing (8px-Grid) + --tw-space-1: 4px; + --tw-space-2: 8px; + --tw-space-3: 12px; + --tw-space-4: 16px; + --tw-space-6: 24px; + --tw-space-8: 32px; + + // Radius + --tw-radius-sm: 8px; + --tw-radius-md: 12px; + --tw-radius-lg: 16px; + + // Elevation (ersetzt die bisher wiederholte box-shadow-Deklaration) + --tw-elevation-1: 0 1px 2px rgba(15, 23, 42, 0.06), 0 1px 3px rgba(15, 23, 42, 0.1); + --tw-elevation-2: 0 2px 4px rgba(15, 23, 42, 0.06), 0 4px 8px rgba(15, 23, 42, 0.1); + + // Semantische Saldo-Farben (fintech-modern: gedämpftes Grün/Rot statt Signalfarben) + --tw-balance-positive: #1b8a5a; + --tw-balance-negative: #c4351c; + --tw-balance-neutral: #64748b; + + // Flächen + --tw-surface-bg: #f7f8fa; + --tw-surface-card: #ffffff; +} +``` + +- [ ] **Step 2: In `styles.scss` einbinden und bestehende Hardcodes ersetzen** + +In `myteamwallet_frontend/src/styles.scss` ganz oben ergänzen: + +```scss +@use './styles/tokens'; +``` + +Danach folgende bestehende Stellen in derselben Datei ersetzen: + +```scss +// vorher: body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; background-color: #fafafa;} +body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; background-color: var(--tw-surface-bg); } +``` + +```scss +// vorher in .card: +// box-shadow: 0 2px 1px -1px #0003, 0 1px 1px #00000024, 0 1px 3px #0000001f; +.card { + padding: var(--tw-space-3); + box-shadow: var(--tw-elevation-1); + margin: var(--tw-space-1); + background-color: var(--tw-surface-card); + border-radius: var(--tw-radius-md); + + &.flat { + background-color: transparent; + box-shadow: none; + outline: #ddd solid 1px; + } +} +``` + +```scss +// vorher: background-color: rgb(148, 16, 16) !important; +.snackbar_error > .mdc-snackbar__surface { + background-color: var(--tw-balance-negative) !important; + + .mat-mdc-snack-bar-label { + color: white !important; + } +} +``` + +- [ ] **Step 3: Build verifizieren** + +Run: `cd myteamwallet_frontend && npm run build` +Expected: Build erfolgreich, keine Sass-/Compile-Fehler. + +- [ ] **Step 4: Commit** + +```bash +git add myteamwallet_frontend/src/styles/_tokens.scss myteamwallet_frontend/src/styles.scss +git commit -m "feat(design): add design tokens and wire into global styles" +``` + +--- + +### Task 2: Eigenes Material-3-Theme statt Stock-Theme + +**Files:** +- Create: `myteamwallet_frontend/src/styles/_theme.scss` +- Modify: `myteamwallet_frontend/src/styles.scss` +- Modify: `myteamwallet_frontend/angular.json:35` (build-Styles), `myteamwallet_frontend/angular.json:125` (test-Styles) +- Modify: `myteamwallet_frontend/src/index.html` + +**Interfaces:** +- Consumes: nichts aus Task 1 direkt (unabhängiges Partial), wird aber in derselben `styles.scss` eingebunden. +- Produces: Sass-Variable `theme.$teamwallet-theme`, die alle Material-Komponentenstyles erzeugt. Spätere Pläne fügen hier bei Bedarf `mat.theme-overrides()` hinzu, ändern aber nicht den Namen `$teamwallet-theme`. + +- [ ] **Step 1: `_theme.scss` anlegen** + +```scss +// myteamwallet_frontend/src/styles/_theme.scss +@use '@angular/material' as mat; + +$teamwallet-theme: mat.define-theme(( + color: ( + theme-type: light, + primary: mat.$blue-palette, + tertiary: mat.$spring-green-palette, + ), + typography: ( + brand-family: 'Inter, Roboto, "Helvetica Neue", sans-serif', + plain-family: 'Inter, Roboto, "Helvetica Neue", sans-serif', + ), + density: ( + scale: 0, + ), +)); +``` + +- [ ] **Step 2: Theme in `styles.scss` einbinden (ersetzt Stock-Theme-Import)** + +Am Anfang von `myteamwallet_frontend/src/styles.scss` ergänzen (vor den bestehenden Regeln): + +```scss +@use '@angular/material' as mat; +@use './styles/theme'; + +@include mat.core(); +@include mat.all-component-themes(theme.$teamwallet-theme); +``` + +- [ ] **Step 3: Stock-Theme aus `angular.json` entfernen** + +In `myteamwallet_frontend/angular.json` im `build`-Target die Zeile entfernen: + +```json +"@angular/material/prebuilt-themes/azure-blue.css", +``` + +Im `test`-Target die Zeile entfernen: + +```json +"@angular/material/prebuilt-themes/cyan-orange.css", +``` + +In beiden Targets bleibt `"src/styles.scss"` als einziger globaler Stylesheet-Eintrag stehen. + +- [ ] **Step 4: Google-Font auf Inter umstellen** + +In `myteamwallet_frontend/src/index.html` die bestehende Roboto-Zeile ersetzen: + +```html + +``` + +- [ ] **Step 5: Build und Tests verifizieren** + +Run: `cd myteamwallet_frontend && npm run build` +Expected: Build erfolgreich, Material-Komponenten (Buttons, Toolbar, Cards) werden aus dem neuen Theme gestylt statt aus `azure-blue.css`. + +Run: `cd myteamwallet_frontend && npm test -- --watch=false` +Expected: Bestehende Karma-Suite läuft weiterhin durch (keine Test-Regression durch den Theme-Wechsel). + +- [ ] **Step 6: Commit** + +```bash +git add myteamwallet_frontend/src/styles/_theme.scss myteamwallet_frontend/src/styles.scss myteamwallet_frontend/angular.json myteamwallet_frontend/src/index.html +git commit -m "feat(design): replace stock Material azure-blue theme with custom M3 theme" +``` + +--- + +### Task 3: Icon-System auf Material Symbols umstellen, PNG-Icon-Klassen entfernen + +**Files:** +- Modify: `myteamwallet_frontend/src/index.html` +- Modify: `myteamwallet_frontend/src/app/app.component.ts` +- Modify: `myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts` +- Modify: `myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html` +- Modify: `myteamwallet_frontend/src/styles.scss` +- Delete: `myteamwallet_frontend/src/assets/edit.png`, `myteamwallet_frontend/src/assets/dashboard.png`, `myteamwallet_frontend/src/assets/tacho.png` + +**Interfaces:** +- Consumes: nichts. +- Produces: ``-basierte Icons überall; keine PNG-Icon-Klassen (`icon`, `icon_edit`, `icon_dashboard`, `icon_tacho`) mehr im Code. Verifiziert: diese Klassen werden ausschließlich in `dashboard.component.html` verwendet (`icon_tacho`, `icon_edit`; `icon_dashboard` ist bereits toter Code). + +- [ ] **Step 1: Material Symbols statt Material Icons laden** + +In `myteamwallet_frontend/src/index.html` die Material-Icons-Zeile ersetzen: + +```html + +``` + +- [ ] **Step 2: Default-Fontset der App auf Material Symbols umstellen** + +In `myteamwallet_frontend/src/app/app.component.ts`: + +```ts +import { Component } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { environment } from './../environments/environment'; +import { SwUpdate } from '@angular/service-worker'; +import { MatIconRegistry } from '@angular/material/icon'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent { + version = environment.appVersion; + + constructor(translate: TranslateService, updates: SwUpdate, iconRegistry: MatIconRegistry) { + iconRegistry.setDefaultFontSetClass('material-symbols-outlined'); + translate.setDefaultLang('de'); + translate.use('de'); + this.update(updates); + } + // ... rest unverändert +``` + +(Restlichen Methodenkörper `update()` unverändert lassen.) + +- [ ] **Step 3: Dashboard-Icons auf `mat-icon` umstellen** + +In `myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts` `MatIconModule` importieren: + +```ts +import { MatIconModule } from '@angular/material/icon'; +// ... +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.scss'], + standalone: true, + imports: [ CommonModule, TranslateModule, MatButtonModule, MatIconModule ] +}) +``` + +In `myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html` ersetzen: + +```html + +
+
+
+
+``` + +```html + +
+ + +
+``` + +- [ ] **Step 4: Tote Icon-Klassen aus `styles.scss` entfernen** + +In `myteamwallet_frontend/src/styles.scss` den gesamten Block entfernen: + +```scss +.icon { ... } +.icon_edit { ... } +.icon_dashboard { ... } +.icon_tacho { ... } +``` + +(Alle vier Regeln inkl. der `.icon:hover`-Verschachtelung löschen — keine andere Datei referenziert diese Klassen mehr.) + +- [ ] **Step 5: Ungenutzte PNG-Assets löschen** + +```bash +git rm myteamwallet_frontend/src/assets/edit.png myteamwallet_frontend/src/assets/dashboard.png myteamwallet_frontend/src/assets/tacho.png +``` + +- [ ] **Step 6: Build verifizieren und visuell prüfen** + +Run: `cd myteamwallet_frontend && npm run build` +Expected: Build erfolgreich, keine fehlenden Asset-Referenzen. + +Run: `cd myteamwallet_frontend && npm start`, Dashboard im Browser öffnen (`http://localhost:4200/dashboard`, eingeloggt). +Expected: Statt der beiden PNG-Icons erscheinen die Material-Symbols-Icons „speed“ und „edit“, klickbar wie zuvor. + +- [ ] **Step 7: Commit** + +```bash +git add myteamwallet_frontend/src/index.html myteamwallet_frontend/src/app/app.component.ts myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html myteamwallet_frontend/src/styles.scss +git commit -m "feat(design): migrate to Material Symbols, remove PNG icon classes" +``` + +--- + +### Task 4: Notification-System bereinigen + +**Files:** +- Modify: `myteamwallet_frontend/package.json` + +**Interfaces:** +- Consumes: `--tw-balance-negative`-Token aus Task 1 (bereits in `.snackbar_error` verdrahtet). +- Produces: keine neuen Symbole — reine Bereinigung. + +Verifiziert: `@ngxpert/hot-toast` ist in `package.json` als Abhängigkeit deklariert, wird aber im gesamten `src/`-Verzeichnis nirgends importiert (`HotToastService`/`@ngxpert/hot-toast` liefert null Treffer). Es gibt also kein zweites, konkurrierendes Toast-System im Code — nur eine tote Abhängigkeit. Die tatsächliche Benachrichtigung läuft ausschließlich über `MatSnackBar` (3 Aufrufstellen, alle in `team-details.component.ts`), deren Fehler-Variante bereits in Task 1 auf den neuen Token umgestellt wurde. + +- [ ] **Step 1: Ungenutzte Abhängigkeit entfernen** + +In `myteamwallet_frontend/package.json` die Zeile aus `dependencies` entfernen: + +```json +"@ngxpert/hot-toast": "3.0.0", +``` + +- [ ] **Step 2: Lockfile aktualisieren** + +Run: `cd myteamwallet_frontend && npm install` +Expected: `package-lock.json` aktualisiert sich, `@ngxpert/hot-toast` verschwindet aus dem Dependency-Baum, keine anderen Pakete werden unerwartet verändert. + +- [ ] **Step 3: Build verifizieren** + +Run: `cd myteamwallet_frontend && npm run build` +Expected: Build weiterhin erfolgreich (bestätigt, dass das Paket wirklich ungenutzt war). + +- [ ] **Step 4: Commit** + +```bash +git add myteamwallet_frontend/package.json myteamwallet_frontend/package-lock.json +git commit -m "chore(deps): remove unused @ngxpert/hot-toast dependency" +``` + +--- + +## Hinweis für Folge-Pläne + +Die Wrapper-Komponenten-Bibliothek (`BalanceDisplay`, `PageHeader`, `SectionCard`, `EmptyState`, `StatTile` aus dem Gesamtplan) wird bewusst **nicht** in diesem Fundament-Plan gebaut, sondern erst in dem Folge-Plan, der ihren ersten echten Verwendungsort umbaut (Public-Team-Übersicht bzw. Dashboard/Team-Workspace) — YAGNI: eine Komponenten-Bibliothek ohne Konsumenten lässt sich nicht sinnvoll gegen echte Anforderungen entwerfen. Dieser Fundament-Plan liefert die Basis (Tokens, Theme, Icons, saubere Notifications), auf der diese Komponenten aufbauen. diff --git a/myteamwallet_frontend/ngsw-config.json b/myteamwallet_frontend/ngsw-config.json new file mode 100644 index 0000000..6c8ccf4 --- /dev/null +++ b/myteamwallet_frontend/ngsw-config.json @@ -0,0 +1,29 @@ +{ + "$schema": "./node_modules/@angular/service-worker/config/schema.json", + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": [ + "/favicon.ico", + "/index.html", + "/manifest.webmanifest", + "/*.css", + "/*.js" + ] + } + }, + { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": [ + "/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" + ] + } + } + ] +} diff --git a/myteamwallet_frontend/package.json b/myteamwallet_frontend/package.json new file mode 100644 index 0000000..19e58f8 --- /dev/null +++ b/myteamwallet_frontend/package.json @@ -0,0 +1,51 @@ +{ + "name": "myteamwallet-frontend", + "version": "1.0.49", + "scripts": { + "ng": "ng", + "start": "ng serve", + "start:remote": "ng serve --configuration=remote", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "patch": "npm --no-git-tag-version version patch", + "post_patch": "git add package.json" + }, + "pre-commit": [ + "patch", + "post_patch" + ], + "private": true, + "dependencies": { + "@angular/animations": "^18.1.4", + "@angular/cdk": "^18.1.4", + "@angular/common": "^18.1.4", + "@angular/compiler": "^18.1.4", + "@angular/core": "^18.1.4", + "@angular/forms": "^18.1.4", + "@angular/material": "^18.1.4", + "@angular/platform-browser": "^18.1.4", + "@angular/platform-browser-dynamic": "^18.1.4", + "@angular/router": "^18.1.4", + "@angular/service-worker": "^18.1.4", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0", + "rxjs": "~7.5.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.8" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^18.1.4", + "@angular/cli": "~18.1.4", + "@angular/compiler-cli": "^18.1.4", + "@types/jasmine": "~4.3.0", + "jasmine-core": "~4.5.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.0.0", + "pre-commit": "^1.2.2", + "typescript": "~5.4.5" + } +} diff --git a/myteamwallet_frontend/public/icons/icon-128x128.png b/myteamwallet_frontend/public/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9a2ccdb34a97a06510d04238d8bedd8e063d3a GIT binary patch literal 2875 zcmV-B3&iw^P)C0008_P)t-s0002& z9EbENqopD5@(y0~Ac4&(;F%uw?h$_L3~Rb4@Sh>}?lk4{A#>dpkIgIViW&F%F}(B? zSI#Ko-665>9e3aedGj;V?;nisG~&uE@!BTIsUYpu3W?t$vbrbqDfEpQ^!YHm_Aa;gF0b?~uc09I z!6@*Z9PFwe>h&?n^Do8tFSGY8s`V$5^d*JzB6;ctX7dkLr6Tu{8S%y`?!PDQwIuHI zG}-qu&Gjz3^)0gF9GvO`U-Af9wkP=YGu8Mox6~cC-WHeT8kFq^VeSQ7pd$H{9rwE@ z^R6WGnH}=FCGPPu)!7}c<`|6C27>GXTJ{A?_X0(q9`Ugw@3JB4_A}9$9`~Ie_028v zsUh&KA?~Ce?YSiC@-WNzGRX5SyWSqE_XkL&Ao78}srm!1FA&+8?yi8L-$IsNNZ!*cF`K19I{qap3}Nq#fz+G~(JL z!P+6a-yEdb8KUVJhTtKu(-ot_2%X3WmCFZ_&e$%S$i%~zlzw4hAp7y}?dj;} z;oslf&(FWMvapSBK>PRh^78TU@9*#G&&RT;Pv0?%000M;NklCo2*8x$)93d|qJeXTx^d$M0)Q>! z`}gm+Z3_jCwE9nlIR1gl2~@VekbuzjA)EV~9n0jEwSjjVL?>tH5fm?t5C(&5zrOR?_VJ?7V~TQ{0Iz+3_W zb_+sEP%7frfcpA;EQkuAUq316*s)`^YQym#2}CZyR8GO9!ILIUA^=7JIlrD70Fwf0 zI3@wHK(Qo~L@TuU_3In+)c|w*X&D4+_ij**=C4>G0QIrhM;cvggf(4br>37G5&sHX~uF=B)S^zYw)8g-UR2^NZj^ARvv z%wJ{zx^xMs@(~z8;douJckf;Vqz4P7+qLT(Ks^HZ1%)I)ClCOO1(wQ&g2|I7Z^Zcm z&{fXw0xAs{Fkr+0A($=+5)hxc+sq3-@~&OG1YqMbtbNz6UF(hSq70y>%le-aA%M9! zQY7XF4M2jf*m!lo$dM#45JZT|T>SAP_et{D0L`}mz{oHV(+O^70UtjyEATZp(A5Ae zRt8Yjg@6?70usOYn3!F`rcF41#|{Iqc(EEFcJta;a4guI{8PG^%5`38JD&M>J_WXGQa36$d8eqeqty>YWMGX+X zabqG#M8#V~QmMsB5C3j=YM5Jae^AUhm0)Rya=Bqq( z=ye^iWy=;{P)Y)%qH!Z&dbw}kzI&^50Wb}{?g;?3M#&_BTR@DLLa=WY5`-WIw*n17 z^OvXt%z!ECOHF_wASy5kz>p0amM^ye=wvo3Eqe#B+qX>tFa^GTeTV>{V2MQl6`uQK z&X_Ud_H7}!h=2@oB!0cR`&G6C0W(GhGucKPz@0ASHaeBz7@dLt5*YotwpvBaDlD)wF(FWHW$|-ASBpa5Nm*7V0)!40K(7$ zY+pfKP|g2UaG<^cL0te26cD_5`{P3T`=&s8VMS3y@#4kv0jJ8+(&(gUAvSjG*ki|@ zKY#Y@-Mgb}o;-g2=;5of;7~4ezDY0z2tWY>9=O1nvW(MfIjiL?>}!F!g7V-*kUb&%yArH#n*h9d^XAQ)H*f!U ZUjT_fSx^~10a*Y5002ovPDHLkV1ljCVV(d0 literal 0 HcmV?d00001 diff --git a/myteamwallet_frontend/public/icons/icon-144x144.png b/myteamwallet_frontend/public/icons/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..11702cd7bd67cee3c26172d0b69968b568c210e0 GIT binary patch literal 3077 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 literal 0 HcmV?d00001 diff --git a/myteamwallet_frontend/public/icons/icon-384x384.png b/myteamwallet_frontend/public/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..613ac793e063b1da8d0dc36dcbd1cc0ae620291d GIT binary patch literal 11028 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 literal 0 HcmV?d00001 diff --git a/myteamwallet_frontend/public/icons/icon-72x72.png b/myteamwallet_frontend/public/icons/icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..033724e15f5485c4d86af398a68ca293e6116f72 GIT binary patch literal 1995 zcmV;+2Q>JJP)291V+*= z^06lJ@iNwq8T9WTgUAk`+9JF2BZb^3%m;Ym7q0XGMcgOF zo*(n@GuZeu%=Iw5@*;!h3u5#YR+k?7ogMGqEYs})RJtkn_%qPMDD2W6x#A(I$Sm}o zA^G<$pUy4t>@(lADEhM@>G?Ft@+z(JAaC^$NSYe!pBv}r0bck9LaiqJxheViGtbl@ zy}}5d^Cy_k1%~qyQ1%W*(l7GuH0Hbrq4E(+ix>0pA#9i%>7pLz?J&~A37p9UhRiMW z^fTl6FSzm!Tkir^@&Zxx15Nb|N%sguuqOGsDE7%K^7t~w^AA?`3QY9^NuwkBv?uuV zG0F8Uv-A#5_yj_%CHkKs`M)Xk%`NiuGuQbt!SpV^`7ylqF1h$Fukg`I;a1 zlpOZND)p%%^`9X1u_g4sDDk2n@w_GM^fJx(Gt1j0#_}w=_%FED8maawpV}9m^e340 zCzSOkk@O{s+XQy!2W;&KW9tH5?E+f#4^s6BQK%*Rr6TsMBlMRX^t&hWogMPTDe<@_ z@tGX(wIuJjBX;8kfijmgE?a^d*MW27~eIY}!0%!3FTBIQJjv4c+A@Ig2@4+YSr628< z8ttMT>hd((@i5NuF2&pw9<Kg+s;a1{rKNOoa8*@RRaI3rE*=;6@9*Q|U3Qy|k;Vs;a80s;a80s*R0^h=hc4RaI3vEiEf^xaC#=00bjRL_t(o!|l{%P*hPA z!0{_EF$B`*s`{HM-~hB}QNAp^;Xci8 z+_(->TwGk{EjUgHNt^X9W%!s*`}Xa-0n+tr*RIvcye~Gx*U4!SKvJnm2LorB8XFsf zw0G}bl!!>azD~P$3yz7&^y%VC{>rANC>hV43sPXE^FB3cVSfE={Y!i5WKlgv$63T@c1;pWYo2vrh?3j6svI9y!2)?^Jr=Nb`_4jedu z5>i1yK?TL3LVh+j7XjL}W(_#!h*%aDK$)2>!Gho*#z_LS3n428WNrbOL1@)uLHTSh zU%IplAuB7ZIpUDHxy3xlY(J#CXwrn}WOMoQrS|9mOdb4jgU+fdI~ADRDRugEnC}KM5j_8V%GckSliprk%>dg zp^ccLGc^wm);pZ1hc@gDD;JGV6^qPe+k5~@y3RjQDLgm`LH?dsLXd-ecC zSdiOcXcIN8o}yAEhKBZ~hFWMF3p#=wKHQ%gwn|A+B_@Wpq)!6K(UA!q6*@xA3c9-9 zzI{76IkXTp4hVSf=y+i}19|~{`BI;nrK?f0OHN9n#-jjoW2mMx#-y!%?b1ExN}#UtmI8FnW}c;jYoVI&>)9?$#}O6YKB1 zoduQMvL#aQpok22_vg<+diG53q;CG})|FvExg#SZi_&yNM8t2Y9JLw=P#zZK;o(6~ zjIdn4qIdr59vOh@lPp);0QB}P;m8m~xO$YAu_)4o4=TfiM({zynGoTO1vTV_8j=6n zL~Scqo;>;B#EGvjU#{5v?d~0Zr@_pbGZFIoEv>k}`OV!i+z>dJrI!~_AbGxnliu*3 zRPc<@SxZPOy*myky}nb36B;;Q=qzMuIqCGNtq(jwf|L4jLV(QDc6RdQNhm$^gpYSTjcV2; dIpy?!`T;k-MF8k)@eTk0002ovPDHLkV1mgk?e+iw literal 0 HcmV?d00001 diff --git a/myteamwallet_frontend/public/icons/icon-96x96.png b/myteamwallet_frontend/public/icons/icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..3090dc2d8f93429535c667e616e367c010d941ad GIT binary patch literal 2404 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 W@LC!C(#4Aa0000{{version}} + \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/app.component.scss b/myteamwallet_frontend/src/app/app.component.scss new file mode 100644 index 0000000..41cc31a --- /dev/null +++ b/myteamwallet_frontend/src/app/app.component.scss @@ -0,0 +1,9 @@ +.app_version{ + position: absolute; + left: 0px; + bottom: 0px; + font-size: 0.6rem; + line-height: 0.6rem; + color: rgb(190, 190, 190); + pointer-events: none; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/app.component.spec.ts b/myteamwallet_frontend/src/app/app.component.spec.ts new file mode 100644 index 0000000..a49cddf --- /dev/null +++ b/myteamwallet_frontend/src/app/app.component.spec.ts @@ -0,0 +1,29 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'myteamwallet_frontend'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('myteamwallet_frontend'); + }); + +}); diff --git a/myteamwallet_frontend/src/app/app.component.ts b/myteamwallet_frontend/src/app/app.component.ts new file mode 100644 index 0000000..674426f --- /dev/null +++ b/myteamwallet_frontend/src/app/app.component.ts @@ -0,0 +1,46 @@ +import { Component } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { environment } from './../environments/environment'; +import { SwUpdate } from '@angular/service-worker'; +import { MatIconRegistry } from '@angular/material/icon'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent { + version = environment.appVersion; + + constructor(translate: TranslateService, updates: SwUpdate, iconRegistry: MatIconRegistry) { + iconRegistry.setDefaultFontSetClass('material-symbols-outlined'); + translate.setDefaultLang('de'); + translate.use('de'); + this.update(updates); + } + + update(updates: SwUpdate) { + console.log("Checking for updates: ", updates.isEnabled); + if (!updates.isEnabled) { return; } + + updates.versionUpdates.subscribe(evt => { + + switch (evt.type) { + case 'VERSION_DETECTED': + console.log(`Downloading new app version: ${evt.version.hash}`); + break; + case 'VERSION_READY': + console.log(`Current app version: ${evt.currentVersion.hash}`); + console.log(`New app version ready for use: ${evt.latestVersion.hash}`); + window.location.reload(); + break; + case 'VERSION_INSTALLATION_FAILED': + console.log(`Failed to install app version '${evt.version.hash}': ${evt.error}`); + break; + case 'NO_NEW_VERSION_DETECTED': + break; + default: + } + }); + } +} diff --git a/myteamwallet_frontend/src/app/app.module.ts b/myteamwallet_frontend/src/app/app.module.ts new file mode 100644 index 0000000..25d6efa --- /dev/null +++ b/myteamwallet_frontend/src/app/app.module.ts @@ -0,0 +1,55 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import { AppComponent } from './app.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +import { LOCALE_ID, isDevMode} from '@angular/core'; +import localeDe from '@angular/common/locales/de'; +import localeDeExtra from '@angular/common/locales/extra/de'; +import { registerLocaleData } from '@angular/common'; +import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { AuthInterceptorService } from './core/interceptor/auth.interceptor'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { CustomTranslateLoader } from './core/translate/translate-loader'; +import { provideRouter, RouterModule } from '@angular/router'; +import { routes } from './app.routes'; +import { ServiceWorkerModule } from '@angular/service-worker'; +registerLocaleData(localeDe, localeDeExtra); + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + RouterModule, + BrowserAnimationsModule, + HttpClientModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: CustomTranslateLoader, + deps: [HttpClient], + }, + defaultLanguage: 'de', + }), + ServiceWorkerModule.register('ngsw-worker.js', { + enabled: !isDevMode(), + // Register the ServiceWorker as soon as the application is stable + // or after 30 seconds (whichever comes first). + registrationStrategy: 'registerWhenStable:30000' + }), + ], + providers: [ + { provide: LOCALE_ID, useValue: 'de' }, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthInterceptorService, + multi: true + }, + provideRouter(routes) + ], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/myteamwallet_frontend/src/app/app.routes.ts b/myteamwallet_frontend/src/app/app.routes.ts new file mode 100644 index 0000000..7926ec3 --- /dev/null +++ b/myteamwallet_frontend/src/app/app.routes.ts @@ -0,0 +1,18 @@ +import { Routes } from '@angular/router'; +import { homeRoutes } from './modules/home/home.routes'; +import { authRoutes } from './modules/auth/auth.routes'; + +export const routes: Routes = [ + { + path: '', children: homeRoutes + }, + { + path: 'auth', children: authRoutes + }, + { + path: 'password-change/:hash', loadComponent: () => import('./modules/auth/password-change/password-change.component').then(m => m.PasswordChangeComponent) + }, + { + path: 'teams', loadChildren: () => import('./modules/teams/teams.module').then(m => m.TeamsModule) + } +]; diff --git a/myteamwallet_frontend/src/app/core/guards/auth.guard.ts b/myteamwallet_frontend/src/app/core/guards/auth.guard.ts new file mode 100644 index 0000000..ffb61aa --- /dev/null +++ b/myteamwallet_frontend/src/app/core/guards/auth.guard.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRoute, ActivatedRouteSnapshot, Route, Router, RouterStateSnapshot, UrlSegment, UrlTree } from '@angular/router'; +import { Observable } from 'rxjs'; +import { AuthService } from 'src/app/modules/auth.service'; + + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard { + constructor(private router: Router, private activatedRoute: ActivatedRoute, private authService: AuthService) {} + + private async check(): Promise { + console.log("checking") + if (this.authService.isLoggedIn()) { return true; } + const success = await this.authService.loginFromLocalStorage(); + if (success) { + return true; + } + + this.router.navigate(['/auth']).then(); + return false; + } + + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + return this.check(); + } + canActivateChild( + childRoute: ActivatedRouteSnapshot, + state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + return this.check(); + } + canLoad(): Observable | Promise | boolean | UrlTree { + return this.check(); + } +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/core/interceptor/auth.interceptor.ts b/myteamwallet_frontend/src/app/core/interceptor/auth.interceptor.ts new file mode 100644 index 0000000..a51f2f7 --- /dev/null +++ b/myteamwallet_frontend/src/app/core/interceptor/auth.interceptor.ts @@ -0,0 +1,34 @@ +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Observable, catchError, throwError } from 'rxjs'; +import { AuthService } from 'src/app/modules/auth.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthInterceptorService implements HttpInterceptor { + constructor(private authService: AuthService, private snackBar: MatSnackBar) {} + intercept(request: HttpRequest, next: HttpHandler): Observable> { + const token = this.authService.getAuthToken(); + + if (token) { + // If we have a token, we set it to the header + request = request.clone({ + setHeaders: {Authorization: `Bearer ${token}`} + }); + } + + return next.handle(request).pipe( + catchError((err) => { + if (err instanceof HttpErrorResponse) { + if (err.status === 401 && this.authService.isLoggedIn()) { + this.snackBar.open('Sitzung abgelaufen, bitte erneut anmelden', undefined, { duration: 5000 }); + this.authService.logout(); + } + } + return throwError(err); + }) + ) + } +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/core/translate/translate-loader.ts b/myteamwallet_frontend/src/app/core/translate/translate-loader.ts new file mode 100644 index 0000000..d2eae50 --- /dev/null +++ b/myteamwallet_frontend/src/app/core/translate/translate-loader.ts @@ -0,0 +1,13 @@ +import { HttpClient } from '@angular/common/http'; +import { TranslateLoader } from '@ngx-translate/core'; +import { Observable } from 'rxjs'; + +import { environment } from '../../../environments/environment'; + +export class CustomTranslateLoader implements TranslateLoader { + constructor(private http: HttpClient) {} + + getTranslation(lang: string): Observable { + return this.http.get(`${environment.apiUrl}translations/${lang}`); + } +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/core/user/user.service.spec.ts b/myteamwallet_frontend/src/app/core/user/user.service.spec.ts new file mode 100644 index 0000000..7c7ef51 --- /dev/null +++ b/myteamwallet_frontend/src/app/core/user/user.service.spec.ts @@ -0,0 +1,19 @@ +import { HttpClientModule } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; + +import { UserService } from './user.service'; + +describe('UserService', () => { + let service: UserService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ HttpClientModule ] + }); + service = TestBed.inject(UserService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/core/user/user.service.ts b/myteamwallet_frontend/src/app/core/user/user.service.ts new file mode 100644 index 0000000..fd3750d --- /dev/null +++ b/myteamwallet_frontend/src/app/core/user/user.service.ts @@ -0,0 +1,30 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { AuthService } from 'src/app/modules/auth.service'; +import { environment } from 'src/environments/environment'; + +@Injectable({ + providedIn: 'root' +}) +export class UserService { + + players: any[] = []; + + constructor(private http: HttpClient, private authService: AuthService, private snackBar: MatSnackBar) { } + + + loadTeamsOfUser() { + this.http.get(`${environment.apiUrl}users/${this.authService.user.id}/teams`).subscribe({ + next: data => { this.players = data as any[]; }, + error: () => { this.onUserLoadFailure(); } + }) + } + + onUserLoadFailure() { + this.snackBar.open('Teams konnten nicht geladen werden', undefined, { + duration: 5000, + panelClass: 'snackbar_error' + }) + } +} diff --git a/myteamwallet_frontend/src/app/model/index.ts b/myteamwallet_frontend/src/app/model/index.ts new file mode 100644 index 0000000..2736192 --- /dev/null +++ b/myteamwallet_frontend/src/app/model/index.ts @@ -0,0 +1,3 @@ +export * from './player'; +export * from './teamrole'; +export * from './transaction'; \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/model/player.ts b/myteamwallet_frontend/src/app/model/player.ts new file mode 100644 index 0000000..ef02bf2 --- /dev/null +++ b/myteamwallet_frontend/src/app/model/player.ts @@ -0,0 +1,16 @@ +import { Team } from '../modules/teams/model/team'; +import { TeamRole } from './teamrole'; + +export interface Player { + firstName: string; + lastName: string; + id: number; + balance: number; + team: Team; + teamRole: TeamRole; + active: boolean; + + hide: boolean; + + usersPlayer?: boolean; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/model/teamrole.ts b/myteamwallet_frontend/src/app/model/teamrole.ts new file mode 100644 index 0000000..681ffa1 --- /dev/null +++ b/myteamwallet_frontend/src/app/model/teamrole.ts @@ -0,0 +1,4 @@ +export interface TeamRole { + id: number; + name: string; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/model/transaction.ts b/myteamwallet_frontend/src/app/model/transaction.ts new file mode 100644 index 0000000..7d97e32 --- /dev/null +++ b/myteamwallet_frontend/src/app/model/transaction.ts @@ -0,0 +1,9 @@ +export interface Transaction { + id: number; + amount: number; + playerName?: string; + date: string; + type: string; + note: string; + isTeamWalletTransaction: boolean; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/model/user.ts b/myteamwallet_frontend/src/app/model/user.ts new file mode 100644 index 0000000..a1e5d4e --- /dev/null +++ b/myteamwallet_frontend/src/app/model/user.ts @@ -0,0 +1,17 @@ +export interface User { + createdAt: string; + deletedAt: string; + email: string; + firstName: string; + lastName: string; + id: number; + photo: string; + role: Role; + status: any; + updatedAt: string; +} + +export interface Role { + id: number; + name: string; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth.service.spec.ts b/myteamwallet_frontend/src/app/modules/auth.service.spec.ts new file mode 100644 index 0000000..38fde55 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth.service.spec.ts @@ -0,0 +1,37 @@ +import { HttpClient } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let service: AuthService; + const mockHttp = jasmine.createSpyObj('HttpClient', ['post']); + mockHttp.post.and.returnValue(of({ + token: 'token', + user: {id: 1, email: 'mail', firstName: 'first', lastName: 'last'} + })) + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [], + providers: [{ provide: HttpClient, useValue: mockHttp }] + }); + service = TestBed.inject(AuthService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should log in', async () => { + expect(service['authInfoSubject'].value).toBeNull(); + const success = await service.login('mail', 'passwort123'); + expect(success).toBeTrue(); + expect(service['authInfoSubject'].value).not.toBeNull(); + expect(service['authInfoSubject'].value.id).toBe(1); + expect(service['authInfoSubject'].value.email).toEqual('mail'); + expect(service['authInfoSubject'].value.firstName).toEqual('first'); + expect(service['authInfoSubject'].value.lastName).toEqual('last'); + }) +}); diff --git a/myteamwallet_frontend/src/app/modules/auth.service.ts b/myteamwallet_frontend/src/app/modules/auth.service.ts new file mode 100644 index 0000000..1f699b5 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth.service.ts @@ -0,0 +1,117 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { environment } from 'src/environments/environment'; +import { User } from '../model/user'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthService { + + private authInfoSubject: BehaviorSubject = new BehaviorSubject(null as any); + authInfo$: Observable = this.authInfoSubject.asObservable(); + + private token: string = ''; + + constructor(private http: HttpClient, private router: Router) { + } + + get isAdmin(): boolean { + return this.user != null && this.user.role != null && this.user.role.id == 1; + } + + isLoggedIn(): boolean { + return this.authInfoSubject.value != null; + } + + get user(): User { + return this.authInfoSubject.value; + } + + public async login(email: string, password: string): Promise { + return new Promise(resolve => { + this.http.post(`${environment.apiUrl}auth/email/login`, { email, password }).subscribe((result: any) => { + localStorage.setItem('accessToken', window.btoa(result['token'])); + this.authInfoSubject.next(result['user']); + this.token = result['token']; + resolve(true); + }, error => { + this.http.post(`${environment.apiUrl}auth/admin/email/login`, { email, password }).subscribe((result: any) => { + if (result && result['token']) { + localStorage.setItem('accessToken', window.btoa(result['token'])); + this.authInfoSubject.next(result['user']); + this.token = result['token']; + resolve(true) + } + }, error => { + resolve(false); + }) + }) + }) + } + + getAuthToken(): string { + return this.token; + } + + async verifyAccessToken(token: string): Promise { + this.token = token; + return new Promise(resolve => { + this.http.get(`${environment.apiUrl}auth/me`).subscribe(res => { + if (res && res.firstName) { + this.authInfoSubject.next(res); + if ((res as any)['token']) { + const token = (res as any)['token']; + this.token = token; + localStorage.setItem('accessToken', window.btoa(token)); + } + return resolve(true); + } + return resolve(false); + + }, () => { + return resolve(false); + }) + }) + + } + + logout() { + this.authInfoSubject.next(null as any); + localStorage.removeItem('accessToken'); + this.router.navigate(['auth']) + } + + register(data: {email: string, password: string, firstName: string, lastName: string, linkPlayerId?: number}): Observable { + return this.http.post(`${environment.apiUrl}auth/email/register`, data); + } + + forgotPassword(email: string): Observable { + return this.http.post(`${environment.apiUrl}auth/forgot/password`, { email }); + } + + resetPassword(hash: string, password: string): Observable { + return this.http.post(`${environment.apiUrl}auth/reset/password`, { hash, password }); + } + + async loginFromLocalStorage(suppressNavigation = false): Promise { + return new Promise(async resolve => { + const authToken = localStorage.getItem('accessToken'); + + if (!authToken || authToken.length == 0) { + if (!suppressNavigation) { + this.router.navigate(['/auth']).then(); + } + return resolve(false); + } + + const accessToken = window.atob(authToken); + + + const success = await this.verifyAccessToken(accessToken); + resolve(success) + }) + } +} diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.component.html b/myteamwallet_frontend/src/app/modules/auth/auth.component.html new file mode 100644 index 0000000..ee410ce --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/auth.component.html @@ -0,0 +1,12 @@ + + + + +
+
Teams:
+ @for(t of cachedTeams; track t) { + + } + + +
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.component.scss b/myteamwallet_frontend/src/app/modules/auth/auth.component.scss new file mode 100644 index 0000000..abf38c8 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/auth.component.scss @@ -0,0 +1,25 @@ +:host { + display: flex; + justify-content: center; + align-items: center; + width: 100vw; + height: 100%; + flex-direction: column; + gap: 64px; +} + +mat-card { + width: 500px; + max-width: 90vw; +} + +.cached_teams { + display: flex; + flex-direction: column; + justify-content: stretch; + gap: 4px; + + button { + width: 100%; + } +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/auth.component.spec.ts new file mode 100644 index 0000000..00cff93 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/auth.component.spec.ts @@ -0,0 +1,27 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatCardModule } from '@angular/material/card'; +import { RouterModule } from '@angular/router'; + +import { AuthComponent } from './auth.component'; + +describe('AuthComponent', () => { + let component: AuthComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ AuthComponent ], + imports: [ MatCardModule, RouterModule ], + providers: [ ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AuthComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.component.ts b/myteamwallet_frontend/src/app/modules/auth/auth.component.ts new file mode 100644 index 0000000..a8b3a86 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/auth.component.ts @@ -0,0 +1,63 @@ +import { Component, inject } from '@angular/core'; +import { AuthService } from '../auth.service'; +import { Router, RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { HttpClientModule } from '@angular/common/http'; +import { MatCardModule } from '@angular/material/card'; +import { AuthGuard } from '../../core/guards/auth.guard'; +import { MatButtonModule } from '@angular/material/button'; + +@Component({ + selector: 'app-auth', + templateUrl: './auth.component.html', + styleUrls: ['./auth.component.scss'], + standalone: true, + imports: [ + CommonModule, + MatCardModule, + HttpClientModule, + RouterModule, + MatButtonModule + ], + providers: [ AuthGuard ] +}) +export class AuthComponent { + + private auth: AuthService = inject(AuthService); + private router: Router = inject(Router); + + cachedTeams: any[] = []; + + constructor() { + // this.login(); + this.getCachedTeams(); + } + + login() { + this.auth.loginFromLocalStorage().then(res => { + if (res) { + this.router.navigate(['/dashboard']); + } + }) + } + + + getCachedTeams() { + let t = localStorage.getItem('cached_teams'); + if (!t) { return; } + + let teams = JSON.parse(t); + this.cachedTeams = Object.keys(teams).map((k: any) => { + return { alias: k, name: teams[k] } + }); + } + + openTeam(alias: string) { + this.router.navigate([`teams/${alias}`]) + } + + clear() { + localStorage.removeItem('cached_teams'); + this.cachedTeams = []; + } +} diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.routes.ts b/myteamwallet_frontend/src/app/modules/auth/auth.routes.ts new file mode 100644 index 0000000..e0d74b1 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/auth.routes.ts @@ -0,0 +1,18 @@ +import { Routes } from '@angular/router'; +import { AuthComponent } from './auth.component'; + +export const authRoutes: Routes = [ + { + path: '', component: AuthComponent, + children: [{ + path: '', loadChildren: () => import('./login/login.module').then(m => m.LoginModule) + }, + { + path: 'register', loadChildren: () => import('./register/register.module').then(m => m.RegisterModule) + }, + { + path: 'forgot-password', loadComponent: () => import('./forgot-password/forgot-password.component').then(m => m.ForgotPasswordComponent) + }] + }, + +]; diff --git a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.html b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.html new file mode 100644 index 0000000..a75c67b --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.html @@ -0,0 +1,29 @@ + + Passwort vergessen + + + + + +

Gib deine E-Mail-Adresse ein. Falls sie bei uns registriert ist, schicken wir dir einen Link zum Zurücksetzen des Passworts.

+ +
+ + Email + + +
+ +

Anfrage konnte nicht gesendet werden. Bitte später erneut versuchen.

+
+ + +

Falls die E-Mail-Adresse bei uns registriert ist, wurde eine Nachricht mit einem Link zum Zurücksetzen des Passworts verschickt. Bitte Posteingang (und Spam-Ordner) prüfen.

+
+ +
+ + + Zurück zum Login + + diff --git a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.scss b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.scss new file mode 100644 index 0000000..44fc5a7 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.scss @@ -0,0 +1,13 @@ +mat-form-field { + width: 100%; +} + +mat-card-header { + margin-bottom: 16px; +} + +.forgot-error { + color: #b3261e; + margin: 8px 0 0; + font-size: 0.9rem; +} diff --git a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.ts b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.ts new file mode 100644 index 0000000..6dda896 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.ts @@ -0,0 +1,56 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { RouterModule } from '@angular/router'; +import { AuthService } from '../../auth.service'; + +@Component({ + selector: 'app-forgot-password', + templateUrl: './forgot-password.component.html', + styleUrls: ['./forgot-password.component.scss'], + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatCardModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + RouterModule + ] +}) +export class ForgotPasswordComponent { + + submitted = false; + error = false; + + form = new FormGroup({ + email: new FormControl('', [Validators.required, Validators.email]) + }); + + constructor(private authService: AuthService) {} + + submit() { + if (this.form.invalid) { return; } + const email = this.form.controls.email.value + ''; + this.error = false; + + this.authService.forgotPassword(email).subscribe({ + next: () => { this.submitted = true; }, + error: (err) => { + // Aus Datenschutzgründen wird bei unbekannter E-Mail dieselbe + // Erfolgsmeldung angezeigt wie bei einer bekannten Adresse. + if (err?.error?.errors?.email === 'emailNotExists') { + this.submitted = true; + return; + } + this.error = true; + } + }); + } + +} diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login-routing.module.ts b/myteamwallet_frontend/src/app/modules/auth/login/login-routing.module.ts new file mode 100644 index 0000000..502fa32 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/login/login-routing.module.ts @@ -0,0 +1,16 @@ + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { LoginComponent } from './login.component'; + +const routes: Routes = [ + { + path: '', component: LoginComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class LoginRoutingModule { } \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.component.html b/myteamwallet_frontend/src/app/modules/auth/login/login.component.html new file mode 100644 index 0000000..c19032d --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/login/login.component.html @@ -0,0 +1,31 @@ + + Login + + + +
+ +
+ + Email + + +
+ +
+ + Passwort + + +
+ + + +
+ +
+ + + Passwort vergessen? + + \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.component.scss b/myteamwallet_frontend/src/app/modules/auth/login/login.component.scss new file mode 100644 index 0000000..d6a6c0d --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/login/login.component.scss @@ -0,0 +1,13 @@ +mat-form-field { + width: 100%; +} + +mat-card-header { + margin-bottom: 24px; +} + +.login-error { + color: #b3261e; + margin: 0 0 8px; + font-size: 0.9rem; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/login/login.component.spec.ts new file mode 100644 index 0000000..e642643 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/login/login.component.spec.ts @@ -0,0 +1,35 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { AuthService } from '../../auth.service'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + const mockAuthService = jasmine.createSpyObj('AuthService', ['']) + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ LoginComponent ], + providers: [ + { provide: AuthService, useValue: mockAuthService } + ], + imports: [ MatCardModule, FormsModule, MatFormFieldModule, ReactiveFormsModule, MatInputModule, MatButtonModule, MatSnackBarModule, NoopAnimationsModule ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.component.ts b/myteamwallet_frontend/src/app/modules/auth/login/login.component.ts new file mode 100644 index 0000000..825b8aa --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/login/login.component.ts @@ -0,0 +1,42 @@ +import { Component } from '@angular/core'; +import { FormGroup, FormControl, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { AuthService } from '../../auth.service'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class LoginComponent { + + loginFailed = false; + + constructor(private authService: AuthService, private router: Router, private snackBar: MatSnackBar) { + } + + loginForm = new FormGroup({ + email: new FormControl('', [Validators.required, Validators.email]), + password: new FormControl('', [Validators.required]) + }); + + + async login() { + const email = this.loginForm.controls.email.value + ''; + const password = this.loginForm.controls.password.value + '' + this.loginFailed = false; + const success = await this.authService.login(email, password); + + if (success) { + this.router.navigate(['/dashboard']).then(); + } else { + this.loginFailed = true; + this.snackBar.open('E-Mail oder Passwort ist falsch', undefined, { + duration: 5000, + panelClass: 'snackbar_error' + }); + } + } + +} diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.module.ts b/myteamwallet_frontend/src/app/modules/auth/login/login.module.ts new file mode 100644 index 0000000..600b982 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/login/login.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { LoginComponent } from './login.component'; +import { LoginRoutingModule } from './login-routing.module'; +import { MatCardModule } from '@angular/material/card'; +import {MatButtonModule} from '@angular/material/button'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import { ReactiveFormsModule } from '@angular/forms'; +import {MatInputModule} from '@angular/material/input'; + +@NgModule({ + declarations: [ + LoginComponent + ], + imports: [ + CommonModule, + LoginRoutingModule, + MatCardModule, + MatButtonModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule + ] +}) +export class LoginModule { } diff --git a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.html b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.html new file mode 100644 index 0000000..9ba41b6 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.html @@ -0,0 +1,45 @@ + + + Neues Passwort vergeben + + + + + +
+ + Neues Passwort + + Mindestens 6 Zeichen + + + + Passwort wiederholen + + + +

+ Die Passwörter stimmen nicht überein. +

+
+ +

+ Der Link ist ungültig oder abgelaufen. Bitte fordere über "Passwort vergessen" einen neuen Link an. +

+
+ + +

Dein Passwort wurde geändert. Du wirst gleich zum Login weitergeleitet.

+
+ + +

Dieser Link ist unvollständig. Bitte fordere über "Passwort vergessen" einen neuen Link an.

+
+ +
+ + + Zurück zum Login + + +
diff --git a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.scss b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.scss new file mode 100644 index 0000000..a1f7fa8 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.scss @@ -0,0 +1,26 @@ +:host { + display: flex; + justify-content: center; + align-items: center; + width: 100vw; + height: 100%; +} + +mat-card { + width: 500px; + max-width: 90vw; +} + +mat-form-field { + width: 100%; +} + +mat-card-header { + margin-bottom: 16px; +} + +.password-error { + color: #b3261e; + margin: 8px 0 0; + font-size: 0.9rem; +} diff --git a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.ts b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.ts new file mode 100644 index 0000000..5b7cadd --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.ts @@ -0,0 +1,65 @@ +import { CommonModule } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { AbstractControl, FormControl, FormGroup, ReactiveFormsModule, ValidationErrors, Validators } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { AuthService } from '../../auth.service'; + +function passwordsMatch(control: AbstractControl): ValidationErrors | null { + const password = control.get('password')?.value; + const confirmPassword = control.get('confirmPassword')?.value; + return password && confirmPassword && password !== confirmPassword ? { passwordMismatch: true } : null; +} + +@Component({ + selector: 'app-password-change', + templateUrl: './password-change.component.html', + styleUrls: ['./password-change.component.scss'], + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatCardModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + RouterModule + ] +}) +export class PasswordChangeComponent implements OnInit { + + hash: string | null = null; + success = false; + error = false; + + form = new FormGroup({ + password: new FormControl('', [Validators.required, Validators.minLength(6)]), + confirmPassword: new FormControl('', [Validators.required]), + }, { validators: passwordsMatch }); + + constructor(private route: ActivatedRoute, private router: Router, private authService: AuthService) {} + + ngOnInit(): void { + this.hash = this.route.snapshot.paramMap.get('hash'); + if (!this.hash) { + this.error = true; + } + } + + submit() { + if (this.form.invalid || !this.hash) { return; } + this.error = false; + + this.authService.resetPassword(this.hash, this.form.controls.password.value + '').subscribe({ + next: () => { + this.success = true; + setTimeout(() => this.router.navigateByUrl('/auth'), 3000); + }, + error: () => { this.error = true; } + }); + } + +} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.html b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.html new file mode 100644 index 0000000..af896cc --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.html @@ -0,0 +1,9 @@ + + Registrieren nicht möglich + + + +
+ Es ist kein gültiger Registrierungstoken vorhanden. Das Registrieren ist derzeit nur über einen Link mit gültigem Token möglich. +
+
diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.scss b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.spec.ts new file mode 100644 index 0000000..ef92e00 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NoTokenProvidedComponent } from './no-token-provided.component'; + +describe('NoTokenProvidedComponent', () => { + let component: NoTokenProvidedComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ NoTokenProvidedComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(NoTokenProvidedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.ts new file mode 100644 index 0000000..1ba449c --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-no-token-provided', + templateUrl: './no-token-provided.component.html', + styleUrls: ['./no-token-provided.component.scss'] +}) +export class NoTokenProvidedComponent { + +} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.html b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.html new file mode 100644 index 0000000..0680b43 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.html @@ -0,0 +1 @@ + diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.scss b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.spec.ts new file mode 100644 index 0000000..e70a319 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegisterBaseComponent } from './register-base.component'; + +describe('RegisterBaseComponent', () => { + let component: RegisterBaseComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RegisterBaseComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(RegisterBaseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.ts new file mode 100644 index 0000000..af4fbe6 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-register-base', + templateUrl: './register-base.component.html', + styleUrls: ['./register-base.component.scss'] +}) +export class RegisterBaseComponent { + +} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.html b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.html new file mode 100644 index 0000000..bd18ed8 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.html @@ -0,0 +1,30 @@ +
+ +
+ + Vorname + + + + + Nachname + + +
+ +
+ + Email + + +
+ +
+ + Passwort + + Mindestens 6 Zeichen + +
+ +
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.scss b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.scss new file mode 100644 index 0000000..de0feff --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.scss @@ -0,0 +1,5 @@ +mat-form-field { + width: 100%; +} + + diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.spec.ts new file mode 100644 index 0000000..e0fc93b --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegisterFormComponent } from './register-form.component'; + +describe('RegisterFormComponent', () => { + let component: RegisterFormComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RegisterFormComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(RegisterFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.ts new file mode 100644 index 0000000..b9eef47 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.ts @@ -0,0 +1,37 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { FormGroup, FormControl, Validators } from '@angular/forms'; +import { TeamInvite } from 'src/app/modules/teams/model/team-invite'; + +@Component({ + selector: 'app-register-form', + templateUrl: './register-form.component.html', + styleUrls: ['./register-form.component.scss'] +}) +export class RegisterFormComponent implements OnInit { + + + @Input('teamInfo') teamInfo: TeamInvite | undefined; + + registerForm = new FormGroup({ + email: new FormControl('', [Validators.required, Validators.email]), + password: new FormControl('', [Validators.required, Validators.minLength(6)]), + lastName: new FormControl('', [Validators.required]), + firstName: new FormControl('', [Validators.required]), + }); + + + + ngOnInit(): void { + if (this.teamInfo) { + let names = this.teamInfo.playerName.split(' '); + if (names && names.length == 2) { + this.registerForm.controls.firstName.patchValue(names[0]) + this.registerForm.controls.lastName.patchValue(names[1]) + } + } + } + + register() { + + } +} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.html b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.html new file mode 100644 index 0000000..7005d40 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.html @@ -0,0 +1,27 @@ + + Registrieren + + + + +
Hallo {{ teamInfo.playerName }},
+ + + du wurdes eingeladen dich für das Team {{ teamInfo.teamName }} zu registrieren. + + +
+ +
+ +
+ +
+ Registrierung fehlgeschlagen. Bitte wende dich an deinen Ansprechpartner. +
+ +
+ + + + \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.scss b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.scss new file mode 100644 index 0000000..9dba3cd --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.scss @@ -0,0 +1,12 @@ +.info { + font-weight: bold; +} + +.register_form { + margin-top: 24px; +} + +.error { + margin-top: 24px; + color: red; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.spec.ts new file mode 100644 index 0000000..f975533 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegisterComponent } from './register.component'; + +describe('RegisterComponent', () => { + let component: RegisterComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RegisterComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(RegisterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.ts new file mode 100644 index 0000000..2ddebf8 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.ts @@ -0,0 +1,85 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { ActivatedRoute, Router } from '@angular/router'; +import { AuthService } from 'src/app/modules/auth.service'; +import { TeamsService } from 'src/app/modules/teams/teams.service'; +import { RegisterFormComponent } from './register-form/register-form.component'; + +@Component({ + selector: 'app-register', + templateUrl: './register.component.html', + styleUrls: ['./register.component.scss'] +}) +export class RegisterComponent implements OnInit { + + private token: string | null= null; + public teamInfo: { playerId: number, playerName: string, teamId: number, teamName: string} | undefined; + error: boolean = false; + + constructor(private route: ActivatedRoute, private router: Router, private teamsService: TeamsService, private authService: AuthService, private snackBar: MatSnackBar) {} + + + @ViewChild('formComponent') formComponent!: RegisterFormComponent; + + + ngOnInit(): void { + this.validateToken(this.route.snapshot.paramMap.get('token')); + + } + + private async validateToken(token: string | null) { + + if (!token) { + return this.onNoTokenProvided(); + } else { + this.teamsService.validateRegistrationToken(token).subscribe({ + next: data => { this.teamInfo = data; }, + error: () => { return this.onNoTokenProvided(); } + }); + } + + this.token = token; + } + + private onNoTokenProvided() { + this.router.navigateByUrl('auth/register/no-token'); + } + + get registerForm() { + return this.formComponent?.registerForm; + } + + get registerFormInvalid(): boolean { + return !this.registerForm || this.registerForm.invalid; + } + + register() { + const data = this.registerForm.value as any; + data.linkPlayerId = this.teamInfo?.playerId; + + this.authService.register(data).subscribe({ + next: () => { this.onPlayerRegistrationSuccess() }, + error: () => { this.onPlayerRegistrationFailure() } + }) + } + + onPlayerRegistrationSuccess() { + this.error = false; + this.snackBar.open('Erfolgreich registriert', undefined, { + duration: 5000 + }); + + this.router.navigateByUrl('/auth') + } + + onPlayerRegistrationFailure() { + + this.snackBar.open('Registrierung nicht möglich', undefined, { + duration: 5000, + panelClass: 'snackbar_error' + }); + + this.registerForm.reset() + } + +} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/register-routing.module.ts b/myteamwallet_frontend/src/app/modules/auth/register/register-routing.module.ts new file mode 100644 index 0000000..97d7dd6 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/register-routing.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { NoTokenProvidedComponent } from './components/no-token-provided/no-token-provided.component'; +import { RegisterBaseComponent } from './components/register-base/register-base.component'; +import { RegisterComponent } from './components/register/register.component'; + +const routes: Routes = [ + { path: '', component: RegisterBaseComponent, children: [ + { + path: 'no-token', + component: NoTokenProvidedComponent + }, + { + path: ':token', + component: RegisterComponent + } + ] } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class RegisterRoutingModule { } diff --git a/myteamwallet_frontend/src/app/modules/auth/register/register.module.ts b/myteamwallet_frontend/src/app/modules/auth/register/register.module.ts new file mode 100644 index 0000000..764ae3e --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/auth/register/register.module.ts @@ -0,0 +1,35 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { RegisterRoutingModule } from './register-routing.module'; +import { NoTokenProvidedComponent } from './components/no-token-provided/no-token-provided.component'; +import { RegisterBaseComponent } from './components/register-base/register-base.component'; +import { MatCardModule } from '@angular/material/card'; +import { RegisterComponent } from './components/register/register.component'; +import { RegisterFormComponent } from './components/register/register-form/register-form.component'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatButtonModule } from '@angular/material/button'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; + + +@NgModule({ + declarations: [ + NoTokenProvidedComponent, + RegisterBaseComponent, + RegisterComponent, + RegisterFormComponent + ], + imports: [ + CommonModule, + RegisterRoutingModule, + MatCardModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + MatButtonModule, + MatSnackBarModule + ] +}) +export class RegisterModule { } diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html new file mode 100644 index 0000000..4fb291c --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html @@ -0,0 +1,34 @@ + +
+ Welcome {{ name }}, your Role is {{ role }} +
+ + +
+
Deine Teams
+
Klicke auf eins der Teams um es zu verwalten
+
+
+
+ {{ p.team.name }} +
+
Balance: {{ p.team.balance | currency:'EUR' }}
+
+ {{ p.firstName }} {{ p.lastName }} +
+
+ Rolle: {{ p.teamRole.name | translate }} +
+ +
+
+ + +
+
+
+ diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.scss b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.scss new file mode 100644 index 0000000..67a0621 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.scss @@ -0,0 +1,38 @@ + + +.icons { + display: flex; + align-items: center; + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease-in-out; +} + +.team_row { + padding: 2px 8px; + border: 1px solid #ccc; + border-radius: 4px; + align-items: stretch; + + &:hover > .icons { + opacity: 1; + pointer-events: all; + } + + &:not(:first-of-type) { + margin-top: 8px; + } +} + +@media screen and (max-width: 700px) { + .icons { + opacity: 1; + pointer-events: all; + align-items: stretch; + + button { + height: inherit; + width: 48px; + } + } +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.spec.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.spec.ts new file mode 100644 index 0000000..f041725 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.spec.ts @@ -0,0 +1,25 @@ +import { HttpClientModule } from '@angular/common/http'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DashboardComponent } from './dashboard.component'; + +describe('DashboardComponent', () => { + let component: DashboardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ DashboardComponent ], + imports: [ HttpClientModule ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts new file mode 100644 index 0000000..101f9e7 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts @@ -0,0 +1,60 @@ +import { Component } from '@angular/core'; +import { Router } from '@angular/router'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { UserService } from 'src/app/core/user/user.service'; +import { AuthService } from '../../auth.service'; +import { CommonModule } from '@angular/common'; +import { Player } from 'src/app/model'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; + +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.scss'], + standalone: true, + imports: [ CommonModule, TranslateModule, MatButtonModule, MatIconModule ] +}) +export class DashboardComponent { + + link: string = window.location.host; + + constructor( + private authService: AuthService + , private userService: UserService + , private router: Router + , public translate: TranslateService) {} + + + + get role(): string { + + if (!this.authService || !this.authService.isLoggedIn()) { return ''} + + return this.authService.user.role.name; + } + + get name(): string { + if (!this.authService || !this.authService.isLoggedIn()) { return ''} + + return this.authService.user.firstName + ' ' + this.authService.user.lastName; + } + + get players(): any[] { + return this.userService.players; + } + + onTeamClick(team: any) { + this.router.navigate([`dashboard/${team.alias}/details`]) + } + + onLinkClick(event: any) { + event.stopPropagation(); + return; + } + + async copyLink(p: Player) { + const link = `https://${this.link}/teams/${p.team.alias}` + await navigator.clipboard.writeText(link); + } +} diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.routes.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.routes.ts new file mode 100644 index 0000000..93f6319 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.routes.ts @@ -0,0 +1,7 @@ +import { Routes } from '@angular/router'; + +export const dashboardRoutes: Routes = [ + { path: '', loadComponent: () => import('./dashboard.component').then(m => m.DashboardComponent) }, + { path: ':id/details', loadComponent: () => import('./team-details/team-details.component').then(m => m.TeamDetailsComponent) } +]; + diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.html b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.html new file mode 100644 index 0000000..63efba2 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.html @@ -0,0 +1,11 @@ +
+ {{ playerInitials }} +
+ +
+ +
{{ player.firstName}} {{ player.lastName }}
+
{{ player.teamRole.name | translate }}
+ +
{{ 'balance' | translate }}: {{ player.balance | currency:'EUR' }}
+
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.scss b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.scss new file mode 100644 index 0000000..c9627aa --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.scss @@ -0,0 +1,31 @@ +:host { + display: flex; + flex: 250px 1 1; + cursor: pointer; +} + +.player_icon { + width: 48px; + height: 48px; + line-height: 48px; + text-align: center; + font-size: 20px; + border-radius: 50%; + border: 1px solid #ccc + +} +.content{ + margin-left: 12px; +} + +.name { + font-weight: bold; +} + +.line_through{ + text-decoration: line-through; +} + +.inactive { + opacity: 0.5; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.spec.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.spec.ts new file mode 100644 index 0000000..99efc21 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PlayerCardComponent } from './player-card.component'; + +describe('PlayerCardComponent', () => { + let component: PlayerCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PlayerCardComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PlayerCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.ts new file mode 100644 index 0000000..355306b --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.ts @@ -0,0 +1,27 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input, OnInit, Output } from '@angular/core'; +import { TranslateModule } from '@ngx-translate/core'; +import { Player } from 'src/app/model'; + +@Component({ + selector: 'app-player-card', + templateUrl: './player-card.component.html', + styleUrls: ['./player-card.component.scss'], + standalone: true, + imports: [CommonModule, TranslateModule] +}) +export class PlayerCardComponent implements OnInit { + + @Input() player!: Player; + + + ngOnInit(): void {} + + + get playerInitials(): string { + if (!this.player) { return ' '; } + + return this.player.firstName.substring(0, 1) + this.player.lastName.substring(0, 1); + } + +} diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.html b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.html new file mode 100644 index 0000000..aee3c79 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.html @@ -0,0 +1,9 @@ +

{{ player.firstName }} {{ player.lastName }}

+ +
+ +
+ Spieler aktiv +
+ +
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.scss b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.scss new file mode 100644 index 0000000..55b1cda --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.scss @@ -0,0 +1,10 @@ +:host { + display: flex; + overflow: hidden; + flex-direction: column; + padding: 8px 14px 8px 14px; +} + +.body { + padding: 6px 12px 24px 6px; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.ts new file mode 100644 index 0000000..106cfb5 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.ts @@ -0,0 +1,59 @@ +import { CommonModule } from '@angular/common'; +import { HttpClient } from '@angular/common/http'; +import { Component, EventEmitter, inject, Inject, Output } from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Player } from '../../../../../../model'; +import { AuthService } from 'src/app/modules/auth.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-player-details', + templateUrl: './player-details.component.html', + styleUrls: ['./player-details.component.scss'], + standalone: true, + imports: [CommonModule, MatSlideToggleModule] +}) +export class PlayerDetailsComponent { + + player: Player; + loading: boolean = false; + private auth: AuthService = inject(AuthService); + + @Output('onReload') changed = new EventEmitter(); + + constructor(@Inject(MAT_DIALOG_DATA) public data: DialogData, private http: HttpClient, private snackBar: MatSnackBar) { + this.player = data.player; + } + + + get isAdmin() { + return this.auth.isAdmin; + } + + setPlayerActive(event: any) { + this.loading = true; + const copy = { ...this.player } + this.player.active = event.checked; + this.http.put(`${environment.apiUrl}teams/${this.player.team.id}/players`, this.player).subscribe({ + next: r => { + this.changed.emit(); + }, + error: e => { + this.player.active = copy.active; + + this.snackBar.open('Spieler konnte nicht aktualisiert werden', undefined, { + duration: 5000, + panelClass: 'snackbar_error' + }) + + }, + complete: () => { this.loading = false; } + }) + } +} + +interface DialogData { + player: Player; +} diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.html b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.html new file mode 100644 index 0000000..c5270be --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.html @@ -0,0 +1,92 @@ +
+
+ {{ team.name }} ({{ translateRolename(roleName) }}) +
Spieleranzahl: {{ team.players?.length }} (aktiv: {{ activePlayerCount }})
+
+
+
Saldo: {{ team.balance | currency:'EUR' }}
+
Ausstehend: {{ team.outstanding | currency:'EUR' }} +
+
+ +
+ + + + + + + +
+ + +
+ + + + + s + + +
+ +
+
+
+ + + +
+
+
+
Alle
+
+ +
+ + Suche + + + + + + +
{{ p.firstName}} {{ p.lastName }} - Ich
+
{{ p.balance | currency:'EUR'}}
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+ +
+ + {{players.selectedOptions.selected.length}} Spieler gewählt + Spieler für einen Eintrag wählen + +
+
+ + + + + + + \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.scss b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.scss new file mode 100644 index 0000000..ec220ce --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.scss @@ -0,0 +1,59 @@ +.title-row { + display: flex; + justify-content: space-between; +} + +:host { + display: flex; + flex-direction: column; + overflow: hidden; + flex: 1 1 auto; +} + +.list{ + flex: 1 1 100%; + overflow: auto; +} + +.back { + width: 28px; + height: 28px; + background-color: red; + cursor: pointer; +} + +.select_all { + margin-right: 52px; + text-decoration: underline; + cursor: pointer; + color: #646464; + + &:hover { + color: black; + } +} + +.buttons { + margin-top: 6px; +} + +.highlight { + // text-decoration: wavy; + font-style: italic; +} + +mat-tab-group { + flex: 1 1 100%; + height: 257px; +} + +.mat-tab__content { + height: 100%; + overflow: hidden; + display: flex; + flex-direction: column; +} + +.break { + flex-wrap: wrap; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.spec.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.spec.ts new file mode 100644 index 0000000..278b460 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.spec.ts @@ -0,0 +1,93 @@ +import { HttpClient } from '@angular/common/http'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatListModule } from '@angular/material/list'; +import { By } from '@angular/platform-browser'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { TeamDetailsComponent } from './team-details.component'; + +describe('TeamDetailsComponent', () => { + let component: TeamDetailsComponent; + let fixture: ComponentFixture; + const paramMap = jasmine.createSpyObj('ParamMap', ['get']) + const fakeActivatedRoute = { + snapshot: { paramMap: paramMap } + } + + paramMap.get.and.returnValue('9999'); + + const mockhttp = jasmine.createSpyObj('HttpClient', ['get']); + mockhttp.get.and.returnValue(of({ + alias: "9999", + balance: 48.09, + name: "Development Team", + outstanding: -582.00, + players: [{id: 1, firstName: 'Filiberto', lastName: 'Spencer', balance: -32.97}, {id: 2, firstName: 'Adam', lastName: 'West', balance: -50}], + settings: [] + })) + + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TeamDetailsComponent ], + providers: [ + {provide: ActivatedRoute, useValue: fakeActivatedRoute}, + {provide: HttpClient, useValue: mockhttp}, + ], + imports: [ MatListModule ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TeamDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should extract the id from the url', () => { + expect(component.id).toEqual("9999"); + }); + + it('should load the teams data', () => { + expect(component.team).not.toBeNull(); + }); + + it('should display name and alias', () => { + const nameElement = fixture.debugElement.query(By.css('#teamName')); + const text = (nameElement.nativeElement as HTMLElement).textContent; + expect(text).toEqual(`${component.team.name} (${component.team.alias})`) + + // const htmlList = (list.nativeElement as HTMLElement).children; + // expect(htmlList).not.toBeNull(); + // expect(htmlList.length).toBe(4) + }); + + it('should display a list with players', () => { + const element = fixture.debugElement.query(By.css('#playerlist')); + const ch = (element.nativeElement as HTMLElement).children; + expect(ch.length).toBe(component.team.players.length); + for (let index = 0; index < component.team.players.length; index++) { + const playerName = ch[index].textContent?.trim(); + const expectedName = `${component.team.players[index].firstName} ${component.team.players[index].lastName}`; + expect(playerName).toEqual(expectedName) + } + }); + + it('button should be disabled', () => { + const element = fixture.debugElement.query(By.css('#buttonNewTransaction')); + expect(element.nativeElement.disabled).toBeTrue(); + }); + + it('should enable the button when selecting a player', () => { + const element = fixture.debugElement.query(By.css('.mdc-checkbox')); + element.nativeElement.click(); + fixture.detectChanges(); + const buttonelement = fixture.debugElement.query(By.css('#buttonNewTransaction')); + expect(buttonelement.nativeElement.disabled).toBeFalse(); + + }) +}); \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.ts new file mode 100644 index 0000000..88cbd1f --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.ts @@ -0,0 +1,303 @@ +import { Component, createNgModuleRef, Injector, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Player } from 'src/app/model'; +import { AuthService } from 'src/app/modules/auth.service'; +import { Team } from 'src/app/modules/teams/model/team'; +import { TeamInvite } from 'src/app/modules/teams/model/team-invite'; +import { TeamsService } from 'src/app/modules/teams/teams.service'; +import { NewTransactionDialogComponent, TeamTransactionDialogComponent } from 'src/app/shared'; +import { CreatePlayerDialogComponent } from 'src/app/shared/dialog/create-player-dialog/create-player.dialog.component'; +import { PrivilegesInfoDialogComponent } from 'src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component'; +import { PlayerDetailsComponent } from './player-card/player-details/player-details.component'; +import { CommonModule } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTabsModule } from '@angular/material/tabs'; +import { PlayerCardComponent } from './player-card/player-card.component'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatListModule } from '@angular/material/list'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatInputModule } from '@angular/material/input'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; + +@Component({ + selector: 'app-team-details', + templateUrl: './team-details.component.html', + styleUrls: ['./team-details.component.scss'], + standalone: true, + imports: [ + CommonModule + , ReactiveFormsModule + , FormsModule + , MatProgressSpinnerModule + , MatDividerModule + , MatButtonModule + , MatIconModule + , MatMenuModule + , MatTabsModule + , MatFormFieldModule + , MatListModule + , MatSlideToggleModule + , MatInputModule + , PlayerCardComponent + ] +}) +export class TeamDetailsComponent implements OnInit { + id: string | null = null; + + team: Team | undefined; + + correspondingPlayer: Player | undefined; + + canDoTransactions: boolean = false; + canInvite: boolean = false; + roleName: string = ''; + + isLoading: boolean = true; + + selectedPlayers: Player[] = []; + + usersPlayers: Player[] = []; + + @ViewChild('players') players: any; + + constructor(private route: ActivatedRoute, private teamsService: TeamsService, private authService: AuthService, + private router: Router, public dialog: MatDialog, private injector: Injector, private _snackBar: MatSnackBar) {} + + ngOnInit(): void { + this.id = this.route.snapshot.paramMap.get('id'); + + if (this.id) { + this.loadTeamDetails(); + } + } + + protected loadTeamDetails() { + if (!this.id) { return; } + this.teamsService.loadTeamDetails(this.id).subscribe(result => { + this.team = result; + this.findCorrespondingPlayer(); + this.isLoading = false; + }) + } + + back() { + this.router.navigate(['../dashboard']) + } + + openDialog(): void { + + const dialogRef = this.dialog.open(NewTransactionDialogComponent, { + data: { + team: this.team, + players: this.selectedPlayers + } + }); + + dialogRef.afterClosed().subscribe(async result => { + if (result && result.length > 0) { + this.isLoading = true; + this.teamsService.createTransactions(result).subscribe(res => { + if (res && res.length > 0) { + this.loadTeamDetails(); + } + }) + + } + }); + } + + + openTeamTransactionDialog() { + if (!this.team) { return; } + const dialogRef = this.dialog.open(TeamTransactionDialogComponent, { + data: { + teamId: this.team.id + } + }); + + dialogRef.afterClosed().subscribe(async result => { + + if (result) { this.saveTeamTransaction(result); } + }); + } + + saveTeamTransaction(transaction: any) { + this.isLoading = true; + this.teamsService.createTeamTransaction(transaction).subscribe(res => { + if (res && res['id']) { + this.loadTeamDetails(); + } + }) + } + + selectAll() { + if (this.team == null || this.team.players == null) { return; } + if (this.selectedPlayers.length < this.team.players.length) { + this.selectedPlayers = []; + for (let p of this.team.players) { + this.selectedPlayers.push(p); + } + } else { + this.selectedPlayers = []; + } + + } + + onAllClick() { + if (!this.team) { return; } + const dialogRef = this.dialog.open(NewTransactionDialogComponent, { + data: { + team: this.team, + players: this.selectedPlayers, + all: this.team.players?.length == this.selectedPlayers.length + } + }); + } + + onAddPlayerClick() { + if (!this.team) { return; } + const dialogRef = this.dialog.open(CreatePlayerDialogComponent, { + data: { }, + width: '350px' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result && this.team) { + this.teamsService.createNewPlayer(this.team.id, result).subscribe({ + next: () => { this.loadTeamDetails()}, + error: () => { this.onPlayerCreateError();} + }) + } + }) + } + + onPlayerCreateError() { + this._snackBar.open('Spieler konnte nicht erstellt werden', undefined, { + duration: 10000, + panelClass: 'snackbar_error' + }) + } + + async onCreateLink() { + if (!this.team) { return; } + + try { + const invite: TeamInvite = { + teamId: this.team.id, + teamName: this.team.name, + playerId: this.selectedPlayers[0].id, + playerName: this.selectedPlayers[0].firstName + ' ' + this.selectedPlayers[0].lastName + } + const token = await this.getInviteFromServer(invite); + + const link = location.origin + '/auth/register/' + token + + await navigator.clipboard.writeText(link); + this._snackBar.open('Einladungslink für ' + invite.playerName + ' in die Zwischenablage kopiert. Der Link ist auf den gewählten Spieler personalisiert und darf nicht an mehrere Spieler verteilt werden.', undefined, { + duration: 10000, + + }); + + } catch { + this._snackBar.open('Der Einladungslink konnte nicht erzeugt werden.', undefined, { + panelClass: 'snackbar_error', + duration: 5000, + }); + } + } + + private async getInviteFromServer(invite: TeamInvite): Promise { + return new Promise((resolve, reject) => { + this.teamsService.createRegisterLink(invite).subscribe({ + next: token => { return resolve(token.token); }, + error: () => { return reject(null); } + }) + }) + } + + findCorrespondingPlayer() { + if (!this.team || !this.team.players) { return; } + const id = this.authService.user?.id; + this.usersPlayers = this.team.players.filter((p: any) => { return p.user?.id == id }); + this.canInvite = this.authService.isAdmin || this.usersPlayers.find(p => p.teamRole.id > 2) != null; + this.canDoTransactions = this.authService.isAdmin || this.usersPlayers.find(p => p.teamRole.id >= 2) != null; + + this.roleName = this.usersPlayers.reduce((prev, curr) => { return (prev.teamRole.id > curr.teamRole.id) ? prev : curr})?.teamRole.name; + + for (let u of this.usersPlayers) { + u.usersPlayer = true; + } + } + + onShowPrivileges() { + const dialogRef = this.dialog.open(PrivilegesInfoDialogComponent, { + data: null + }); + + + } + + translateRolename(roleName: string): string { + switch (roleName) { + case 'treasurer': + return 'Kassenwart' + case 'scnd_treasurer': + return 'zweiter Kassenwart' + case 'captain': + return 'Kapitän' + case 'coach': + return 'Trainer' + default: + return 'Spieler' + } + } + + + + async onShowTeamTransactions() { + if (!this.team) { return; } + + const { ShowTeamTransactionsComponent } = await import( + 'src/app/shared/dialog/show-team-transactions/show-team-transactions.component' + ); + + this.dialog.open(ShowTeamTransactionsComponent, { + data: { + id: this.team.id + } + }); + } + + openPlayerdetails(player: Player) { + if (!player) { return; } + const dialogRef = this.dialog.open(PlayerDetailsComponent, { + data: { + player + } + }); + + dialogRef.componentInstance.changed.subscribe(() => { + this.loadTeamDetails(); + }) + } + + filter(event: any) { + const search = event.target.value; + const s = search.toLowerCase().trim(); + this.team?.players?.map(p => { + const n = p.firstName.toLowerCase().trim() + '' + p.lastName.toLowerCase().trim(); + p.hide = !n.includes(s); + }); + } + + get activePlayerCount(): number { + if (!this.team || !this.team.players) { return 0; } + return this.team.players.filter(p => p.active).length; + } +} diff --git a/myteamwallet_frontend/src/app/modules/home/home.component.html b/myteamwallet_frontend/src/app/modules/home/home.component.html new file mode 100644 index 0000000..a47e106 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/home.component.html @@ -0,0 +1,9 @@ + + {{ username }} + + + + +
+ +
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/home.component.scss b/myteamwallet_frontend/src/app/modules/home/home.component.scss new file mode 100644 index 0000000..0616313 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/home.component.scss @@ -0,0 +1,18 @@ +.content_container { + display: flex; + flex-direction: column; + padding: 8px; + flex: 1 1 auto; + overflow: hidden; + + .card { + padding: 12px; + } +} + +:host { + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/home.component.ts b/myteamwallet_frontend/src/app/modules/home/home.component.ts new file mode 100644 index 0000000..ca5b4b0 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/home.component.ts @@ -0,0 +1,73 @@ +import { Component, inject } from '@angular/core'; +import { Router, RouterModule } from '@angular/router'; +import { UserService } from 'src/app/core/user/user.service'; +import { AuthService } from '../auth.service'; +import { CommonModule } from '@angular/common'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatButtonModule } from '@angular/material/button'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'], + standalone: true, + imports: [ + CommonModule, + MatToolbarModule, + RouterModule, + MatButtonModule + ] +}) +export class HomeComponent { + private authService: AuthService = inject(AuthService); + private userService: UserService = inject(UserService); + private router: Router = inject(Router); + + + constructor( + ) {} + + + ngOnInit(): void { + this.loginFromLocalStorage(); + + } + + get username(): string { + if (!this.authService || !this.authService.isLoggedIn()) { return ''} + return this.authService.user.firstName + ' ' + this.authService.user.lastName + } + + logout() { + this.authService.logout(); + } + + get isLoggedIn(): boolean { + return this.authService.isLoggedIn() + } + + private async loginFromLocalStorage() { + const success = await this.authService.loginFromLocalStorage(); + + if (!success) { + this.router.navigate(['/auth']).then(); + return; + } + + if (this.authService && this.authService.isLoggedIn()) { + this.userService.loadTeamsOfUser(); + } + + if (this.router.url == '/') { + this.router.navigate(['/dashboard']).then(); + } + } + + async login() { + + + // this.router.navigate(['/auth']).then(); + + } + +} diff --git a/myteamwallet_frontend/src/app/modules/home/home.routes.ts b/myteamwallet_frontend/src/app/modules/home/home.routes.ts new file mode 100644 index 0000000..d8bca69 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/home/home.routes.ts @@ -0,0 +1,9 @@ +import { AuthGuard } from 'src/app/core/guards/auth.guard'; +import { Route } from '@angular/router'; +import { dashboardRoutes } from './dashboard/dashboard.routes'; + +export const homeRoutes: Route[] = [ + { path: '', loadComponent: () => import('./home.component').then(m => m.HomeComponent), children: [ + { path: 'dashboard', canLoad: [AuthGuard], children: dashboardRoutes }, + ] }, +]; \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/model/team-invite.ts b/myteamwallet_frontend/src/app/modules/teams/model/team-invite.ts new file mode 100644 index 0000000..e8ae1b3 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/model/team-invite.ts @@ -0,0 +1,6 @@ +export interface TeamInvite { + teamId: number; + teamName: string; + playerId: number; + playerName: string; +} diff --git a/myteamwallet_frontend/src/app/modules/teams/model/team.ts b/myteamwallet_frontend/src/app/modules/teams/model/team.ts new file mode 100644 index 0000000..37c1737 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/model/team.ts @@ -0,0 +1,11 @@ +import { Player } from 'src/app/model'; + +export interface Team { + id: number; + alias: string; + balance: number; + name: string; + outstanding?: number; + players?: Player[]; + settings?: any[]; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.html b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.html new file mode 100644 index 0000000..b4ebc9d --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.html @@ -0,0 +1,48 @@ + + +
+
{{ data.user.firstName }}: {{ data.user.balance | currency:'EUR' }}
+
+ +@if(isLoading) { + +} @else if (transactions.length > 0) { + + + + {{ transaction.date | date }} + + + - + {{transaction.amount | currency:'EUR' }} + + {{ transaction.type.name | translate }} + - + {{ transaction.note }} + + + + + +} @else { +
Es sind keine Einträge vorhanden
+} + + + + \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.scss b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.scss new file mode 100644 index 0000000..128e0cb --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.scss @@ -0,0 +1,61 @@ +:host { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; + min-height: 200px; +} + +.row { + display: flex; +} + +.list { + max-height: 500px; + overflow: auto; +} + +.amount { + color: rgb(49, 119, 49); +} + +.negative { + color: rgb(202, 62, 62); +} + +.actions { + display: flex; + flex-direction: row; + justify-content: space-between; + padding-left: 8px; + align-items: center; + + .name { + font-weight: bold; + } + + &__buttons { + display: flex; + flex-direction: row; + padding-right: 2px; + button { + margin: 4px 2px; + } + } +} + +.balance { + + color: #fff; + padding: 12px; + text-align: center; + font-size: 1.5rem; + + &.pos { + background-color: rgb(49, 119, 49); + } + + &.neg { + background-color: rgb(202, 62, 62); + } +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.spec.ts b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.spec.ts new file mode 100644 index 0000000..63aa403 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.spec.ts @@ -0,0 +1,81 @@ +import { HttpClientModule } from '@angular/common/http'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatListModule } from '@angular/material/list'; +import { By } from '@angular/platform-browser'; +import { TeamsService } from '../../teams.service'; + +import { DetailsComponent } from './details.component'; + +describe('DetailsComponent', () => { + let component: DetailsComponent; + let fixture: ComponentFixture; + const mockTeamService = jasmine.createSpyObj('TeamsService', ['loadTransactionsOfUser']); + mockTeamService.selectedUserTransaction = [ + {id: 1, note: 'dev1', createdAt: '', date: '', amount: 100, type: {id: 1}}, + {id: 2, note: 'dev2', createdAt: '', date: '', amount: 100, type: {id: 1}}, + {id: 3, note: 'dev3', createdAt: '', date: '', amount: 100, type: {id: 1}}, + {id: 4, note: 'dev4', createdAt: '', date: '', amount: 100, type: {id: 1}}, + ]; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ DetailsComponent ], + imports: [ MatDialogModule, HttpClientModule, MatListModule ], + providers: [ + { provide: MAT_DIALOG_DATA, useValue: {} }, + { provide: MatDialogRef, useValue: {} }, + { provide: TeamsService, useValue: mockTeamService } + ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DetailsComponent); + + component = fixture.componentInstance; + + component.data.user = { + id: 2, + balance: 46.64, + firstName: 'Rover', + lastName: 'Stiedeman', + user: null + } + + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should initialise the user', () => { + + + expect(component.data.user).not.toBeNull(); + }) + + it('should have a users transactions', () => { + expect(component.transactions).not.toBeNull(); + expect(component.transactions.length).toBe(4) + }) + + it('should display the users balance', () => { + const balance = 46.64; + component.data.user.balance = balance; + const el = fixture.debugElement.query(By.css('#userBalance')); + expect(el).not.toBeNull(); + expect(el.nativeElement.textContent.trim()).toEqual('Rover: €' + balance); + }) + + it('should display users transactions', () => { + const list = fixture.debugElement.query(By.css('#transactionsList')); + const htmlList = (list.nativeElement as HTMLElement).children; + expect(htmlList).not.toBeNull(); + expect(htmlList.length).toBe(4) + + + }) +}); + + diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.ts b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.ts new file mode 100644 index 0000000..200cb66 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.ts @@ -0,0 +1,38 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { TeamsService } from '../../teams.service'; +import {MatListModule} from '@angular/material/list'; +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; +import { CommonModule } from '@angular/common'; +import { TranslateModule, TranslatePipe } from '@ngx-translate/core'; + +@Component({ + selector: 'app-details', + templateUrl: './details.component.html', + styleUrls: ['./details.component.scss'], + standalone: true, + imports: [CommonModule, MatDialogModule, MatListModule, MatProgressSpinnerModule, TranslateModule], + providers: [] +}) +export class DetailsComponent implements OnInit { + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { user: any }, + private teamService: TeamsService + ) {} + + ngOnInit(): void { + console.log("Onmit") + this.teamService.loadTransactionsOfUser(this.data.user.id); + } + + get transactions(): any[] { + return this.teamService.selectedUserTransaction; + } + + get isLoading(): boolean { + return this.teamService.transactionsLoading; + } + +} diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview-routing.module.ts b/myteamwallet_frontend/src/app/modules/teams/overview/overview-routing.module.ts new file mode 100644 index 0000000..b425c6a --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/overview-routing.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { OverviewComponent } from './overview.component'; + +const routes: Routes = [ + { + path: '', component: OverviewComponent, pathMatch: 'full' + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class OverviewRoutingModule { } diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.html b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.html new file mode 100644 index 0000000..983f851 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.html @@ -0,0 +1,72 @@ + + + {{ teamsService.team?.name }} + + + + +
+ +
+ Kontostand: {{ teamsService.team.balance | currency:'EUR' }} +
+
+ Ausstehend: {{ teamsService.team.outstanding | currency:'EUR' }} +
+
+ Total: {{ teamsService.team.outstanding + teamsService.team.balance | currency:'EUR' }} +
+
+ + + +
+ +
+ + Suche + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Vorname {{element.firstName}} Nachname {{element.lastName}} Total Saldo {{element.balance | currency:'EUR' }} {{getTotalBalance() | currency:'EUR' }}
+
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.scss b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.scss new file mode 100644 index 0000000..829518b --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.scss @@ -0,0 +1,41 @@ +:host { + width: 100vw; + height: 100%; +} + +.table-container { + position: relative; + min-height: 200px; + max-height: calc(100% - 280px); + width: calc(100vw - 48px); + margin: 12px 24px; + overflow: auto; +} + +.mat-mdc-table-sticky { + border-top: 1px solid #e0e0e0; +} + +.align-end { + text-align: end; + width: 120px; +} + +.team-info { + width: calc(100vw - 48px); + margin: 12px 24px; + height: 100px; + display: flex; + align-items: center; + justify-content: space-around; +} + +.blurr { + color: transparent; + text-shadow: 1px 1px 5px #000000; + pointer-events: none; +} + +.tr { + cursor: pointer; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.spec.ts b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.spec.ts new file mode 100644 index 0000000..95d33c6 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.spec.ts @@ -0,0 +1,40 @@ +import { HttpClientModule } from '@angular/common/http'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatTableModule } from '@angular/material/table'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { TeamsService } from '../teams.service'; + +import { OverviewComponent } from './overview.component'; + +describe('OverviewComponent', () => { + let component: OverviewComponent; + let fixture: ComponentFixture; + const mockTeamsService = jasmine.createSpyObj('TeamsService', ['']); + mockTeamsService.team = { players: []} + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ OverviewComponent ], + imports: [ HttpClientModule, MatDialogModule, MatToolbarModule, MatTableModule, MatTooltipModule ], + providers: [ + { provide: TeamsService, useValue: mockTeamsService } + ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(OverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should initialise the datasource', () => { + expect(component.dataSource).not.toBeNull(); + }) +}); +// this.teamsService.team.players \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.ts b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.ts new file mode 100644 index 0000000..db1120b --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.ts @@ -0,0 +1,100 @@ +import { LiveAnnouncer } from '@angular/cdk/a11y'; +import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSort, Sort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; +import { Router } from '@angular/router'; +import { AuthService } from '../../auth.service'; +import { TeamsService } from '../teams.service'; +import { DetailsComponent } from './details/details.component'; +import { Player } from 'src/app/model'; +import { PenaltiesComponent } from '../../../shared/penalties/penalties.component'; + +@Component({ + selector: 'app-overview', + templateUrl: './overview.component.html', + styleUrls: ['./overview.component.scss'] +}) +export class OverviewComponent implements OnInit, AfterViewInit { + + displayedColumns: string[] = ['firstName', 'lastName', 'balance']; + dataSource: any; + + @ViewChild(MatSort) sort!: MatSort; + + constructor(public teamsService: TeamsService + , private _liveAnnouncer: LiveAnnouncer + , public dialog: MatDialog, private authService: AuthService + , private router: Router) {} + ngAfterViewInit(): void { + this.dataSource.sort = this.sort; + } + + + ngOnInit(): void { + if (this.teamsService.team && this.teamsService.team.players) { + this.dataSource = new MatTableDataSource(this.teamsService.team.players.filter((p: Player) => p.active)); + this.addCachedTeam(); + } + } + + addCachedTeam() { + let t = localStorage.getItem('cached_teams'); + let teams: any = {}; + if (t) { + teams = JSON.parse(t); + + } + const key = this.teamsService.team.alias as any; + const name = this.teamsService.team.name as any; + teams[key] = name; + localStorage.setItem('cached_teams', JSON.stringify(teams)); + } + + + getTotalBalance(): number { + if (!this.teamsService || !this.teamsService.team || !this.teamsService.team.players) { return 0 } + const sum = this.teamsService.team.players.filter((p: Player) => p.active).reduce((acc: any, succ: { balance: any; }) => acc + succ.balance, 0); + return sum; + } + /** Announce the change in sort state for assistive technology. */ + announceSortChange(sortState: any) { + // This example uses English messages. If your application supports + // multiple language, you would internationalize these strings. + // Furthermore, you can customize the message to add additional + // details about the values being sorted. + if (sortState.direction) { + this._liveAnnouncer.announce(`Sorted ${sortState.direction}ending`); + } else { + this._liveAnnouncer.announce('Sorting cleared'); + } + } + + openDetails(row: any) { + this.dialog.open(DetailsComponent, { + width: '500px', + enterAnimationDuration: 500, + data: { user: row } + }) + } + + onLoginClick() { + if (this.authService.isLoggedIn()) { return; } + + this.router.navigate(['auth']) + } + + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + + openPenalties() { + this.dialog.open(PenaltiesComponent, { + data: this.teamsService.team.id, + height: '80vh' + }) + } + +} diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.module.ts b/myteamwallet_frontend/src/app/modules/teams/overview/overview.module.ts new file mode 100644 index 0000000..eb5a869 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/overview/overview.module.ts @@ -0,0 +1,43 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import {MatToolbarModule} from '@angular/material/toolbar'; +import {MatTableModule} from '@angular/material/table'; +import {MatButtonModule} from '@angular/material/button'; +import { MatSortModule } from '@angular/material/sort'; +import {MatDialogModule} from '@angular/material/dialog'; +import {MatListModule} from '@angular/material/list'; +import {MatTooltipModule} from '@angular/material/tooltip'; +import {MatInputModule} from '@angular/material/input'; +import {MatFormFieldModule} from '@angular/material/form-field'; + +import { OverviewRoutingModule } from './overview-routing.module'; +import { OverviewComponent } from './overview.component'; +import { TeamsService } from '../teams.service'; +import { DetailsComponent } from './details/details.component'; +import { TranslateModule } from '@ngx-translate/core'; + + +@NgModule({ + declarations: [ + OverviewComponent, + ], + imports: [ + CommonModule, + OverviewRoutingModule, + MatToolbarModule, + MatTableModule, + MatSortModule, + MatButtonModule, + MatDialogModule, + MatListModule, + MatTooltipModule, + TranslateModule, + MatInputModule, + MatFormFieldModule, + DetailsComponent + ], + providers: [ TeamsService ], + exports: [ OverviewComponent ] +}) +export class OverviewModule { } diff --git a/myteamwallet_frontend/src/app/modules/teams/teams-routing.module.ts b/myteamwallet_frontend/src/app/modules/teams/teams-routing.module.ts new file mode 100644 index 0000000..1767e90 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/teams-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { OverviewComponent } from './overview/overview.component'; +import { TeamsComponent } from './teams.component'; + +const routes: Routes = [ + { + path: ':hash', component: TeamsComponent + }, + { + path: 'overview', loadChildren: () => import('./overview/overview.module').then(m => m.OverviewModule) + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class TeamsRoutingModule { } diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.component.html b/myteamwallet_frontend/src/app/modules/teams/teams.component.html new file mode 100644 index 0000000..f8ba862 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/teams.component.html @@ -0,0 +1,12 @@ + +
+
+ +
Loading Data...
+
+
+
+ + + + \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.component.scss b/myteamwallet_frontend/src/app/modules/teams/teams.component.scss new file mode 100644 index 0000000..1214678 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/teams.component.scss @@ -0,0 +1,11 @@ +.loading-indicator { + display: flex; + align-items: center; + justify-content: center; + width: 100vw; + height: 100%; + + .loading-text { + margin-top: 24px; + } +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.component.spec.ts b/myteamwallet_frontend/src/app/modules/teams/teams.component.spec.ts new file mode 100644 index 0000000..95b36a5 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/teams.component.spec.ts @@ -0,0 +1,56 @@ +import { HttpClient } from '@angular/common/http'; +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { ActivatedRoute, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { TeamsComponent } from './teams.component'; +import { TeamsService } from './teams.service'; + +describe('TeamsComponent', () => { + let component: TeamsComponent; + let fixture: ComponentFixture; + const mockRoute = jasmine.createSpyObj('ActivatedRoute', ['']); + const mockParam = jasmine.createSpyObj('P', ['get']); + mockParam.get.and.returnValue('abc'); + mockRoute.snapshot = { paramMap: mockParam }; + + const mockTeamService = jasmine.createSpyObj('TeamsService', ['']); + const mockRouter = jasmine.createSpyObj('Router', ['']); + const mockHttp = jasmine.createSpyObj('HttpClient', ['get']); + mockHttp.get.and.returnValue(of({})) + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TeamsComponent, MockOverviewComponent ], + imports: [ MatProgressSpinnerModule ], + providers: [ + { provide: ActivatedRoute, useValue: mockRoute}, + { provide: Router, useValue: mockRouter}, + { provide: TeamsService, useValue: mockTeamService}, + { provide: HttpClient, useValue: mockHttp}, + ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TeamsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should load a team', () => { + expect(component.teamsService.team).not.toBeNull(); + }) +}); + +@Component({ + selector: 'app-overview', + template: '', +}) +class MockOverviewComponent { +} diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.component.ts b/myteamwallet_frontend/src/app/modules/teams/teams.component.ts new file mode 100644 index 0000000..10e44c0 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/teams.component.ts @@ -0,0 +1,41 @@ +import { HttpClient } from '@angular/common/http'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { environment } from 'src/environments/environment'; +import { TeamsService } from './teams.service'; + +@Component({ + selector: 'app-teams', + templateUrl: './teams.component.html', + styleUrls: ['./teams.component.scss'] +}) +export class TeamsComponent implements OnInit { + + constructor( + private route: ActivatedRoute, + private http: HttpClient, + private router: Router, + public teamsService: TeamsService) {} + +ngOnInit() { + const hash = this.route.snapshot.paramMap.get('hash'); + if (hash) { + this.loadTeamOverviewByAlias(hash); + } + +} + + private async loadTeamOverviewByAlias(alias: string) { + const url = `${environment.apiUrl}teams/` + alias; + this.http.get(url).subscribe(result => { + if (result) { + this.teamsService.team = result; + } else { + this.router.navigate(['/auth']) + } + }, error => { + this.router.navigate(['/auth']) + }) + } + +} diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.module.ts b/myteamwallet_frontend/src/app/modules/teams/teams.module.ts new file mode 100644 index 0000000..9d90726 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/teams.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { HttpClientModule } from '@angular/common/http'; + +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; + +import { TeamsRoutingModule } from './teams-routing.module'; +import { TeamsComponent } from './teams.component'; +import { TeamsService } from './teams.service'; +import { OverviewModule } from './overview/overview.module'; + + +@NgModule({ + declarations: [ + TeamsComponent + ], + imports: [ + CommonModule, + TeamsRoutingModule, + HttpClientModule, + OverviewModule, + MatProgressSpinnerModule + ], + providers: [ TeamsService ] +}) +export class TeamsModule { } diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.service.spec.ts b/myteamwallet_frontend/src/app/modules/teams/teams.service.spec.ts new file mode 100644 index 0000000..f9bfbad --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/teams.service.spec.ts @@ -0,0 +1,19 @@ +import { HttpClientModule } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; + +import { TeamsService } from './teams.service'; + +describe('TeamsService', () => { + let service: TeamsService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ HttpClientModule ] + }); + service = TestBed.inject(TeamsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.service.ts b/myteamwallet_frontend/src/app/modules/teams/teams.service.ts new file mode 100644 index 0000000..4c4b888 --- /dev/null +++ b/myteamwallet_frontend/src/app/modules/teams/teams.service.ts @@ -0,0 +1,61 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { Transaction } from '../../model'; +import { environment } from 'src/environments/environment'; +import { TeamInvite } from './model/team-invite'; + +@Injectable({ + providedIn: 'root' +}) +export class TeamsService { + + team: any; + selectedUserTransaction: any[]; + transactionsLoading: boolean = false; + + constructor(private http: HttpClient) { + this.selectedUserTransaction = []; + } + + loadTransactionsOfUser(userId: number) { + this.transactionsLoading = true; + const url = `${environment.apiUrl}teams/${this.team.id}/${userId}`; + this.http.get(url).subscribe(res => { + this.selectedUserTransaction = res as any; + this.transactionsLoading = false; + }) + } + + loadTeamDetails(id: string): Observable { + return this.http.get(`${environment.apiUrl}teams/${id}`); + } + + createTransactions(transactions: any[]): Observable { + return this.http.post(`${environment.apiUrl}transactions`, transactions); + } + + reverseTransaction(transactionId: number): Observable { + return this.http.post(`${environment.apiUrl}transactions/${transactionId}/reverse`, {}); + } + + createTeamTransaction(transaction: any): Observable { + return this.http.post(`${environment.apiUrl}team-wallet-transactions`, transaction); + } + + createNewPlayer(teamId: number, player: {firstName: string, lastName: string, teamRole: number}) { + return this.http.post(`${environment.apiUrl}teams/${teamId}/players`, player); + } + + createRegisterLink(invite: TeamInvite): Observable { + return this.http.post(`${environment.apiUrl}auth/invite`, invite); + } + + validateRegistrationToken(token: string): Observable { + return this.http.post(`${environment.apiUrl}auth/verify-invite`, { token }); + } + + loadTeamsTransactions(id: number): Observable { + return this.http.get(`${environment.apiUrl}teams/${id}/transactions`); + } +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.html b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.html new file mode 100644 index 0000000..42b726d --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.html @@ -0,0 +1,32 @@ +
+
+ + Vorname + + + + +
+ +
+ + Nachname + + +
+ +
+ + Rolle + + Spieler + zweiter Kassenwart + Kapitän + Kassenwart + Trainer + + +
+ + +
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.scss b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.scss new file mode 100644 index 0000000..2e8484f --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.scss @@ -0,0 +1,16 @@ +:host { + display: block; +} + +mat-form-field { + width: 100%; +} + +.form-field-container { + margin-bottom: 12px; +} + + +.mat-body{ + margin-bottom: 24px; +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.spec.ts new file mode 100644 index 0000000..7fe3868 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PlayerInfoFormComponent } from './player-info-form.component'; + +describe('PlayerInfoFormComponent', () => { + let component: PlayerInfoFormComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PlayerInfoFormComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PlayerInfoFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.ts b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.ts new file mode 100644 index 0000000..aeed5f7 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.ts @@ -0,0 +1,27 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatOptionModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; + +@Component({ + selector: 'app-player-info-form', + templateUrl: './player-info-form.component.html', + styleUrls: ['./player-info-form.component.scss'], + standalone: true, + imports: [CommonModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, MatOptionModule, MatSelectModule, MatInputModule] +}) +export class PlayerInfoFormComponent { + disableSelect = new FormControl(true); + + form = new FormGroup({ + firstName: new FormControl('', [Validators.required]), + lastName: new FormControl(null, [Validators.required]), + teamRole: new FormControl({value: 1, disabled: false}) + }); + + +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.html b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.html new file mode 100644 index 0000000..8484817 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.html @@ -0,0 +1,36 @@ +
+ {{ text }} +
+ +
+
+ + Anmerkung + + Optionale Bemerkung / Erklärung + +
+ + + Art der Buchung + + + {{ transactionType(t) }} + + + {{ description }} + + + + Betrag + + + als positiver Betrag, z. B. 12,50 + Bitte Betrag prüfen, maximal 10.000 € + Betrag muss größer als 0 € sein + + +
+ Betrag gleichmäßig aufteilen +
+
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.scss b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.scss new file mode 100644 index 0000000..73067af --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.scss @@ -0,0 +1,28 @@ +:host { + display: flex; + flex-direction: column; + overflow: hidden; +} + +.first { + margin-right: 2px; +} + +.second { + margin-left: 2px; +} + +.input_note { + width: 100%; + margin-bottom: 24px; +} + +.mat-body{ + margin-bottom: 24px; +} + +@media screen and (max-width: 700px) { + mat-form-field { + width: 100%; + } +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.spec.ts new file mode 100644 index 0000000..81e86fe --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionFormComponent } from './transaction-form.component'; + +describe('TransactionFormComponent', () => { + let component: TransactionFormComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TransactionFormComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TransactionFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.ts b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.ts new file mode 100644 index 0000000..8d78ef7 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.ts @@ -0,0 +1,71 @@ +import { Component, Input } from '@angular/core'; +import { FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { TransactionType } from '../../new-transaction/model/transaction-type.enum'; +import { CommonModule } from '@angular/common'; +import { MatOptionModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatInputModule } from '@angular/material/input'; +import { MatButtonModule } from '@angular/material/button'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; + +@Component({ + selector: 'app-transaction-form', + templateUrl: './transaction-form.component.html', + styleUrls: ['./transaction-form.component.scss'], + standalone: true, + imports: [ + CommonModule + , FormsModule + , ReactiveFormsModule + , MatFormFieldModule + , MatOptionModule + , MatSelectModule + , MatInputModule + , MatButtonModule + , MatSlideToggleModule + ] +}) +export class TransactionFormComponent { + + @Input('transactionTypes') transactionTypes = [TransactionType.credit, TransactionType.fee, TransactionType.fine, TransactionType.levy, TransactionType.payment]; + + @Input('totalSlider') showTotalSlider: boolean = true; + @Input('text') text: string | undefined; + + description = 'Art wählen'; + + translations = { + fee: 'Gebühr', + fine: 'Strafe', + levy: 'Umlage', + payment: 'Zahlung', + credit: 'Guthaben', + expense: 'Ausgabe' + } + + + form = new FormGroup({ + note: new FormControl('', []), + amount: new FormControl(null, [Validators.required, Validators.min(0.01), Validators.max(10000)]), + type: new FormControl(null, [Validators.required]), + total: new FormControl(false, []) + }); + + transactionType(id: number | null): string { + if (id == null) { return ''; } + const key: any = TransactionType[id]; + const t = this.translations as any; + return t[key]; + } + + onTypeChange() { + if (this.form.controls.type.value != null && this.form.controls.type.value < 10) { + this.description = 'Spieler bekommt Geld' + } else { + this.description = 'Spieler zahlt Geld' + } + + } + +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.html b/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.html new file mode 100644 index 0000000..c2a1875 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.html @@ -0,0 +1,8 @@ +

{{ data.title }}

+
+

{{ data.message }}

+
+
+ + +
diff --git a/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.ts b/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.ts new file mode 100644 index 0000000..6dc2202 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.ts @@ -0,0 +1,33 @@ +import { CommonModule } from '@angular/common'; +import { Component, Inject } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-confirm-dialog', + templateUrl: './confirm-dialog.component.html', + standalone: true, + imports: [CommonModule, MatButtonModule, MatDialogModule] +}) +export class ConfirmDialogComponent { + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: ConfirmDialogData, + ) {} + + confirm(): void { + this.dialogRef.close(true); + } + + cancel(): void { + this.dialogRef.close(false); + } +} + +export interface ConfirmDialogData { + title: string; + message: string; + confirmLabel?: string; + cancelLabel?: string; +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.html b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.html new file mode 100644 index 0000000..e6e482c --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.html @@ -0,0 +1,10 @@ +

Spieler anlegen

+ +
+ +
+ +
+ + +
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.scss b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.scss new file mode 100644 index 0000000..8bc9896 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.scss @@ -0,0 +1,6 @@ +:host { + display: flex; + overflow: hidden; + flex-direction: column; + padding: 8px 14px 8px 14px; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.spec.ts new file mode 100644 index 0000000..65fdf25 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreatePlayerDialogComponent } from './create-player.dialog.component'; + +describe('CreatePlayerDialogComponent', () => { + let component: CreatePlayerDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ CreatePlayerDialogComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(CreatePlayerDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.ts b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.ts new file mode 100644 index 0000000..24db26a --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.ts @@ -0,0 +1,36 @@ +import { Component, ViewChild } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { PlayerInfoFormComponent } from '../components/player-info-form/player-info-form.component'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatButtonModule } from '@angular/material/button'; + +@Component({ + selector: 'app-create-player.dialog', + templateUrl: './create-player.dialog.component.html', + styleUrls: ['./create-player.dialog.component.scss'], + standalone: true, + imports: [ CommonModule, PlayerInfoFormComponent, MatButtonModule ] +}) +export class CreatePlayerDialogComponent { + @ViewChild('formComponent') formComponent!: PlayerInfoFormComponent; + + constructor( + public dialogRef: MatDialogRef + ) {} + + + get disableSave(): boolean { + return !this.formComponent || !this.formComponent.form || this.formComponent?.form.invalid; + } + + close(save?: boolean) { + if (save) { + this.dialogRef.close(this.formComponent.form.value); + return; + } + + this.dialogRef.close(); + + } +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/dialog.module.ts b/myteamwallet_frontend/src/app/shared/dialog/dialog.module.ts new file mode 100644 index 0000000..b03af8d --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/dialog.module.ts @@ -0,0 +1,60 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { NewTransactionDialogComponent } from './new-transaction/new-transaction.component'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { TeamTransactionDialogComponent } from './team-transaction-dialog/team-transaction-dialog.component'; +import { TransactionFormComponent } from './components/transaction-form/transaction-form.component'; +import { CreatePlayerDialogComponent } from './create-player-dialog/create-player.dialog.component'; +import { PlayerInfoFormComponent } from './components/player-info-form/player-info-form.component'; +import { PrivilegesInfoDialogComponent } from './privileges-info-dialog/privileges-info-dialog.component'; +import { MatDialogModule } from '@angular/material/dialog'; +import { ShowTeamTransactionsComponent } from './show-team-transactions/show-team-transactions.component'; +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; +import {MatTableModule} from '@angular/material/table'; +import { MatSortModule } from '@angular/material/sort'; +import { MatPaginatorModule } from '@angular/material/paginator'; + + +const components = [ ] + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + MatFormFieldModule, + MatSelectModule, + MatInputModule, + MatButtonModule, + MatSlideToggleModule, + FormsModule, + ReactiveFormsModule, + MatDialogModule, + MatProgressSpinnerModule, + MatTableModule, + MatSortModule, + MatPaginatorModule, + PlayerInfoFormComponent, + TransactionFormComponent, + TeamTransactionDialogComponent, + PrivilegesInfoDialogComponent, + CreatePlayerDialogComponent, + ShowTeamTransactionsComponent, + NewTransactionDialogComponent + ], + exports: [ + PlayerInfoFormComponent, + TransactionFormComponent, + TeamTransactionDialogComponent, + PrivilegesInfoDialogComponent, + CreatePlayerDialogComponent, + ShowTeamTransactionsComponent, + NewTransactionDialogComponent + ] +}) +export class DialogModule { +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/index.ts b/myteamwallet_frontend/src/app/shared/dialog/index.ts new file mode 100644 index 0000000..8ad253c --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/index.ts @@ -0,0 +1,2 @@ +export * from './new-transaction/new-transaction.component'; +export * from './team-transaction-dialog/team-transaction-dialog.component'; \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/model/transaction-type.enum.ts b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/model/transaction-type.enum.ts new file mode 100644 index 0000000..542c5cb --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/model/transaction-type.enum.ts @@ -0,0 +1,8 @@ +export enum TransactionType { + payment = 0, + credit = 1, + fine = 11, + levy = 12, + fee = 13, + expense = 14 +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.html b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.html new file mode 100644 index 0000000..067de71 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.html @@ -0,0 +1,27 @@ +

Buchung anlegen

+ +
+
Gewählte Spieler:
+ +
{{ p.firstName }} {{ p.lastName }}
+
+ + {{ data.players.length - 5 }} weitere +
+
+ + +
Gesamte Mannschaft
+
+
+ + +
+ +
+
Jeder Spieler bekommt {{ transactionType }} über {{ amount | currency:'EUR' }}
+
+ + + + + diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.scss b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.scss new file mode 100644 index 0000000..f576fcd --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.scss @@ -0,0 +1,30 @@ +:host { + display: flex; + overflow: hidden; + flex-direction: column; + padding: 2px 4px 4px 4px; +} + +.selected_players { + padding: 2px; + border: 1px solid #ccc; + border-radius: 4px; + margin-bottom: 4px; + + .header { + background-color: #e7e7e7; + margin: -2px -2px 0 -2px; + padding: 2px; + text-align: center; + } +} + +.form { + margin-top: 20px; +} + +.summary { + margin-top: 32px; + margin-bottom: 20px; + text-align: center; +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.spec.ts new file mode 100644 index 0000000..aa94111 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.spec.ts @@ -0,0 +1,51 @@ +import { forwardRef } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms'; +import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; + +import { NewTransactionDialogComponent } from './new-transaction.component'; + +describe('NewTransactionDialogComponent', () => { + let component: NewTransactionDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ NewTransactionDialogComponent ], + providers: [ + + { provide: MatDialogRef, useValue: {} }, + { provide: MAT_DIALOG_DATA, useValue: {} }, + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => NewTransactionDialogComponent), + multi: true, + } + ], + imports: [ + MatDialogModule, + MatFormFieldModule, + ReactiveFormsModule, + MatInputModule, + NoopAnimationsModule, + MatSelectModule, + FormsModule, + MatSlideToggleModule + ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(NewTransactionDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.ts b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.ts new file mode 100644 index 0000000..12362e4 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.ts @@ -0,0 +1,121 @@ +import { Component, Inject, OnInit, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { Player } from 'src/app/model'; +import { Team } from 'src/app/modules/teams/model/team'; +import { TransactionFormComponent } from '../components/transaction-form/transaction-form.component'; +import { TransactionType } from './model/transaction-type.enum'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatButtonModule } from '@angular/material/button'; +import { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component'; + +const HIGH_AMOUNT_CONFIRM_THRESHOLD = 300; + +@Component({ + selector: 'app-new-transaction', + templateUrl: './new-transaction.component.html', + styleUrls: ['./new-transaction.component.scss'], + standalone: true, + imports: [ + CommonModule + , TransactionFormComponent + , MatButtonModule + , MatDialogModule + ] +}) +export class NewTransactionDialogComponent implements OnInit { + + @ViewChild('formComponent') formComponent!: TransactionFormComponent; + + + selectedTransactionType: number | null = null; + + isTotal: boolean = false; + + constructor( + public dialogRef: MatDialogRef, + private dialog: MatDialog, + @Inject(MAT_DIALOG_DATA) public data: DialogData, + ) {} + + ngOnInit(): void { + } + + + close() { + this.dialogRef.close(); + } + + create() { + + const value = this.formComponent.form.value; + if (!value || value.amount == null || value.total == null || value.type == null) { return; } + let amount = value.total ? value.amount / this.data.players.length : value.amount; + amount = Math.round(amount * 100) / 100; + + let res: Transaction[] = []; + for (let p of this.data.players) { + res.push({ + amount, + playerId: p.id, + type: value.type as any, + note: value.note as any + }) + + + } + + if (value.amount >= HIGH_AMOUNT_CONFIRM_THRESHOLD) { + const confirmRef = this.dialog.open(ConfirmDialogComponent, { + data: { + title: 'Betrag prüfen', + message: `Es wird${this.data.players.length > 1 ? ' für jede:n der ' + this.data.players.length + ' gewählten Spieler:innen' : ''} ein Betrag von ${value.amount} € gebucht. Bitte kurz prüfen, bevor du fortfährst.`, + confirmLabel: 'Buchen' + } + }); + + confirmRef.afterClosed().subscribe(confirmed => { + if (confirmed) { + this.dialogRef.close(res); + } + }); + return; + } + + this.dialogRef.close(res); + + } + + get amount(): number { + const value = this.formComponent?.form?.value; + if (!value || value.amount == null) { return 0; } + return Math.round((value.total ? value.amount / this.data.players.length : value.amount) * 100) / 100; + } + + get transactionType(): string { + if (this.formComponent?.form?.value?.type == null) { return ''; } + return this.formComponent.transactionType(this.formComponent.form.value.type); + } + + get formValid(): boolean { + return this.formComponent?.form != null && this.formComponent.form.valid; + } + +} + + +interface DialogData { + team: Team, + players: Player[]; + all?: boolean; +} + +export interface Transaction { + playerId: Number; + amount: number; + type: TransactionType; + note: string; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.html b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.html new file mode 100644 index 0000000..24b6811 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.html @@ -0,0 +1,46 @@ +

Berechtigungen nach Teamrolle

+ + + +
+ Für jeden Spieler kann ein Einladungslink erstellt werden, mit dem sich der Spieler registrieren und verknüpfen kann. + Jeder Link darf nur an einen Spieler gegeben werden, da jeder Spieler (pro Team) nur mit einem User-Account verbunden sein kann. + Derzeit ist eine Verlinkung nur mit einer neuen Registrierung möglich. Jeder User-Account erhält pro Team die Rolle seines zugeordneten Spielers. +
+ +
Zweiter Kassenwart:
+
+
    +
  • Transaktionen und Buchungen anlegen
  • +
+
+ +
Kassenwart:
+
+
    +
  • Transaktionen und Buchungen anlegen
  • +
  • Spieler anlegen & verwalten
  • +
  • Registrierungslinks erstellen
  • +
+
+ +
Kapitän:
+
+
    +
  • Transaktionen und Buchungen anlegen
  • +
  • Spieler anlegen & verwalten
  • +
  • Registrierungslinks erstellen
  • +
+
+ +
Trainer:
+
+
    +
  • Transaktionen und Buchungen anlegen
  • +
  • Spieler anlegen & verwalten
  • +
  • Registrierungslinks erstellen
  • +
+
+ + +
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.scss b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.scss new file mode 100644 index 0000000..0e1f964 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.scss @@ -0,0 +1,9 @@ +:host { + display: flex; + flex-direction: column; + max-width: 850px; +} + +.description{ + margin-bottom: 24px; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.spec.ts new file mode 100644 index 0000000..2690444 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PrivilegesInfoDialogComponent } from './privileges-info-dialog.component'; + +describe('PrivilegesInfoDialogComponent', () => { + let component: PrivilegesInfoDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PrivilegesInfoDialogComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PrivilegesInfoDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.ts b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.ts new file mode 100644 index 0000000..8d7a298 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.ts @@ -0,0 +1,14 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatDialogModule } from '@angular/material/dialog'; + +@Component({ + selector: 'app-privileges-info-dialog', + templateUrl: './privileges-info-dialog.component.html', + styleUrls: ['./privileges-info-dialog.component.scss'], + standalone: true, + imports: [CommonModule, MatDialogModule] +}) +export class PrivilegesInfoDialogComponent { + +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.html b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.html new file mode 100644 index 0000000..a9730c3 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.html @@ -0,0 +1,118 @@ +
+
+

Alle Transaktionen

+

Buchungen des gesamten Teams

+
+ + +
+ + +
+ + Transaktionen werden geladen … +
+ +
+ error_outline + Transaktionen konnten nicht geladen werden. + +
+ + +
+ + Transaktionen durchsuchen + search + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Betrag + {{ element.amount | currency:'EUR' }} + Datum{{ element.date | date:'shortDate' }}Typ{{ element.type }}Notiz{{ element.note || '–' }}Spieler{{ element.playerName }} + +
+ {{ input.value ? 'Keine passenden Transaktionen gefunden.' : 'Noch keine Transaktionen vorhanden.' }} +
+
+ + + +
+
+
diff --git a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.scss b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.scss new file mode 100644 index 0000000..f3e06aa --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.scss @@ -0,0 +1,172 @@ +:host { + display: block; + width: min(900px, 86vw); +} + +.dialog-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 24px; + padding: 24px 24px 16px; + border-bottom: 1px solid var(--mat-divider-color, #e0e0e0); + + h2[mat-dialog-title] { + margin: 0; + padding: 0; + line-height: 1.25; + } +} + +.dialog-subtitle { + margin: 4px 0 0; + color: rgba(0, 0, 0, 0.6); +} + +.close-button { + flex: 0 0 auto; + margin: -8px -8px 0 0; +} + +mat-dialog-content { + display: flex; + height: min(70vh, 620px); + max-height: none; + flex-direction: column; + overflow: hidden; + padding: 20px 24px 24px !important; +} + +.dialog-state { + min-height: 260px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 16px; + color: rgba(0, 0, 0, 0.6); + text-align: center; +} + +.error-state { + mat-icon { + width: 44px; + height: 44px; + color: #ba1a1a; + font-size: 44px; + } + +} + +.table-toolbar { + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 16px; + + mat-form-field { + flex: 1 1 360px; + max-width: 520px; + } +} + +.note-toggle { + flex: 0 0 auto; + + &.active { + color: var(--mat-sys-primary, #343dff); + background: #eef3ff; + } +} + +.table-shell { + display: flex; + min-height: 0; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; + border: 1px solid var(--mat-divider-color, #e0e0e0); + border-radius: 12px; + background: #fff; +} + +.table-scroll { + min-height: 0; + flex: 1 1 auto; + overflow: auto; +} + +table { + width: 100%; + min-width: 690px; +} + +th.mat-mdc-header-cell { + color: rgba(0, 0, 0, 0.68); + font-weight: 600; + white-space: nowrap; +} + +td.mat-mdc-cell { + border-bottom-color: rgba(0, 0, 0, 0.08); +} + +.amount-cell { + font-weight: 600; +} + +.note-cell { + min-width: 180px; + max-width: 320px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.actions-cell { + width: 48px; + padding-right: 8px; + text-align: right; +} + +.empty-row td { + height: 128px; + color: rgba(0, 0, 0, 0.6); + text-align: center; +} + +mat-paginator { + flex: 0 0 auto; + border-top: 1px solid var(--mat-divider-color, #e0e0e0); +} + +@media (max-width: 700px) { + :host { + width: 92vw; + } + + .dialog-header { + padding: 20px 16px 14px; + } + + mat-dialog-content { + height: min(72vh, 620px); + padding: 16px !important; + } + + .table-toolbar { + align-items: stretch; + flex-direction: column; + + mat-form-field { + flex-basis: auto; + max-width: none; + } + } + + .note-toggle { + align-self: flex-start; + } +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.spec.ts new file mode 100644 index 0000000..ebf27b0 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShowTeamTransactionsComponent } from './show-team-transactions.component'; + +describe('ShowTeamTransactionsComponent', () => { + let component: ShowTeamTransactionsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ShowTeamTransactionsComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ShowTeamTransactionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.ts b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.ts new file mode 100644 index 0000000..f73a470 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.ts @@ -0,0 +1,137 @@ +import { CommonModule } from '@angular/common'; +import { Component, Inject, OnInit, ViewChild } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialog, MatDialogModule } from '@angular/material/dialog'; +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 { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { Transaction } from 'src/app/model'; +import { TeamsService } from 'src/app/modules/teams/teams.service'; +import { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component'; + +@Component({ + selector: 'app-show-team-transactions', + templateUrl: './show-team-transactions.component.html', + styleUrls: ['./show-team-transactions.component.scss'], + standalone: true, + imports: [ CommonModule, MatDialogModule, MatTableModule, MatSortModule, MatPaginatorModule, MatFormFieldModule, MatInputModule, MatProgressSpinnerModule, MatButtonModule, MatIconModule, MatTooltipModule ] +}) +export class ShowTeamTransactionsComponent implements OnInit { + + isLoading: boolean = true; + loadError: boolean = false; + + displayedColumns: string[] = ['amount', 'date', 'type', 'playerName', 'actions']; + dataSource: MatTableDataSource = new MatTableDataSource([]); + + private paginator?: MatPaginator; + private sort?: MatSort; + + @ViewChild(MatPaginator) + set matPaginator(paginator: MatPaginator | undefined) { + this.paginator = paginator; + if (paginator) { + this.dataSource.paginator = paginator; + } + } + + @ViewChild(MatSort) + set matSort(sort: MatSort | undefined) { + this.sort = sort; + if (sort) { + this.dataSource.sort = sort; + } + } + constructor(private teamService: TeamsService, + private dialog: MatDialog, + private snackBar: MatSnackBar, + @Inject(MAT_DIALOG_DATA) public data: DialogData,) {} + + ngOnInit(): void { + this.load(); + } + + load(): void { + this.isLoading = true; + this.loadError = false; + this.teamService.loadTeamsTransactions(this.data.id).subscribe({ + next: data => { + this.setupData(data); + }, + error: () => { + this.isLoading = false; + this.loadError = true; + } + }) + } + + setupData(data: Transaction[]) { + this.isLoading = false; + this.dataSource = new MatTableDataSource(data); + + if (this.paginator) { + this.dataSource.paginator = this.paginator; + } + if (this.sort) { + this.dataSource.sort = this.sort; + } + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + this.dataSource.filter = filterValue.trim().toLowerCase(); + + if (this.dataSource.paginator) { + this.dataSource.paginator.firstPage(); + } + } + + reverseTransaction(transaction: Transaction) { + if (transaction.isTeamWalletTransaction || transaction.note?.startsWith('Stornierung von Buchung #')) { + return; + } + + const confirmRef = this.dialog.open(ConfirmDialogComponent, { + data: { + title: 'Buchung stornieren', + message: `Buchung über ${transaction.amount} € (${transaction.playerName}, ${transaction.type}) wirklich stornieren? Es wird eine Ausgleichsbuchung erstellt, die Originalbuchung bleibt sichtbar.`, + confirmLabel: 'Stornieren' + } + }); + + confirmRef.afterClosed().subscribe(confirmed => { + if (!confirmed) { return; } + + this.teamService.reverseTransaction(transaction.id).subscribe({ + next: () => { + this.snackBar.open('Buchung wurde storniert', undefined, { duration: 5000 }); + this.load(); + }, + error: (err) => { + const message = err?.error?.message || 'Buchung konnte nicht storniert werden'; + this.snackBar.open(message, undefined, { duration: 5000, panelClass: 'snackbar_error' }); + } + }); + }); + } + + toggleNote() { + const index = this.displayedColumns.indexOf('note'); + if (index != -1) { + this.displayedColumns = this.displayedColumns.filter(column => column !== 'note'); + } else { + this.displayedColumns = [...this.displayedColumns, 'note']; + } + } + +} + +interface DialogData { + id: number; +} diff --git a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.html b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.html new file mode 100644 index 0000000..83d190d --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.html @@ -0,0 +1,10 @@ +

Buchung anlegen

+ + + + + + + \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.scss b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.scss new file mode 100644 index 0000000..34d47c8 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.scss @@ -0,0 +1,6 @@ +:host { + display: flex; + overflow: hidden; + flex-direction: column; + padding: 2px 4px 4px 4px; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.spec.ts new file mode 100644 index 0000000..d1e4731 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TeamTransactionDialogComponent } from './team-transaction-dialog.component'; + +describe('TeamTransactionDialogComponent', () => { + let component: TeamTransactionDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TeamTransactionDialogComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TeamTransactionDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.ts b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.ts new file mode 100644 index 0000000..e5ed721 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.ts @@ -0,0 +1,51 @@ +import { Component, Inject, ViewChild } from '@angular/core'; +import { FormGroup, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { TransactionFormComponent } from '../components/transaction-form/transaction-form.component'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatButtonModule } from '@angular/material/button'; + +@Component({ + selector: 'app-team-transaction-dialog', + templateUrl: './team-transaction-dialog.component.html', + styleUrls: ['./team-transaction-dialog.component.scss'], + standalone: true, + imports: [CommonModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, TransactionFormComponent, MatButtonModule, MatDialogModule] +}) +export class TeamTransactionDialogComponent { + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData, + ) {} + + @ViewChild('formComponent') formComponent!: TransactionFormComponent; + + explanation = 'Hier kann eine Ausgabe oder Einnahme des Teams gebucht werden.'; + + + onOkClick() { + const form = this.formComponent.form; + const transaction = { ...form.value, teamId: this.data.teamId }; + + if (transaction.amount != null && transaction.teamId != null && transaction.type != null) { + this.dialogRef.close(transaction); + } + + + } + + close(): void { + this.dialogRef.close(); + } + + get formInvalid(): boolean { + return !this.formComponent || !this.formComponent.form.value || this.formComponent.form.value.amount == null || + this.formComponent.form.value.total == null || this.formComponent.form.value.type == null; + } +} + +interface DialogData { + teamId: number; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/index.ts b/myteamwallet_frontend/src/app/shared/index.ts new file mode 100644 index 0000000..bb01b0a --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/index.ts @@ -0,0 +1 @@ +export * from './dialog'; \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/penalties/model/penalty.interface.ts b/myteamwallet_frontend/src/app/shared/penalties/model/penalty.interface.ts new file mode 100644 index 0000000..06bbf62 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/penalties/model/penalty.interface.ts @@ -0,0 +1,6 @@ +export interface Penalty { + id: number; + description: string; + createdAt: string; + amount: number; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.html b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.html new file mode 100644 index 0000000..cc16c1e --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.html @@ -0,0 +1,19 @@ +

Strafenkatalog

+ +
+ + Suche + + +
+ @if(penalties.length > 0) { + + + {{ p.description }} + {{ p.amount | currency:'EUR' }} + + + } @else { +
Nix da...
+ } +
diff --git a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.scss b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.spec.ts b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.spec.ts new file mode 100644 index 0000000..7c9cda5 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PenaltiesComponent } from './penalties.component'; + +describe('PenaltiesComponent', () => { + let component: PenaltiesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PenaltiesComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PenaltiesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.ts b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.ts new file mode 100644 index 0000000..0d88e8d --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.ts @@ -0,0 +1,49 @@ +import { HttpClient } from '@angular/common/http'; +import { Component, Inject, inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { environment } from '../../../environments/environment'; +import { Penalty } from './model/penalty.interface'; +import { MatButtonModule } from '@angular/material/button'; +import { MatListModule } from '@angular/material/list'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatInputModule } from '@angular/material/input'; + +@Component({ + selector: 'app-penalties', + standalone: true, + imports: [MatDialogModule, MatButtonModule, MatListModule, CommonModule, MatInputModule, FormsModule, ReactiveFormsModule], + templateUrl: './penalties.component.html', + styleUrl: './penalties.component.scss' +}) +export class PenaltiesComponent { + + searchStr = ""; + + private http: HttpClient = inject(HttpClient); + public penalties: Penalty[] = []; + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public teamId: string, + ) {} + + ngOnInit(): void { + this.loadPenalties(); + } + + get getPenalties(): any[] { + + return this.penalties.filter(p => p.description.toLocaleLowerCase().includes(this.searchStr.toLowerCase())) + return []; + } + + loadPenalties() { + const url = `${environment.apiUrl}penalty/` + this.teamId; + this.http.get(url).subscribe({ + next: n => { + this.penalties = n as Penalty[]; + } + }) + } + +} diff --git a/myteamwallet_frontend/src/app/shared/shared.module.ts b/myteamwallet_frontend/src/app/shared/shared.module.ts new file mode 100644 index 0000000..e2f4c49 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/shared.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { UnderConstructionComponent } from './under-construction/under-construction.component'; +import { DialogModule } from './dialog/dialog.module'; + + +@NgModule({ + declarations: [ UnderConstructionComponent ], + imports: [ + CommonModule, + DialogModule + ], + exports: [ UnderConstructionComponent ] +}) +export class SharedModule { } diff --git a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.html b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.html new file mode 100644 index 0000000..92af98d --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.html @@ -0,0 +1,4 @@ + + +
Under Construction
+
please stand by for news
diff --git a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.scss b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.scss new file mode 100644 index 0000000..14df634 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.scss @@ -0,0 +1,8 @@ +:host { + width: 100vw; + height: 100vh; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; +} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.spec.ts b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.spec.ts new file mode 100644 index 0000000..338a2ca --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UnderConstructionComponent } from './under-construction.component'; + +describe('UnderConstructionComponent', () => { + let component: UnderConstructionComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ UnderConstructionComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(UnderConstructionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.ts b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.ts new file mode 100644 index 0000000..617f2d3 --- /dev/null +++ b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-under-construction', + templateUrl: './under-construction.component.html', + styleUrls: ['./under-construction.component.scss'] +}) +export class UnderConstructionComponent { + +} diff --git a/myteamwallet_frontend/src/assets/.gitkeep b/myteamwallet_frontend/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/myteamwallet_frontend/src/assets/favicon.png b/myteamwallet_frontend/src/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b92db6830bd5697c3e42fd1237d74e336ffe4b3c GIT binary patch literal 926 zcmV;P17ZA$P)!FfITe`bYXA&9>f(@x^|=UOaL#{ zc@O3F0Wvw{7w|i}LcR)5MKs@FBUa(!;Q)?cQJwqvurzKyFC1-9nDsWk#fO-Nb1(-- zBf>{8rUvN4b7Al)9>>`D_<%y$dAJZi#m&#gI;A!ihmVIa4r|fV0)gI2XbT5>aT^8# zWIy_`suAS^9K+?6?i&1zXIlX8)dwp6XWSC<(|8{{hRN~4hP*E9zs6ij;jC`(d_bXW zPw3u_n{C6a(2c4@F?!a_e$INIP(2wq;`!`jBnrr zr4xLH=W!`|TerSeVaTBK&`-dLxYb@P3H@DorIDKb3ab+C4__zh0}nP*PU7L5^DjnN zDW!=@3+cc;O1*U83#BNRqpOv#Y05+1Smm%A^J8}_lWk?}sg35?r?6)n&Q(~sw4Mi> z1Vbw4r|@I!Q_4dhkG;9^px5DbrKRk|vgW{9q42o9GP+f%iy85MlF}L$U{ZrE+m$}` zmT2cg0OH`H2z52uMlnd*;%pyo$N1sS4PjAAX*}+Wh_)zW@k?dsQ>t?&W<^w+urcTS z*RV{$X*3O>30R^`v953|fR4oO$vOY|e~w%0KS6zlW1Z-|8vp A?f?J) literal 0 HcmV?d00001 diff --git a/myteamwallet_frontend/src/assets/screenshots/screen_mobile.png b/myteamwallet_frontend/src/assets/screenshots/screen_mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..dd973c4839deb585cd55de00ad13049008e06a76 GIT binary patch literal 118299 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

IbJ9-pKpVX4Ia?{W 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 z�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