From be8c4b6b8f1a3862a05ad9389e34be2a2877148f Mon Sep 17 00:00:00 2001 From: Alexey Lunin <alexey.lunin@vereign.com> Date: Thu, 21 Dec 2023 07:37:25 +0000 Subject: [PATCH] feat: dashboard ui --- .dockerignore | 3 +- .eslintrc.json | 17 +- .gitlab-ci.yml | 40 + apps/dashboard/.babelrc | 11 + apps/dashboard/.eslintrc.json | 20 + apps/dashboard/.gitignore | 1 + apps/dashboard/README.md | 18 + apps/dashboard/cssmodule.d.ts | 24 + apps/dashboard/deployment/ci-cd/Dockerfile | 41 + .../deployment/ci-cd/helm/Chart.yaml | 6 + .../ci-cd/helm/templates/ConfigMap.yaml | 21 + .../ci-cd/helm/templates/_helpers.tpl | 94 + .../ci-cd/helm/templates/deployment.yaml | 63 + .../ci-cd/helm/templates/ingress.yaml | 47 + .../ci-cd/helm/templates/service.yaml | 15 + .../deployment/ci-cd/helm/values.yaml | 101 + apps/dashboard/deployment/local/Dockerfile | 13 + apps/dashboard/jest.config.ts | 11 + apps/dashboard/project.json | 85 + .../src/assets/Vereign_Logo_ICON_BLACK.png | Bin 0 -> 57702 bytes apps/dashboard/src/assets/config.js.example | 4 + apps/dashboard/src/assets/vault_image.png | Bin 0 -> 195837 bytes apps/dashboard/src/components/App/index.tsx | 49 + .../src/components/App/styles.module.scss | 31 + .../src/components/BasicMessageItem/index.tsx | 35 + .../BasicMessageItem/styles.module.scss | 7 + .../BasicMessageList/BasicMessageListStore.ts | 52 + .../BasicMessageList/CreateMessage/index.tsx | 45 + .../src/components/BasicMessageList/index.tsx | 52 + .../src/components/ConnectionItem/index.tsx | 35 + .../ConnectionItem/styles.module.scss | 11 + .../src/components/CreatedDidItem/index.tsx | 20 + .../CreatedDidItem/styles.module.scss | 3 + .../CreatedInvitationItem/index.tsx | 37 + .../CreatedInvitationItem/styles.module.scss | 11 + .../CredentialDefinitionItem/index.tsx | 26 + .../styles.module.scss | 7 + .../src/components/CredentialItem/index.tsx | 108 + .../CredentialItem/styles.module.scss | 16 + .../CredentialList/CredentialListStore.ts | 107 + .../src/components/CredentialList/index.tsx | 64 + .../CredentialList/styles.module.scss | 0 .../src/components/JsonDetails/index.tsx | 25 + .../components/JsonDetails/styles.module.scss | 24 + apps/dashboard/src/components/Modal/Body.tsx | 14 + .../dashboard/src/components/Modal/Footer.tsx | 12 + apps/dashboard/src/components/Modal/index.tsx | 60 + .../src/components/Modal/styles.module.scss | 14 + .../src/components/NoRecordsMessage/index.tsx | 8 + apps/dashboard/src/components/Page/index.tsx | 11 + .../src/components/Page/styles.module.scss | 11 + .../src/components/PageTitle/index.tsx | 12 + .../components/PageTitle/styles.module.scss | 7 + .../src/components/PageWithSidebar/index.tsx | 20 + .../PageWithSidebar/styles.module.scss | 22 + .../src/components/ProofItem/index.tsx | 93 + .../components/ProofItem/styles.module.scss | 11 + .../components/ProofList/ProofListStore.ts | 105 + .../src/components/ProofList/index.tsx | 62 + .../src/components/RecordItem/index.tsx | 40 + .../components/RecordItem/styles.module.scss | 41 + .../src/components/RequireAuth/index.tsx | 37 + .../src/components/SchemaItem/index.tsx | 43 + .../components/SchemaItem/styles.module.scss | 3 + .../src/components/Sidebar/index.tsx | 44 + .../src/components/Sidebar/styles.module.scss | 57 + .../src/components/VaultHeader/index.tsx | 53 + .../components/VaultHeader/styles.module.scss | 84 + apps/dashboard/src/favicon.ico | Bin 0 -> 32038 bytes apps/dashboard/src/hooks/auth/Provider.tsx | 11 + apps/dashboard/src/hooks/auth/context.ts | 19 + apps/dashboard/src/hooks/auth/useAuth.ts | 40 + apps/dashboard/src/hooks/useGlobalAuth.ts | 12 + apps/dashboard/src/hooks/withAuthorize.ts | 31 + apps/dashboard/src/index.html | 17 + apps/dashboard/src/main.tsx | 50 + .../index.tsx | 85 + .../styles.module.scss | 4 + .../index.tsx | 82 + .../styles.module.scss | 4 + .../src/modals/ConfirmDialog/index.tsx | 58 + .../modals/NewCredentialDefDialog/index.tsx | 95 + .../NewCredentialDefDialog/styles.module.scss | 4 + .../src/modals/NewSchemaDialog/index.tsx | 100 + .../modals/NewSchemaDialog/styles.module.scss | 4 + .../OfferCredentialDialogStore.ts | 84 + .../modals/OfferCredentialDialog/index.tsx | 135 + .../OfferCredentialDialog/styles.module.scss | 4 + .../modals/ReceiveInvitationDialog/index.tsx | 78 + .../styles.module.scss | 4 + .../RequestProofDialogStore.ts | 144 + .../src/modals/RequestProofDialog/index.tsx | 106 + .../RequestProofDialog/styles.module.scss | 21 + .../index.tsx | 64 + .../styles.module.scss | 46 + .../ViewConnectionlessProofRequest/index.tsx | 64 + .../styles.module.scss | 46 + .../src/modals/ViewJsonDialog/index.tsx | 26 + .../modals/ViewJsonDialog/styles.module.scss | 4 + apps/dashboard/src/routes/config.ts | 103 + apps/dashboard/src/routes/index.tsx | 27 + .../ConnectionCreatePageStore.ts | 42 + .../pages/ConnectionCreatePage/index.tsx | 68 + .../ConnectionCreatePage/styles.module.scss | 49 + .../ConnectionListPage/ConnectionListStore.ts | 46 + .../routes/pages/ConnectionListPage/index.tsx | 73 + .../ConnectionListPage/styles.module.scss | 3 + .../ConnectionViewPageStore.ts | 46 + .../routes/pages/ConnectionViewPage/index.tsx | 98 + .../ConnectionViewPage/styles.module.scss | 0 .../CreatedDidListPageStore.ts | 29 + .../routes/pages/CreatedDidListPage/index.tsx | 31 + .../CreatedDidListPage/styles.module.scss | 0 .../CreatedInvitationListPageStore.ts | 29 + .../pages/CreatedInvitationListPage/index.tsx | 31 + .../styles.module.scss | 0 .../CredentialDefListPageStore.ts | 29 + .../pages/CredentialDefListPage/index.tsx | 47 + .../CredentialDefListPage/styles.module.scss | 0 .../routes/pages/CredentialListPage/index.tsx | 57 + .../pages/LoginPage/AuthForm/AuthFormStore.ts | 80 + .../routes/pages/LoginPage/AuthForm/index.tsx | 99 + .../LoginPage/AuthForm/styles.module.scss | 32 + .../routes/pages/LoginPage/LoginPageStore.ts | 71 + .../src/routes/pages/LoginPage/index.tsx | 61 + .../routes/pages/LoginPage/styles.module.scss | 16 + .../src/routes/pages/ProofListPage/index.tsx | 50 + .../pages/RedirectWithTokenPage/index.tsx | 37 + .../pages/RegisterPage/RegisterPageStore.ts | 71 + .../src/routes/pages/RegisterPage/index.tsx | 118 + .../pages/RegisterPage/styles.module.scss | 48 + .../ResolveDidPage/ResolveDidPageStore.ts | 37 + .../src/routes/pages/ResolveDidPage/index.tsx | 47 + .../pages/ResolveDidPage/styles.module.scss | 3 + .../SchemaListPage/SchemaListPageStore.ts | 29 + .../src/routes/pages/SchemaListPage/index.tsx | 45 + .../pages/SchemaListPage/styles.module.scss | 0 .../VcmSelfIssuePage/VcmSelfIssuePageStore.ts | 33 + .../routes/pages/VcmSelfIssuePage/index.tsx | 60 + .../src/routes/pages/WelcomePage/index.tsx | 13 + .../pages/WelcomePage/styles.module.scss | 0 apps/dashboard/src/store/modalStore.tsx | 99 + apps/dashboard/src/styles.scss | 35 + apps/dashboard/src/utils/displayError.tsx | 56 + apps/dashboard/src/utils/getConfig.ts | 20 + apps/dashboard/tsconfig.app.json | 30 + apps/dashboard/tsconfig.json | 20 + apps/dashboard/tsconfig.spec.json | 21 + apps/dashboard/types.d.ts | 9 + apps/dashboard/webpack.config.js | 9 + client-generator.sh | 45 + gateway-swagger.json | 29 +- libs/askar/src/askar/agent.service.ts | 62 +- libs/clients/project.json | 2 +- libs/clients/src/backend.ts | 4 + .../attestation.manager.client.ts | 0 .../connection.manager.client.ts | 0 .../src/{lib => backend}/gateway.client.ts | 0 .../{lib => backend}/proof.manager.client.ts | 0 libs/clients/src/frontend/agent_gen.ts | 1647 +++++ libs/clients/src/frontend/tsa_gen.ts | 342 + libs/clients/src/index.ts | 4 - libs/clients/src/ocmengine-client.ts | 167 + libs/clients/src/tsa-client.ts | 73 + libs/ts-client-generator/.gitignore | 2 + libs/ts-client-generator/Dockerfile | 17 + libs/ts-client-generator/Program.cs | 42 + .../TsClientGenerator.csproj | 14 + nx.json | 18 + package.json | 64 +- tsconfig.base.json | 5 +- yarn.lock | 5479 +++++++++++++---- 172 files changed, 12376 insertions(+), 1403 deletions(-) create mode 100644 apps/dashboard/.babelrc create mode 100644 apps/dashboard/.eslintrc.json create mode 100644 apps/dashboard/.gitignore create mode 100644 apps/dashboard/README.md create mode 100644 apps/dashboard/cssmodule.d.ts create mode 100644 apps/dashboard/deployment/ci-cd/Dockerfile create mode 100644 apps/dashboard/deployment/ci-cd/helm/Chart.yaml create mode 100644 apps/dashboard/deployment/ci-cd/helm/templates/ConfigMap.yaml create mode 100644 apps/dashboard/deployment/ci-cd/helm/templates/_helpers.tpl create mode 100644 apps/dashboard/deployment/ci-cd/helm/templates/deployment.yaml create mode 100644 apps/dashboard/deployment/ci-cd/helm/templates/ingress.yaml create mode 100644 apps/dashboard/deployment/ci-cd/helm/templates/service.yaml create mode 100644 apps/dashboard/deployment/ci-cd/helm/values.yaml create mode 100644 apps/dashboard/deployment/local/Dockerfile create mode 100644 apps/dashboard/jest.config.ts create mode 100644 apps/dashboard/project.json create mode 100644 apps/dashboard/src/assets/Vereign_Logo_ICON_BLACK.png create mode 100644 apps/dashboard/src/assets/config.js.example create mode 100644 apps/dashboard/src/assets/vault_image.png create mode 100644 apps/dashboard/src/components/App/index.tsx create mode 100644 apps/dashboard/src/components/App/styles.module.scss create mode 100644 apps/dashboard/src/components/BasicMessageItem/index.tsx create mode 100644 apps/dashboard/src/components/BasicMessageItem/styles.module.scss create mode 100644 apps/dashboard/src/components/BasicMessageList/BasicMessageListStore.ts create mode 100644 apps/dashboard/src/components/BasicMessageList/CreateMessage/index.tsx create mode 100644 apps/dashboard/src/components/BasicMessageList/index.tsx create mode 100644 apps/dashboard/src/components/ConnectionItem/index.tsx create mode 100644 apps/dashboard/src/components/ConnectionItem/styles.module.scss create mode 100644 apps/dashboard/src/components/CreatedDidItem/index.tsx create mode 100644 apps/dashboard/src/components/CreatedDidItem/styles.module.scss create mode 100644 apps/dashboard/src/components/CreatedInvitationItem/index.tsx create mode 100644 apps/dashboard/src/components/CreatedInvitationItem/styles.module.scss create mode 100644 apps/dashboard/src/components/CredentialDefinitionItem/index.tsx create mode 100644 apps/dashboard/src/components/CredentialDefinitionItem/styles.module.scss create mode 100644 apps/dashboard/src/components/CredentialItem/index.tsx create mode 100644 apps/dashboard/src/components/CredentialItem/styles.module.scss create mode 100644 apps/dashboard/src/components/CredentialList/CredentialListStore.ts create mode 100644 apps/dashboard/src/components/CredentialList/index.tsx create mode 100644 apps/dashboard/src/components/CredentialList/styles.module.scss create mode 100644 apps/dashboard/src/components/JsonDetails/index.tsx create mode 100644 apps/dashboard/src/components/JsonDetails/styles.module.scss create mode 100644 apps/dashboard/src/components/Modal/Body.tsx create mode 100644 apps/dashboard/src/components/Modal/Footer.tsx create mode 100644 apps/dashboard/src/components/Modal/index.tsx create mode 100644 apps/dashboard/src/components/Modal/styles.module.scss create mode 100644 apps/dashboard/src/components/NoRecordsMessage/index.tsx create mode 100644 apps/dashboard/src/components/Page/index.tsx create mode 100644 apps/dashboard/src/components/Page/styles.module.scss create mode 100644 apps/dashboard/src/components/PageTitle/index.tsx create mode 100644 apps/dashboard/src/components/PageTitle/styles.module.scss create mode 100644 apps/dashboard/src/components/PageWithSidebar/index.tsx create mode 100644 apps/dashboard/src/components/PageWithSidebar/styles.module.scss create mode 100644 apps/dashboard/src/components/ProofItem/index.tsx create mode 100644 apps/dashboard/src/components/ProofItem/styles.module.scss create mode 100644 apps/dashboard/src/components/ProofList/ProofListStore.ts create mode 100644 apps/dashboard/src/components/ProofList/index.tsx create mode 100644 apps/dashboard/src/components/RecordItem/index.tsx create mode 100644 apps/dashboard/src/components/RecordItem/styles.module.scss create mode 100644 apps/dashboard/src/components/RequireAuth/index.tsx create mode 100644 apps/dashboard/src/components/SchemaItem/index.tsx create mode 100644 apps/dashboard/src/components/SchemaItem/styles.module.scss create mode 100644 apps/dashboard/src/components/Sidebar/index.tsx create mode 100644 apps/dashboard/src/components/Sidebar/styles.module.scss create mode 100644 apps/dashboard/src/components/VaultHeader/index.tsx create mode 100644 apps/dashboard/src/components/VaultHeader/styles.module.scss create mode 100644 apps/dashboard/src/favicon.ico create mode 100644 apps/dashboard/src/hooks/auth/Provider.tsx create mode 100644 apps/dashboard/src/hooks/auth/context.ts create mode 100644 apps/dashboard/src/hooks/auth/useAuth.ts create mode 100644 apps/dashboard/src/hooks/useGlobalAuth.ts create mode 100644 apps/dashboard/src/hooks/withAuthorize.ts create mode 100644 apps/dashboard/src/index.html create mode 100644 apps/dashboard/src/main.tsx create mode 100644 apps/dashboard/src/modals/AcceptConnectionlessCredentialOfferDialog/index.tsx create mode 100644 apps/dashboard/src/modals/AcceptConnectionlessCredentialOfferDialog/styles.module.scss create mode 100644 apps/dashboard/src/modals/AcceptConnectionlessProofRequestDialog/index.tsx create mode 100644 apps/dashboard/src/modals/AcceptConnectionlessProofRequestDialog/styles.module.scss create mode 100644 apps/dashboard/src/modals/ConfirmDialog/index.tsx create mode 100644 apps/dashboard/src/modals/NewCredentialDefDialog/index.tsx create mode 100644 apps/dashboard/src/modals/NewCredentialDefDialog/styles.module.scss create mode 100644 apps/dashboard/src/modals/NewSchemaDialog/index.tsx create mode 100644 apps/dashboard/src/modals/NewSchemaDialog/styles.module.scss create mode 100644 apps/dashboard/src/modals/OfferCredentialDialog/OfferCredentialDialogStore.ts create mode 100644 apps/dashboard/src/modals/OfferCredentialDialog/index.tsx create mode 100644 apps/dashboard/src/modals/OfferCredentialDialog/styles.module.scss create mode 100644 apps/dashboard/src/modals/ReceiveInvitationDialog/index.tsx create mode 100644 apps/dashboard/src/modals/ReceiveInvitationDialog/styles.module.scss create mode 100644 apps/dashboard/src/modals/RequestProofDialog/RequestProofDialogStore.ts create mode 100644 apps/dashboard/src/modals/RequestProofDialog/index.tsx create mode 100644 apps/dashboard/src/modals/RequestProofDialog/styles.module.scss create mode 100644 apps/dashboard/src/modals/ViewConnectionlessCredentialOffer/index.tsx create mode 100644 apps/dashboard/src/modals/ViewConnectionlessCredentialOffer/styles.module.scss create mode 100644 apps/dashboard/src/modals/ViewConnectionlessProofRequest/index.tsx create mode 100644 apps/dashboard/src/modals/ViewConnectionlessProofRequest/styles.module.scss create mode 100644 apps/dashboard/src/modals/ViewJsonDialog/index.tsx create mode 100644 apps/dashboard/src/modals/ViewJsonDialog/styles.module.scss create mode 100644 apps/dashboard/src/routes/config.ts create mode 100644 apps/dashboard/src/routes/index.tsx create mode 100644 apps/dashboard/src/routes/pages/ConnectionCreatePage/ConnectionCreatePageStore.ts create mode 100644 apps/dashboard/src/routes/pages/ConnectionCreatePage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/ConnectionCreatePage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/ConnectionListPage/ConnectionListStore.ts create mode 100644 apps/dashboard/src/routes/pages/ConnectionListPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/ConnectionListPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/ConnectionViewPage/ConnectionViewPageStore.ts create mode 100644 apps/dashboard/src/routes/pages/ConnectionViewPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/ConnectionViewPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/CreatedDidListPage/CreatedDidListPageStore.ts create mode 100644 apps/dashboard/src/routes/pages/CreatedDidListPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/CreatedDidListPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/CreatedInvitationListPage/CreatedInvitationListPageStore.ts create mode 100644 apps/dashboard/src/routes/pages/CreatedInvitationListPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/CreatedInvitationListPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/CredentialDefListPage/CredentialDefListPageStore.ts create mode 100644 apps/dashboard/src/routes/pages/CredentialDefListPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/CredentialDefListPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/CredentialListPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/LoginPage/AuthForm/AuthFormStore.ts create mode 100644 apps/dashboard/src/routes/pages/LoginPage/AuthForm/index.tsx create mode 100644 apps/dashboard/src/routes/pages/LoginPage/AuthForm/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/LoginPage/LoginPageStore.ts create mode 100644 apps/dashboard/src/routes/pages/LoginPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/LoginPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/ProofListPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/RedirectWithTokenPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/RegisterPage/RegisterPageStore.ts create mode 100644 apps/dashboard/src/routes/pages/RegisterPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/RegisterPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/ResolveDidPage/ResolveDidPageStore.ts create mode 100644 apps/dashboard/src/routes/pages/ResolveDidPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/ResolveDidPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/SchemaListPage/SchemaListPageStore.ts create mode 100644 apps/dashboard/src/routes/pages/SchemaListPage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/SchemaListPage/styles.module.scss create mode 100644 apps/dashboard/src/routes/pages/VcmSelfIssuePage/VcmSelfIssuePageStore.ts create mode 100644 apps/dashboard/src/routes/pages/VcmSelfIssuePage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/WelcomePage/index.tsx create mode 100644 apps/dashboard/src/routes/pages/WelcomePage/styles.module.scss create mode 100644 apps/dashboard/src/store/modalStore.tsx create mode 100644 apps/dashboard/src/styles.scss create mode 100644 apps/dashboard/src/utils/displayError.tsx create mode 100644 apps/dashboard/src/utils/getConfig.ts create mode 100644 apps/dashboard/tsconfig.app.json create mode 100644 apps/dashboard/tsconfig.json create mode 100644 apps/dashboard/tsconfig.spec.json create mode 100644 apps/dashboard/types.d.ts create mode 100644 apps/dashboard/webpack.config.js create mode 100755 client-generator.sh create mode 100644 libs/clients/src/backend.ts rename libs/clients/src/{lib => backend}/attestation.manager.client.ts (100%) rename libs/clients/src/{lib => backend}/connection.manager.client.ts (100%) rename libs/clients/src/{lib => backend}/gateway.client.ts (100%) rename libs/clients/src/{lib => backend}/proof.manager.client.ts (100%) create mode 100644 libs/clients/src/frontend/agent_gen.ts create mode 100644 libs/clients/src/frontend/tsa_gen.ts delete mode 100644 libs/clients/src/index.ts create mode 100644 libs/clients/src/ocmengine-client.ts create mode 100644 libs/clients/src/tsa-client.ts create mode 100644 libs/ts-client-generator/.gitignore create mode 100644 libs/ts-client-generator/Dockerfile create mode 100644 libs/ts-client-generator/Program.cs create mode 100644 libs/ts-client-generator/TsClientGenerator.csproj diff --git a/.dockerignore b/.dockerignore index 9b51b9d5..cee3cb4c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,5 +2,6 @@ node_modules tmp tools compose -.* +.env +.env.example dist diff --git a/.eslintrc.json b/.eslintrc.json index a8080a9e..5dec4d9a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,22 +4,7 @@ "plugins": ["@nrwl/nx", "@typescript-eslint/eslint-plugin"], "overrides": [ { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": { - "@nrwl/nx/enforce-module-boundaries": [ - "error", - { - "enforceBuildableLibDependency": true, - "allow": [], - "depConstraints": [ - { - "sourceTag": "*", - "onlyDependOnLibsWithTags": ["*"] - } - ] - } - ] - } + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"] }, { "files": ["*.ts", "*.tsx"], diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f86acdc0..8030fd56 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,10 @@ lint-agent: extends: .lint-agent stage: lint +# lint-dashboard: +# extends: .lint-dashboard +# stage: lint + # lint-attestation-manager: # extends: .lint-attestation-manager # stage: lint @@ -41,6 +45,10 @@ test-agent: extends: .test-agent stage: test +# test-dashboard: +# extends: .test-dashboard +# stage: test + # test-attestation-manager: # extends: .test-attestation-manager # stage: test @@ -63,6 +71,10 @@ build-agent: extends: .build-agent stage: build +build-dashboard: + extends: .build-dashboard + stage: build + # build-attestation-manager: # extends: .build-attestation-manager # stage: build @@ -85,6 +97,10 @@ docker-agent: extends: .docker-agent stage: docker +docker-dashboard: + extends: .docker-dashboard + stage: docker + # docker-attestation-manager: # extends: .docker-attestation-manager # stage: docker @@ -107,6 +123,10 @@ registry-agent: extends: .registry-agent stage: registries +registry-dashboard: + extends: .registry-dashboard + stage: registries + # registry-attestation-manager: # extends: .registry-attestation-manager # stage: registries @@ -129,6 +149,10 @@ helm-agent: extends: .helm-agent stage: helm +helm-dashboard: + extends: .helm-dashboard + stage: helm + # helm-attestation-manager: # extends: .helm-attestation-manager # stage: helm @@ -169,6 +193,22 @@ deploy agent ocm test tagged: extends: .deploy-agent-ocm-test-tag stage: deploy-test +deploy dashboard ocm: + extends: .deploy-dashboard-ocm-main + stage: deploy-test + +deploy dashboard ocm tagged: + extends: .deploy-dashboard-ocm-main-tag + stage: deploy-test + +deploy dashboard ocm test: + extends: .deploy-dashboard-ocm-test + stage: deploy-test + +deploy dashboard ocm test tagged: + extends: .deploy-dashboard-ocm-test-tag + stage: deploy-test + # deploy attestation ocm: # extends: .deploy-attestation-manager-ocm-main # stage: deploy-test diff --git a/apps/dashboard/.babelrc b/apps/dashboard/.babelrc new file mode 100644 index 00000000..88ee27b1 --- /dev/null +++ b/apps/dashboard/.babelrc @@ -0,0 +1,11 @@ +{ + "presets": [ + [ + "@nx/react/babel", + { + "runtime": "automatic" + } + ] + ], + "plugins": [] +} diff --git a/apps/dashboard/.eslintrc.json b/apps/dashboard/.eslintrc.json new file mode 100644 index 00000000..b8a8dc87 --- /dev/null +++ b/apps/dashboard/.eslintrc.json @@ -0,0 +1,20 @@ +{ + "extends": ["plugin:@nx/react", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": { + "@typescript-eslint/no-non-null-assertion": "off" + } + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/apps/dashboard/.gitignore b/apps/dashboard/.gitignore new file mode 100644 index 00000000..631c2b19 --- /dev/null +++ b/apps/dashboard/.gitignore @@ -0,0 +1 @@ +src/assets/config.js diff --git a/apps/dashboard/README.md b/apps/dashboard/README.md new file mode 100644 index 00000000..8e65f09c --- /dev/null +++ b/apps/dashboard/README.md @@ -0,0 +1,18 @@ +# OCM ENGINE - Dashboard +Used for Administration of OCM + +#### Install dependencies +``` +yarn install +``` +#### Copy config.js.example to config.js in assets directory + +``` +cp .config.js.example config.js +``` + +#### Start the agent locally: + +``` +yarn serve:dashboard +``` diff --git a/apps/dashboard/cssmodule.d.ts b/apps/dashboard/cssmodule.d.ts new file mode 100644 index 00000000..9938a9f6 --- /dev/null +++ b/apps/dashboard/cssmodule.d.ts @@ -0,0 +1,24 @@ +declare module "*.module.css" { + const classes: { readonly [key: string]: string }; + export default classes; +} + +declare module "*.module.scss" { + const classes: { readonly [key: string]: string }; + export default classes; +} + +declare module "*.module.sass" { + const classes: { readonly [key: string]: string }; + export default classes; +} + +declare module "*.module.less" { + const classes: { readonly [key: string]: string }; + export default classes; +} + +declare module "*.module.styl" { + const classes: { readonly [key: string]: string }; + export default classes; +} diff --git a/apps/dashboard/deployment/ci-cd/Dockerfile b/apps/dashboard/deployment/ci-cd/Dockerfile new file mode 100644 index 00000000..e39ecce7 --- /dev/null +++ b/apps/dashboard/deployment/ci-cd/Dockerfile @@ -0,0 +1,41 @@ +FROM nginx:1.25.3-bookworm +RUN apt update -y && apt install npm nodejs python3 git make build-essential wget unzip -y + +RUN npm i -g yarn + +# Copy the built React app files into the NGINX web server directory +ARG API_TOKEN +ARG JOB_ID + +# Set the ENV variables +ENV GITLAB_BASE_URL=https://code.vereign.com/api/v4 +ENV GITLAB_PROJECT_ID=662 +ENV TOKEN=$API_TOKEN +ENV ID=$JOB_ID + +# Download the artifacts from the GitLab API +RUN wget --header "PRIVATE-TOKEN: $TOKEN" -O artifacts.zip "${GITLAB_BASE_URL}/projects/${GITLAB_PROJECT_ID}/jobs/${ID}/artifacts" + +# Unzip the artifacts (if needed) - adjust this command based on your artifact type +RUN unzip -q artifacts.zip && rm artifacts.zip + +RUN yarn install + +RUN mkdir -p /usr/share/nginx/html/ocm-test/dashboard +RUN mkdir -p /usr/share/nginx/html/ocm/dashboard + + +RUN cp -r dist/apps/ocm-test-dashboard/* /usr/share/nginx/html/ocm-test/dashboard +RUN cp -r dist/apps/dashboard/* /usr/share/nginx/html/ocm/dashboard + +RUN cp -r dist/libs /usr/share/nginx/html/ocm-test/dashboard +RUN cp -r dist/libs /usr/share/nginx/html/ocm/dashboard + +RUN cp -r node_modules /usr/share/nginx/html/ocm-test/dashboard +RUN cp -r node_modules /usr/share/nginx/html/ocm/dashboard + +# Expose the port that NGINX will run on +EXPOSE 8080 + +# Command / Entrypoint +CMD ["nginx", "-g", "daemon off;"] diff --git a/apps/dashboard/deployment/ci-cd/helm/Chart.yaml b/apps/dashboard/deployment/ci-cd/helm/Chart.yaml new file mode 100644 index 00000000..721efcad --- /dev/null +++ b/apps/dashboard/deployment/ci-cd/helm/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +appVersion: build-654 +description: dashboard deployment +name: dashboard +version: 0.0.2 +icon: "https://www.vereign.com/wp-content/themes/vereign2020/images/vereign-logo.svg" diff --git a/apps/dashboard/deployment/ci-cd/helm/templates/ConfigMap.yaml b/apps/dashboard/deployment/ci-cd/helm/templates/ConfigMap.yaml new file mode 100644 index 00000000..4eb90dd5 --- /dev/null +++ b/apps/dashboard/deployment/ci-cd/helm/templates/ConfigMap.yaml @@ -0,0 +1,21 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "app.name" . }}-config + namespace: {{ .Release.Namespace }} + labels: + {{- include "app.labels" . | nindent 4 }} +data: + config.js: | + {{- if eq .Release.Namespace "ocm" }} + window.OCMENGINE_HTTP_URL="{{ .Values.ocm.dashboard.agent.http }}"; + window.OCMENGINE_WS_URL="{{ .Values.ocm.dashboard.agent.wss }}"; + window.TSA_URL="{{ .Values.ocm.dashboard.tsa }}"; + window.BASE_PATH="{{ .Values.ocm.dashboard.basepath }}"; + {{- else if eq .Release.Namespace "ocm-test" }} + window.OCMENGINE_HTTP_URL="{{ .Values.ocmtest.dashboard.agent.http }}"; + window.OCMENGINE_WS_URL="{{ .Values.ocmtest.dashboard.agent.wss }}"; + window.TSA_URL="{{ .Values.ocmtest.dashboard.tsa }}"; + window.BASE_PATH="{{ .Values.ocmtest.dashboard.basepath }}"; + {{- end }} diff --git a/apps/dashboard/deployment/ci-cd/helm/templates/_helpers.tpl b/apps/dashboard/deployment/ci-cd/helm/templates/_helpers.tpl new file mode 100644 index 00000000..6cba3ffc --- /dev/null +++ b/apps/dashboard/deployment/ci-cd/helm/templates/_helpers.tpl @@ -0,0 +1,94 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "app.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "app.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" $name .Release.Namespace | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create instance name based on app version and short image sha. +*/}} +{{- define "app.revision" -}} +{{- default .Release.Name .Values.appRel | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "app.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "app.labels" -}} +helm.sh/chart: {{ include "app.chart" . }} +{{ include "app.selectorLabels" . }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "app.selectorLabels" -}} +app.kubernetes.io/name: {{ include "app.name" . }} +app.kubernetes.io/component: {{ include "app.fullname" . }} +{{- end -}} + +{{/* +Metrics Annotations +*/}} +{{- define "app.metricsAnnotations" -}} +{{- if .Values.metrics.enabled -}} +prometheus.io/scrape: "true" +prometheus.io/port: "{{ .Values.metrics.port }}" +prometheus.io/path: {{ .Values.metrics.path | default "/metrics" | quote }} +{{- end -}} +{{- end -}} + +{{/* +Image string +*/}} +{{- define "app.image" -}} +{{- if .Values.image.sha -}} +{{ .Values.image.repository }}/{{ .Values.image.name }}@{{ .Values.image.sha }} +{{- else -}} +{{ .Values.image.repository }}/{{ .Values.image.name }}:{{ default .Chart.AppVersion .Values.image.tag }} +{{- end -}} +{{- end -}} + +{{/* +Security context +*/}} +{{- define "app.securitycontext" -}} +runAsNonRoot: {{ .Values.security.runAsNonRoot | default false }} +runAsGroup: {{ .Values.security.runAsGid | default 0 }} +runAsUser: {{ .Values.security.runAsUid | default 0 }} +fsGroup: {{ .Values.security.runAsGid | default 0 }} +{{- end -}} + +{{/* +PostgreSQL Connection string URI +*/}} +{{- define "app.postgresql.connectionstring" -}} +postgresql://{{ .Values.attestationManager.database.user }}:{{ .Values.attestationManager.database.password }}@{{ .Values.attestationManager.database.host }}:{{ .Values.attestationManager.database.port }}/{{ .Release.Namespace }}_{{ include "app.name" . | replace "-" "_" }}?schema={{ .Values.attestationManager.database.schema }} +{{- end -}} + +{{/* +Ingress custom path. +*/}} +{{- define "app.path" -}} +{{- default .Chart.Name .Values.ingress.pathOverride | replace "-manager" "" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/apps/dashboard/deployment/ci-cd/helm/templates/deployment.yaml b/apps/dashboard/deployment/ci-cd/helm/templates/deployment.yaml new file mode 100644 index 00000000..bb59b01d --- /dev/null +++ b/apps/dashboard/deployment/ci-cd/helm/templates/deployment.yaml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "{{ template "app.name" . }}" + namespace: {{ .Release.Namespace }} + labels: + {{- include "app.labels" . | nindent 4 }} + app.kubernetes.io/instance: {{ include "app.revision" . }} +spec: + replicas: {{ .Values.replicaCount }} + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + selector: + matchLabels: + {{- include "app.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "app.labels" . | nindent 8 }} + annotations: + {{- include "app.metricsAnnotations" . | nindent 8 }} +{{- if .Values.podAnnotations }} +{{ toYaml .Values.podAnnotations | indent 8 }} +{{- end }} + spec: + securityContext: +{{- include "app.securitycontext" . | nindent 8 }} + imagePullSecrets: + - name: {{ .Values.image.pullSecrets }} + containers: + - name: {{ template "app.name" . }} + image: "{{ .Values.image.repository }}/{{ .Values.image.name }}:{{ default .Chart.AppVersion .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} +{{- if .Values.extraVars }} +{{ toYaml .Values.extraVars | indent 8 }} +{{- end }} + ports: + {{- if .Values.metrics.enabled }} + - name: monitoring + containerPort: {{ .Values.metrics.port }} + {{- end }} + - name: http + containerPort: {{ .Values.service.port }} + resources: +{{ toYaml .Values.resources | indent 10 }} + volumeMounts: + {{- if eq .Release.Namespace "ocm" }} + - name: {{ template "app.name" . }}-config + mountPath: /usr/share/nginx/html/ocm/dashboard/assets/config.js + subPath: config.js + {{- else if eq .Release.Namespace "ocm-test" }} + - name: {{ template "app.name" . }}-config + mountPath: /usr/share/nginx/html/ocm-test/dashboard/assets/config.js + subPath: config.js + {{- end }} + volumes: + - name: {{ template "app.name" . }}-config + configMap: + name: {{ template "app.name" . }}-config + diff --git a/apps/dashboard/deployment/ci-cd/helm/templates/ingress.yaml b/apps/dashboard/deployment/ci-cd/helm/templates/ingress.yaml new file mode 100644 index 00000000..95517eaa --- /dev/null +++ b/apps/dashboard/deployment/ci-cd/helm/templates/ingress.yaml @@ -0,0 +1,47 @@ +{{- if .Values.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ template "app.name" . }} + namespace: {{ .Release.Namespace }} + {{- if eq .Release.Namespace "ocm" }} + annotations: +{{ toYaml .Values.ingress.ocm.annotations | indent 4 }} + {{- else if eq .Release.Namespace "ocm-test" }} + annotations: +{{ toYaml .Values.ingress.ocmtest.annotations | indent 4 }} + {{- end }} + labels: + {{- include "app.labels" . | nindent 4 }} +spec: +{{- if .Values.ingress.tlsEnabled }} + tls: + - hosts: + - {{ .Values.ingress.frontendDomain }} + secretName: {{ .Values.ingress.frontendTlsSecretName }} +{{- end }} + rules: + {{- if eq .Release.Namespace "ocm" }} + - host: {{ .Values.ingress.frontendDomain }} + http: + paths: + - path: /ocm/dashboard(/|$)(.*) + pathType: Prefix + backend: + service: + name: {{ template "app.name" . }} + port: + number: {{ .Values.service.port }} + {{- else if eq .Release.Namespace "ocm-test" }} + - host: {{ .Values.ingress.frontendDomain }} + http: + paths: + - path: /ocm-test/dashboard(/|$)(.*) + pathType: Prefix + backend: + service: + name: {{ template "app.name" . }} + port: + number: {{ .Values.service.port }} + {{- end }} +{{- end }} diff --git a/apps/dashboard/deployment/ci-cd/helm/templates/service.yaml b/apps/dashboard/deployment/ci-cd/helm/templates/service.yaml new file mode 100644 index 00000000..375d171e --- /dev/null +++ b/apps/dashboard/deployment/ci-cd/helm/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ template "app.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "app.labels" . | nindent 4 }} +spec: + clusterIP: None + ports: + - name: http + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} + selector: + {{- include "app.selectorLabels" . | nindent 4 }} diff --git a/apps/dashboard/deployment/ci-cd/helm/values.yaml b/apps/dashboard/deployment/ci-cd/helm/values.yaml new file mode 100644 index 00000000..9d19349e --- /dev/null +++ b/apps/dashboard/deployment/ci-cd/helm/values.yaml @@ -0,0 +1,101 @@ +# -- Default number of instances to start ..... +replicaCount: 1 +# -- Application name ... +name: dashboard +# -- Ovverwrites application name ... +nameOverride: "" + +image: + repository: eu.gcr.io/vrgn-infra-prj + # -- Image name .. + name: gaiax/ocm/ocm-engine/dashboard + # -- Image tag .. + # Uses .Chart.AppVersion if empty . + tag: "" + # -- Image sha, usually generated by the CI . + # Uses image.tag if empty . + sha: "" + # -- Image pull policy . + pullPolicy: Always + # -- Image pull secret when internal image is used . + pullSecrets: deployment-key-light + +resources: + requests: + cpu: 250m + +autoscaling: + # -- Enable autoscaling . + enabled: false + # -- Minimum replicas . + minReplicas: 1 + # -- Maximum replicas . + maxReplicas: 3 + # -- CPU target for autoscaling trigger . + targetCPUUtilizationPercentage: 70 + # -- Memory target for autoscaling trigger . + targetMemoryUtilizationPercentage: 70 +## +## Prometheus Exporter / Metrics . +## + +metrics: + # -- Enable prometheus metrics . + enabled: true + # -- Port for prometheus metrics . + port: 2112 + +## +## Kubernetes [SecurityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) object. +## + +security: + # -- by default, apps run as non-root . + runAsNonRoot: false + # -- User used by the apps . + runAsUid: 0 + # -- Group used by the apps . + runAsGid: 0 + +ocm: + dashboard: + agent: + ws: "wss://ssi-dev.vereign.com/api-issuer" + http: "https://ssi-dev.vereign.com/api-issuer" + tsa: "https://tsa.vereign.com" + basepath: "/ocm/dashboard" + +ocmtest: + dashboard: + agent: + ws: "wss://ssi-dev.vereign.com/api-holder" + http: "https://ssi-dev.vereign.com/api-holder" + tsa: "https://tsa.vereign.com" + basepath: "/ocm-test/dashboard" + +service: + port: 8080 + +ingress: + enabled: true + tlsEnabled: true + frontendDomain: ssi-dev.vereign.com + frontendTlsSecretName: cert-manager-tls + + ocm: + annotations: { + kubernetes.io/ingress.class: "nginx", + cert-manager.io/cluster-issuer: letsencrypt-production-http, + kubernetes.io/ingress.global-static-ip-name: ssi-dev, + nginx.ingress.kubernetes.io/rewrite-target: /ocm/dashboard/$2 + } + + ocmtest: + annotations: { + kubernetes.io/ingress.class: "nginx", + cert-manager.io/cluster-issuer: letsencrypt-production-http, + kubernetes.io/ingress.global-static-ip-name: ssi-dev, + nginx.ingress.kubernetes.io/rewrite-target: /ocm-test/dashboard/$2 + } + + diff --git a/apps/dashboard/deployment/local/Dockerfile b/apps/dashboard/deployment/local/Dockerfile new file mode 100644 index 00000000..f097b257 --- /dev/null +++ b/apps/dashboard/deployment/local/Dockerfile @@ -0,0 +1,13 @@ +FROM node:18.16.0-buster-slim + +RUN apt update -y && apt install python3 git make build-essential -y + +WORKDIR /app + +COPY ./dist/apps/dashboard ./ +COPY package.json yarn.lock ./ + +RUN yarn install +EXPOSE 4200 + +CMD ["yarn", "nx", "serve", "dashboard"] diff --git a/apps/dashboard/jest.config.ts b/apps/dashboard/jest.config.ts new file mode 100644 index 00000000..5f84421e --- /dev/null +++ b/apps/dashboard/jest.config.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +export default { + displayName: "dashboard", + preset: "../../jest.preset.js", + transform: { + "^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "@nx/react/plugins/jest", + "^.+\\.[tj]sx?$": ["babel-jest", { presets: ["@nx/react/babel"] }], + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../coverage/apps/dashboard", +}; diff --git a/apps/dashboard/project.json b/apps/dashboard/project.json new file mode 100644 index 00000000..3b99e89b --- /dev/null +++ b/apps/dashboard/project.json @@ -0,0 +1,85 @@ +{ + "name": "dashboard", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/dashboard/src", + "projectType": "application", + "targets": { + "build": { + "executor": "@nx/webpack:webpack", + "outputs": ["{options.outputPath}"], + "defaultConfiguration": "production", + "options": { + "compiler": "babel", + "outputPath": "dist/apps/dashboard", + "index": "apps/dashboard/src/index.html", + "baseHref": "/", + "main": "apps/dashboard/src/main.tsx", + "tsConfig": "apps/dashboard/tsconfig.app.json", + "assets": [ + "apps/dashboard/src/favicon.ico", + "apps/dashboard/src/assets" + ], + "styles": ["apps/dashboard/src/styles.scss"], + "scripts": [], + "isolatedConfig": true, + "webpackConfig": "apps/dashboard/webpack.config.js" + }, + "configurations": { + "development": { + "extractLicenses": false, + "optimization": false, + "sourceMap": true, + "vendorChunk": true + }, + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false + } + } + }, + "serve": { + "executor": "@nx/webpack:dev-server", + "defaultConfiguration": "development", + "options": { + "buildTarget": "dashboard:build", + "hmr": true, + "host": "0.0.0.0" + }, + "configurations": { + "development": { + "buildTarget": "dashboard:build:development" + }, + "production": { + "buildTarget": "dashboard:build:production", + "hmr": false + } + } + }, + "lint": { + "executor": "@nx/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["apps/dashboard/**/*.{ts,tsx,js,jsx}"] + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "apps/dashboard/jest.config.ts", + "passWithNoTests": true + }, + "configurations": { + "ci": { + "ci": true, + "codeCoverage": true + } + } + } + }, + "tags": [] +} diff --git a/apps/dashboard/src/assets/Vereign_Logo_ICON_BLACK.png b/apps/dashboard/src/assets/Vereign_Logo_ICON_BLACK.png new file mode 100644 index 0000000000000000000000000000000000000000..f96d03054e394a76b0eb94b59cc277d6abc3bf36 GIT binary patch literal 57702 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�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 XUu^M5FF%IYVE7BF=d;e<eE9zXPG0O= literal 0 HcmV?d00001 diff --git a/apps/dashboard/src/assets/config.js.example b/apps/dashboard/src/assets/config.js.example new file mode 100644 index 00000000..7ce5785e --- /dev/null +++ b/apps/dashboard/src/assets/config.js.example @@ -0,0 +1,4 @@ +window.OCMENGINE_HTTP_URL="https://ssi-dev.vereign.com/ocm-test-gateway"; +window.OCMENGINE_WS_URL="wss://ssi-dev.vereign.com/ocm-test-gateway"; +window.TSA_URL="https://tsa.vereign.com"; +window.BASE_PATH="/"; diff --git a/apps/dashboard/src/assets/vault_image.png b/apps/dashboard/src/assets/vault_image.png new file mode 100644 index 0000000000000000000000000000000000000000..98646b843eb38a1e2a539a0b79ec93b14b74d45e GIT binary patch literal 195837 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�R(p#6ic_rgnU%%$vS>ZBf*M?LnuOcK+Yae$+E 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⁕S~Jq?HMkGgBEXy-HBBAS4{;5@$)@*<-3samjg1V`ZF&Fdcj+n zE@Cm(sm-7IXDf~uY_Q2yFZy89*00qdU!WESgzWq}=Vxv@*9YM0X}#j%0n4B8!M6`= zh4v9d*-^AD=0-E0C7-igv+-Z|Ir-MJ5tHH1595}}-@*!QC(1jYOO^M3=}2G-SWNA; z2uKWu5-Mj`o)GgztrRdarBgP~e=Ss?8_t(Q+zA0LDnfKzkEkd>3OT-vj41QnA87hV z&w1Ief8BB1^zzlK%A&CwsU$Ph?Y(fY>tw_Q%^S3#J(8}#Lu!SF9t5FHTzpU{6#WMT zzM#h@e;c~6M~KIh2Fg*I+O11u&rbPG>SJHC4cT@1<RRRD13|e66sQV>MMPe9-JQ?? z3({}8)!&NMn+|NVzol{+pM1m1>opuy<_FltrEzqX)X=}U;H+ni?ol9kkkj&#y?d=( z;O%?p*qglZog9y%piqVMBvJ-FiQ_D#D4U|HtiRRq%lD%#O{La*>4C&@WA?=rb)a}0 z(ZUZpU3sgOXVy^vlGi_M>7(8?x3^=k>DFQZDO4eG$74LO*lZoCfAo{w&lRu?2M5kH zQRaZ}TK{qn+YHPD)t?p{Z)DFvWY)jtFZaTMI`5^=;c({G>#q;xX++%3J<kr8duD28 zLN6|Yxb^-(@_AoKpHiyTJPCn*K=-ITJdW-F*c(1SpKb{a4ZT5g>S*u3qJqMHa#E6~ zB^c0#`cK9e5)%_eS65fDho6i#0XLmX8?eZvqmCL-7mHI#xrrcs0YXBX+-E4Xq?e%> ztX%%tZld->^#JEorMY`cm&Q&NdmMsHX~Bg>w+6r_#Q}P$X0ceF0l9?4<t`j}!3+`u zYAaO|y&07lTbSTQ02FX5dcZO@#R38VB^kW8ln(6;Ft2&5MPIaNeGa?`#psFvbSgsW zLpiBU7iyVG@5pe2{w=pvL<1SNrt@KQOXAGTOeo0li2h1Im6Vj4oZJm2X`Y$g!`9YT zaMT|6tT|f9SQwLJW5t=oj&7+j#LAd_1uw+d)=6u3clRz@`Cc|M@>=e*oTB1EYEs&Q zFpr1`d1MzJ(58UUSH~VTmSkXl>5+Q=RjV8e8<;<|ZEH@q;(d0HWDkI}tOBHNuqD0| zuTeqM@1S-t(%WDQ%sDKZXoY0$)2`6U7-p@e(Q}X+E43TAnWa*gk1?sG#OL{UNReLK z!d(aAr%L|PK$P)^;oF0xr38gMOmaW;{)b<dI&TqamVd%Q>)GS`z@0|x+a}1NK-hO- znRgZ9{7{A&3>*13n6!T`=Wht^W6H>MsHB7@fiRbUJ1iP3AIg+~4Wx(dS+M9!k(YK) zOzEj3NmoOq(jb|E5c<IJTfrGv${OG?clGlkut#;TcQ>GZh^s|Z%Mdtlb|ylpJVs># zBzTyb`KAk!%0v*#aw+MeVmg-gZ)JsIJ(pc}#Gmj1Fs8dOf(e`#q2Fqmp6PUQKxN<i z2&Qwmr@~{y7ja<jxQQwx@+hH4*X5qVf`=Q5LSY2i{D+MSI1c_RK(S`HHJZaEBy>0C zu9D>j&;-ue)nBi1-b{lAHCljHiZJ`>G#X+Bek?!zn;u1<%eG*NpId5A@W%pmI6zcb z;zBs%R%Xfb7IW$B%}CxIiD5RZxtT`p`+5rs?yxLcTb<L!(nh`*HLNCHL!%_Jgt0M@ z-lxU_JS>)pA5+9h^$;&jw{UA;7ydCd+=;-2MQ`VcKg#w<YFfXs%n;91;dsrF9-vaD zM#}OYa8RDRh%UwH1}o%tPeG3^TAVlHY(|J7A*lkmT=bApkbXICCU!D`x}Jqc_hiQ^ z<b75F=2xIP^WVX=)Ru7I9u5f=IA8PZo~vkgq5d*H$LFZQsijp-IQ+m@gZ<bMsnSKj z#{gBXw4q=~$X&iq46gz<SAMy7?HZjz|Hzk~yUM9Au!iKTcKbU_AK7lwj28d-Kc?O~ zs><&91Eo6--QAr6(g#5rq`Mmd1pxsGIdr3vDuQ%(r*yY~NP~1pNY~xx{r>J<_a9-o zT#rxeJ$q(8G3KW7T0u>w!T!?tpgYNq3KqYmQ3_ztmgB-L1DxvB<8tDSy(*kOlPgEl zE17_eQ3NRPgTpf3*Zq8;9+ViTp`;Z2IEa#@VrOV*ScujnD&WNU5Xz+fA|c~-Or&>f z%?0JV67$n{QDIrGCDPawL@%G?A~f(5?0=#_!3lZqBwn=k4Eq!N)N{d}X3t*Dp96T! zS2R3q_ez)8F@=?`R6t7(?7j+<xF9k80Du1IA|mnT5gGq$-Tt7NVueY=#f7K1)XHu< zBZeS(l1kpMO+Y@+dpx1D@SOt`-vkg<^6iWO-ODO4u$@+OiVNR37dy(Hmi6IXOLz$9 zhc((?RJg-A)D@@aHO;+0-m2L37r9&f$;9QyDWHAh?7T&&Qly&}nXGW=JwrbFm&ebT z0n7H#JLgHkqmy8ioO~NO3VR-q*D<6HL!~W11_eq@L<Z)j`$<JnX+VW`paph~w`{De z7v$l=5v0(>6tIARG=o-p>+j>kjLh{WU*NeQk}Z3N3W2i@c!hA&9d;5`Syz9YbLqAq zJc(<VF?D9NTrhzGox-zFivZ`fT;2skx+3*r6CzgbKKU7C0iqvSIJ4+>GGEZc6e`wi zH@IY_Gtn3F;Wo{*37>#)t-SH}=p8R852eL`dm#Wz2fUjrFkt`4BJk<HU4hEt!~iH4 zzEyz2b)z3JyFU0x;^k?>)%d`WYxR!Vtl#oc`|YRxSWZ*MXz8I+hT<E$6Q;l}`I&qo z8|ztk@cuY#%_!92`Gwud{)kZC_Vr?VqBsx|0v90{5#(NLOltw`kAuv_(P1ZG9L@ey z&BK7b0dTY|0idA;b1XZKUI_&*$Nt4tao2VGxZm+`>k4dEh9knKLLtZ=P1Gafe7Y7X zmLGrYbSnBlTCK%@3p8a58Hy$?D-^qCJ1>-I_{!+I^B40S-B8Cw0ildxY}6ifwJs-H zY~m@q7S<PbK8%Wxm12<`<S<l15CZ`;0IyToi9sg;EMUVFyTiq%v#SWYz$@nIS`}cf zxj-6Y)T?nx22EVf1!S53>dK1^y2pQZz&(-fn<@tlpyq<lX&D%Z2u7g;OrzZQdOl#) z-APn@qeCBy=whyd&fL0}ORbZu{`1-tTJE>{RB|+gvqJ0rA7;cDbXY5f;TCS>;Tzd~ zTLK)!r!$MI9&0~RineGlVPhkwr-2R2)=Xn7+0zw~#z)!4iO^nPdI@TL1)&(r-ReAk zNlBb~R~>|bOklNS(6*Lo{y4tt=~oVtAxLfmJp8SX2OJIIn|jS8SlBHjf43D>K**w8 zl}5k5qgP9d?3ic^=RPtro!tXt5x`8|VnZS$Be}?1EZa91n1_)zmc|(hS}dkLgH-$X z7t841!hO|T7C?gmhs4eP?Zx{SxMSVV@85o6cM`iwLV8?%ol^6cSeB_@SlT<$yssXx zlUN4y%h&*ZE11rlZ`B8{QHek&DZk_CdgP`F$S2;K0LnNfDg<Sh1SDj4a2K1Kcgtt( z6%T->dp~T*odSmT_SADF4s!ok{QAkOBtW0=F8O)3;#=<0<{MjmRQ;5uHw11^?OgT4 z!bYsuiZzpeDp#fz_FY%M#?v?7G-t)e)asl<CDK+WGX=IYSM^=P2|OyvJC`rC?e;w` z8AgyJJkS%q)P0Q1D?UVI(+Z72hu$DwNP>ltIBefp&jIYo;8sw>n{03k9J1u--X8b? z0|1=}{tFZ+gg}ME_n@jjp?$BIu5FJAkXD9(#k<Ed&SXX)53Di_ZEAWtU|aoy8|@sg zw;y-PsAukH-I{d_H`|j0mU7%l?Q9`r$%HZT<?)x1<BnW>B@&%Xh-_w+lVS;&ubyvG z*;ZnrU!%dIi5}n6Xd%6?G!6ChKMT=`9Z}SnRNSmCj}?U`Zh=#2=EoH`sHZ_+rN|Zw zgCPp;SL3>0?^^IVU(3A8x)(Xz>R$^!8jSukH#c|e9nk9gPHs!T-HZUfSjCU%2;EWg zgzR2Z2;-xpP~OxC71SCxhC`MCaxLnmYgei|)zlF}hCtG#!q2-Q8jj(d^<lo`CpW$P z|2Et)1hP`nV^BNJ%1y=f37f*Y_iLl%LS{G~M}nN@ZwWLES0%_%oI>$q$G1FWivaDC z+B(IKM%>@0H^hWi{0t5j`_6n&T$TWGv#jZR1xRj<<oQn>Rk*jE`AylYfLjZ?Apic8 zLE9;Qbt0@V{~48PgkEb2vxdaLoD2hvL)2PkrA1X?`6cv+%sJDb(SMzM3#l$rL_)0? z?s%#GNGcWNB>h;n$G{k%co+8cZT{ykIsxf6dRE1pwxy_R4~Ph1&Oe?q$oiZmkrz%g zw!-cSP~1z|Tu8V4zayl4(ocKw1@A9BGRWMm;q!sxPQ2D*bLe)$4@Ms{SU2}@(^~;7 zIfLARNvF(o{o$moAk^hc*WDd85Yb^@`!By?bg<>$*_uoq`?0)o#`ZZ7Ww4KAHbz<A z?g_zy<DKc_Fxut$_tr|jpA?rZ3K?2&G=&QC^ZBZZa5p_L4^(<Fvx}OaXpOZ+)vaTt zVRBHn{`@BPAqT618}&C->GOIH4H*N>Q-XJ2Sp+*-g#t*nnTY`ZcBuR9%Kdf>+`7#9 zB)c~O4;Pn4M4d>H9%E`7&I1H8zWB!x2kCe7BnGDLMu0t}oTm*K<De-CmyLtEz<GAu zjrJoRsSj&c4%yk_XA!%a>XM-dS2jlqJ((m@qIC`N-g;4-?!loaMm1>zAuD!q^<ADM zbyKm~c-~oeL-Ygmoz|KlF8=X&ia?+EpW5OjsK?lrye^l<2kmN@KtJsk^z-m6UrWON zu>nfA;XRybnE-BR(+;@2^rJ?}FUIz+gVqlSvF((qAD?k4_pBn<wK(=0PH5s>8R^3` z4heDt8&LB)&qix3?k>Wu#Mk9XZ5UsweeGvHP=@Gy*qzNOS?{9uAtuKl#98(O<9f5S zIYR7=;Ra%c+!`)`$Xg)uaJA8|^Mw+`{3UxMF##snKaiAr@4y{ZxZ3~a@jWiU$4(oJ zjgIof^l#)g<JmhnfRiyRxd&O2vn@np(Ti&##mG_DwPcI<L%^Ktf~s2K!ustW@BMX^ zrj(lWmBHU${SzKdIAA>pxzh2eT}9t-v3w{J=@6lmSowUdsvAj$C~Zg}A7@1l-V{(O zQm1em;Rp!{C2Hio*LEiA9-ywV>c$Pad>eH84fLoaC*T<mAuUju!s$uZ>tr4OI>Etu zmfmaaE=-$%j3CRq-2=LA^T812`?j}{co{z5M-w!A-}}s~9a$|{4)mS)(_KB)U%W>u zkN1;pZ81mQ6F5NYu};|->g8sQ=Q2=e63X_1<}deDGn!Yi6ldsPpVkr8=F<nLqBM~H zr`h>a4UcV!<C`VcEXp_`%y4k+;rGjmTegMrG%kH=_aI5y@tk*Luzz^<u2k?B+VOZx z^{V5~#{_?0(3qi8pH_pD#Z!lY7cYKIO$2zQa!rfv#6PYeP;uoF8<jh0bPlrofOLe@ z=!&98qB7>VdlCh#FWms0Zs^U`<!r(l66bicJ4J#QxM?b6Qg0Z$^G`v3an22*jxnX) zF%}8|j$QC70VLe8^mHdcdq)M_$NIyesl4H%cSmpdZn{8A&1Y$3<X=4eq=!5KcM1ST zbKhZ}hHsanuLAd77aC;z{3U6Tr-k9xwIW|afcuRxwerMDH?N;3LnL8G>dB#t4l#D| zadhEEN4i~4g;a<AjGH@}VG3pn$;+>nlU!cqSE)}3nKk6~>gRtY+fT#^bs7>gd)yqS z&MWhnzE@+#o-Y-;ROYq^rr)BV8=tZm^oTs}2l&6D2ncGR=#K8+xYoF&fI>t;>5|iN zfB4Gc&f@VrE(Uo0(zWj%ugx<NMv1-HYjhnQqYa;LYBI)JmG)0!h$KCvBr9IewzHWo z42xRvSk`9bTWKsK$KNniQ={LXrBhYS(;l_X7AlBvUBE?W9QZ<5RT}Tb=&XCfJv!n9 zBTYg?)oddCFRktT^9P07yp<dr++fHMLLTwQ!JiK^B?--kU|Q4TP`)}<MO?3S82mM& zWdImr+5e1=_vQjn1XAD*0LEz+X;s#whzJh6IZeI;wlyI2Dn9$np!B%0IXaEEA9ZEs zpU!u-6IE@NL3X*kPc_^e7G)zKpk8t`q{lAS`FCBw0JZXVRDm&2zZ3ny^S8Q+B0oa_ z#<#5$ISj;ML3q0`zrewA@FNSqv@}|j{MQr}JLk{#TfkAQ{f4B%=ek2(6TTWf;f4g? zjsft$`_bf8%RNlHNZ7?F--;ZK7)!y>Ff9UDBLYAo?SYI!Oq@fl_4j0*W2kEkzDH^* zGQtb=_Wg?zXqs3#*;97XnRH=!FV>sSzEK3}(VwCSW<<)Eqc0Xn$foC3zwf^TqxKT| ztpH;Hv`Z{c))n{#1#y6VP@eTOZhIb6&q;+$ncIV!_6DFmRRl9pfWhkX#6ZwK!uz}2 zwm(o(@h}J|Q8%B1Mr><7X?RoDh|>+q@x<q51RsLc9l6n}Z^-VsaL!4l7o>aWcV1A1 zzZ~FMQPQ9GGgO&3wFI@}9q#P)CxYi`JF6teL@dokF<umo2IYuLuFPUUmp_f2&<PMg zHFfnaKs^FZP(Tw6fTV=40T<I9bzt1k%ehjc0Cf9fxx}5p?X#i?+TYD5`GBr;{omPK z7xef*l0t&qO%JdhU}p<@C%{{L>=(jPeIm5)FRCZ#cey>S@Ky8aQfnLta)WTw7en+( zzn(DM@}`u`H~~5;U;|U~u$Fe4512L?Du(pE9MJGCC}X*6u5=fcQl$G!IfVzakOc`O zpq5q%^uq+Dq)?wdi$@KEXq(nL+V6vQ=i8-uhs^sn_%b9y#e&IqX8>qx3=VBo!x7o8 zrIyQ50UT?J9?+!40F4$wY>ENhZ6+ubM*m>bso(r&_a{${?G+}G!BVk>fi@YDORU90 zc%)png!$J1k=VXKif}+8huJyxq!qr9D)rn@X&q{KhTwA!y~sFxHD|2QT&b$WH<^wd z3DG8E2gq2Z<0NC+=g%-;DR{o77!CeLLd5m=zcV1N+*tt}sXKlwVie4N(4Buh1bT)Y zkAB-`Z>3(kxp@oZ34=A5G;9Zg>LN;%LZR-9MEb}`XPjSHR_n>V`t~H>laMC%s*Cd& zBYVTNPrhyIAP7w>1}qbJlVcPW5T(rRn~z}=iL69z3~e?he)QT;C>yi+_y&_muiW+l zq0m~fbt1hamj-%lwQcT{&foc+l<@OIqfeS_`sdG~EUGDRm;q?+fcI;WF4Ax{7{vG3 zS^<u~pnFg`r0;qL5#$>DYI7JL0+v-B%a=e0cKTN(Z~cWNE&6aRHT2`?kAnkhFvbHg zt{fSl5d2ndHuWf?H3!oR*jFB#uB`7^Du}X`&OSej<Q5h60;;cwSj87dCyEiAaAGUo znNWb`07^H5X3Gl8FIoEW_8V%(!L_(ULAghEp%PUi4&^d^p-R)MVGz_2n4oY{cvKXo zVXY&9nwlDL<SI7e)hYVZ=^%ZUZXt93Z#uBnbGJGIkY)g0wgR>baJ2zUd&fyY<*t7K z2m5siu;s{4{Zl>fK3omheL%95IBEyF1n^QW|3LwQ_NX(~A`r}fL^OxUp3UZYOsD3D z9$%t>!N(2jNsipKLqlbax20%GgPgd9JRTUTQHCm48G5?@<gg+%PC{8M_5QA~grBR} zdA7tO#u3f~G+W(QS12PRYT$<$p!rlqe3udscz}B=1Ra9t8Po)DW|=qu-tK#L5adpS z0fn~%Eq~j$4`l9662@E3XH7Cc84aj?PC-S<;#Jz(VgQZRJ&W89$1S$jeB2(DUstJE zD^xWabsy=^A|vPD+^?%&9riFA2wG)(FzGm;<$PU8y}P0a2htZ1BtS&<Whce{EdYc9 z`pxs@l-{8tDO#Vu$r*Be#&lHtFonJPbWb!*)=GdKU?Vf+Nen=Y$)4wFYwI%(^oXLs zNn+3d{NZGvsTTVe%q$?tT>_pfO#NoS#kv)M`bUk&gKXbSQwQx?F$FLX-}^J*r>lX( zZR@2`Jy_Xh%F{9%WpwDZf_kriHS2aUE47)Q2!VTDNbL(0j_)-iC0g=Tlh0ib7D;ic zR8c~@@~ZY#2-bMcA4o%|D8xVCB#uREARh<p!qr#-Baa%eWP$M%CCDfN;*FS>^f|wY zUqs}h2LSx%OK@$o>a%A%>tSGOhc>v)1%MIj8MK|?2VHHPZEtTo97Jabe*L)sT1A#t zR)~NKP^^PQ+*yC}G^RFEiMQ;iO<Hf`hdye1N&cVX{Y>s>2156c+pGor?Ke_C%xa~h zx_Xj%e_;lWKdX9yQ!CV(u4Gz%Lo58!pe7V^;+397b0+k+K`zx~6OwxOdtg4DlM|0> zXFrJ(8y7DJHV_uVrUwNEL)e?Kr?+3=AnY7S09$#IRYobogEjssjq7kGuY<GS#)S5_ z-zm81?x1$Spy10EiTjeGml4vFp6U`9NDJ@SWR3%+GHvBbHDdmFFSO-D6ig{(IZWKv zt7Kil&^NtKUi4ksN}6eH%5kB6$Ypj_Kz%ImKz);sEq1em`^2DJdvI_lkC3%`?AA!4 zwc6MhGpvv{dlc(a;qA1aUtXq?%+y%PxUf3#^8x1>(kCJ!{wGqXIXO8XRfX>(15WS@ z9$cI|mkFjN7?c@SS)TzwsUC0<O{rR<=s$pLPxRz!LqcTn?c=>>%LDLe@Em@IpP_*v zFu$6m>%po3%*ZNGYjfy#p}<9t#7fXeVJSt;2f?R5QJzK3kiw{`vP<5(5T`r6Tb@y^ z)vT$@So|(DGIiXz27jh76my|`UR>DNNvjQGU6ao|Abc&Cf|^prpp5+!zkoE}v+iyX zX}$`E5~uK(c&~iUnY%kl!=-YQylAuu5*3v6uk1EcglNJ+wX-O;+2z37L$XC6z^bA9 zU432~aC=#Xf)E2iI%xRPoAAfu+Blqtn3*OQeVrL1)rxl1%&Xt*g-*a~Wj2@{X=Sz2 z{nL&-6gzZ#f5S#?miC!y9wDgH*^~b{1a3?8e@W``5Z5PLs{ah_S0T!m9{ilYr;un* z{--1XbqFK^%_MftSil|>G(M5smyePF-uUfvdiuQgoqPZNmXoH$JvzX|mVWQHGht`~ z!ouIijj^+e$ECmKH*jf3z+O>-{-#HhdpAGgkMuckLAc-#s8oN)D5zai5wLS7zL#fE z^W0ByE!gPF<I2`OVcsh>@oU^rL&73L2ykc2XW5ujq~NEWx$p}(eZ{4siUZ?6#)?Lh zQ<{kuL;-YWI4lPYR^Y8D{U`j52evGn<t8l`m*c)i3I=YHCp|BDhB<F$;^@oP0TQJe zcwO@HaSb>@J}w7dO&nN*&>Q{q2voWhr%jS0d?Ve9i;}iA-~<t9(MSFuC4b@+yTd@0 zb!%jdaMvGO?00<=g3>!Yv=>QT5xA4hIS$)Uhm)&{JO6&=C)gISl3*;E&`gVzpmLee zfW|Hxyy6=cD4Qci>tqr<R=dOxP5d2u3YKd8m$@Dk04B)^en9Bv2by+S;P#;qLnh_< zyQtt{C-;-)&F;USKjE$^_ka;Su^S+J1N!N4fD$YY<QMnH-T1F=Kyh#z-Ewqu<~wid zy(p{>9FEz&N|`hc2IT%4D!!nm4^R^-dYj|SRER3yz&qp3Nwc~=)vI4MVmfBgFcXR& zD5^e9z*<*oiWnMIYI;u}43QtlKTvjUn|sFQ$jWE-If@VJhb*ZRi9^brsZju=syKc9 z{m!36Sl8Xb{{>ocph0E?nmbE?!_u-lpjUDv4vemVZ=F4@kb2D`xM{ykP^(1s)4sd= z1q3aD>tMlabbwj1nN@GcmuK?rW&`&D;|dh$006UO_!JBjlfBl6oXH}6@mUf?FvrPa z&(2Xpeb3o5Qi7!s)8b~YTG-A|Z_3m2Gog+Oi4@Wpg{WTn6pok*)A})2h7;{Kfx)NE zD7cc&`GLf2hsX)SQ=Ep}D!^xCZH+-OH#V;O*A+QV-n3;e_qMNGCoL_-d<`Jn@C>K& z1XwQJc!^e6G#ufB^`z<PN0+$Fm^oemMnGKUj(!o%Jo^!1qOnr*?sD?o#gQ41Zh^*d zSC5i(W&}V<ut8d9UsE??{JoTkog2a|3^o1tg@D!EMm6Pph|j*K0^gk12#4=4`?Ro` zYhh1pIZISO|DKyoUHZyg*&8s7)u;(U7oS;1Ct;_VMd&P&*FxM?UfJ-ntg_1%f;wt> z$TKzEs4&DI8yDC4r$;O{E}{E{_~BIxp&UmZ$#k{giJ^<tCg@@TOID4?2TZoF$NRv7 zD<ESTJy!y>=VpO}R?zGyIBH^!+Hc3VX~ZfYBLPTeTJ%f#!e)e<2^(7j@-BoN>K;r_ z^X$nLo)A6$Li^llVQ3WRMQEALhR<ZcNJYT4;B5Yx0Ws^0XXn0Clc|1R+A)oe5u5FN zW6#(%CSk>)T`0{lzKW^x-wSG}I5J%VfUl7NcFX@%05QiVCsBp9vzi;>y|J1KH>t_5 z*CXLn8WM-KB_Kb&im_#^vNX~sFl$Exn2EJMXR=|Hp_&_jk$Zp{&c^WLRfJ6Y4seVc zR-Z-@u+M$L{?p!e+*Yto8A3CRA>BrhYoZkwWWu7M>vfBX+_Cyj%kl~nTV_tsNGb_6 zrBZOFBc9xSz0*j(>C?rEdlBo)Ik)3jfs<#mP<wBEJABAn`GPU_NR@%wZY-D#DBhpq zbf3Hh6RiLWk7JXQ!!II@$HdePH~OMY2!Ue!N`e8dY`VSM`QA)J`AX$O9}}41cm{g2 z@h4FyOF2wTw=W9+(IshDS61@710{6c?Im!Z1xiUGK=3=Qg?le=b%sQwfNUsy?Jm)P zQ-nAMbzmD?PqYk9Uwa||GpYkkbPVUJ$l^A7yF2+%x0crT3>vZ+FBaU0sm}*4ehbcv z%@&~-2b8?(+hVHux_XJL7Zb(a-3Pr8R7PqUKAW_h|2<CtiQ(#QBRHEC1eenG| z10eOlSq$(-{&!DG!a?S=aKv0rUF(!&fTsKU3{J6_z$a|jU02)T15JhPJ}|kdXC;hs zDY!((R0LlI@U$Jy0e4>%gjb?{kTll0ZI7{uNM8Rb_X6@GVs``;4t_oWbE40?;8o9a zgZ-WQMW4^)4}ooBl=Z~lI(3MFKowtha)|cckkLLCA=xcoG}Y?qlFDM!-Nmy496rF~ zYdkaABV}C{>bPa7iIyjjTz1K{-T4<$HseaC0FWb5z)Gopm#3`^e~h&?0&*&vu(c0X zN(I{BY;}gl$SOTeSEE)bh`<Be9X*Av>aM*`k?y`=ro><cc#=&;fPq$Xn`Qu>tNO1; zIh+!qu~P54Uj(`>-s`}kHx=l$H63c^F;$$tLXZHG1R}I{5f1Q15=?hdj|4NE*psPC zlne?k6(GzIaSm^<{gaSaVNo&s>pwIR1m5aYwOY{WIfZzwyZ<r(lV+^l`>m_pGCuK& z0i>=dw?1tr7ik*PWlmj&+s$Al$`Yxc6d$WZ$oAG8$2v;_h9mgorHUjTFj9vnIbief zi-@D`eisJ)sz@W!%dO}Xjxa%nTws#c>~P=g)v*H9qv}8ed*2NlUuhM-Pdx?PSvUdX z^x^hz&<$|f2;ABly_DKGUh5ua&m%=JOwx|Ao2YhONI&McfMaApZk{-7$B_C)62Cd{ z8vzRRGpi$g>rfrX-h)qXOkq!wTJ4pQvaS~zf#R4TIJGi7J6rh&x8DG6sJ-!tTz>H{ zK>>->YP`R!wZCV1N``1jNr~w(V8@lKzV_<CoB;kDfa?eMNd$wJ)~m=3HS+ng>T&B` zYs5&zMMUb~jl%bmQO(Wllb5rLB0@rEj-Y?nXRY5^T?(@^Qt0M?T}wp>PC?+AYWWBN z8)q<9=VgQ2lJ{@GyUREkV8YMz*qK<%L$HL%InN5HAiA^wSt=&@mpn20B45Dif*&S_ zsKVla=6z=-n|Q=@V79xBx{*xG`PziisNC}gQY&Mwk7pDR2t5rvoZGkBT<T)BH##LJ zl0$H5`5dKMCmM~;Usg^u7oFjHfk-RdZJ>LI=1K=m><mSn=-+Tx>LCIVqPX0m8`#$Z zAQme4A=GdLXvRzULfKzn$p%l!OG?WK3DpDuAM{&5Bxx8MQIin?&+g#pc(pq5;${Mv z0R#id<+BqXV0RF3$jY7vLS63m)>eUFdKjR~Tn{!iT^9lVNH1K5;0GEtiie<1+X0b< z4yZCCvbJcn9^*j&9bm#h+a&w_MQLBO?Mr3rp-sZ1;hk?`V5o$Nq6w6T6}lJAsL!Hi z#AlT~G(z$`Eix_NDD(P$CueTjBX2!g;Cqq?+93O}DhYRaj2ykE^Md}*5PGFlqRz6T z)?hZv&-zaim(zo#fx?nAIaGIufOFUL_eo9N*MHRqzD^4w5IN2w-Ba*5$L(ut9|8c= zQ!_3W=Pwl%)q)WGf&Kmc$9Hyi0GW5=U0>hxOkj+hzV&Xot#ZT=%*8PW?l^0`pe0KN zMq&U-Uv~r<fQEQJXJnWOgX~=huqwf@v4+AI>^R8pJ6-WdcuHQd0|H3})(1Z{9(!CX z#C`JGc>1-Sf|lp3jGybi%CAk4gz>M<#cZ4#A21h&VRmTDhFd|3%({hXVxpYLW#dy& zI`;d5eeC{x<QQZ}TGKmxZY1rPp=DwNL5WJse>Lj(*Y)9$=$%fI5;HZIiXbBJE|}V7 zAgA><{lPu#LHj!&^l6UAU#LWC391XdGSXib9);PZ`*!nVgJ-|(@9%#L*Wf>W`t;-v z7#CO$R6}eaow@)gx)e!5e@$p&d4MCZ!M(b>Tl@!Tui4!Z_<YiyI}=mL=y<$vHw^+{ zePI{~U*Nsg3?Tpb2rTK1co(9;cBnm6foVIRp3vWQSXTiF^eaS;8I&j+T#mWL>f`iy zdOROCu|jUNQH)RYr0DJ~`bI`Rb39sUx)w=c&Z+8!12V?x`z}0vwz#65*#^fgI2{r7 zj$8UP{(4enuP>t+WtWCMBV=qbrjQt$%KSE#iF;Mx9<`EaMM)c2ed~H@hE`jz%qzv* z3C>0D?tXm5ZQM99^!E3+Zm@BsSP+tyZhs5R;lON8X-Q#WPajA20I>`WI$8>fr<UaQ zAWriFc^K$$5BGx~z$eM)5Pr%4m&8!lh3DY6O^@pj)>VmPwt^ei{#Kw}AJ5Be%L)V@ z`Cwn<Z*P<3r$L_j98Xk(%3`qi2LeLZ{fpTIf*Q^f#NFg*+<LR3Xh=UU7pOjXQ^VxG z8^(}WLHF2Y6QKwd$2*aNmS&|oijF9Q7+aU?i+uL-4Rp}5CkIc*ZtThJ186_x%(-QO z0f?v9)Wlf5#th>lNVV?Xis=&*zQ6V{K4n>F>&Xa0s|o3qECgh`vZ&U2v51&b?BpcB z6*j-m1BKJ9JQi2?kkF*|xT;}9konoT$3xB4M~(p@^It@o_*Q(G_N<aa;KWCL)s#}) zV9NU@C6OBB0_>?=PxjHVHTnl}K4=7Mc09;Y-zpH?m77@9RPhA5Ms2)H_mZzOU9!(f z4qXW)V<mklyC~~WpgXL)fPPQ#GK@2hl9*XZ6EbfXJ@<|+D`^&OQ<D1)F%gs6kIJlD zz-I++2Y@Y~maq3E?kk^-kw9cGwWxqO4#XPa?4L&<hMCm*P5wchZMwub?yE^Fq#OY9 zhRQDuA;U+;KzFbGzgtzyu}c2(zH)h<jaI>)ONDVZWx--E-;Gov6A8_7FCCMQIcsfj z#k#9mxppP!#YI(dMc}8lTAw*F7DCkhZr~DSF`u<Bp-k*%g^{hE+N(^T5rMm?n)mVL zQ$GH*7M*)s62xg?XBd!`&vEl>7*+WTACC_?`{4ZYUK%asRf`6=oLLpE%R6aH8nep8 ztkoHqJoML9H2-;o!uI?Qi!AkrA2(gIHRJ28Y{m7CGwLO@2J5whq0uFszlD~HMXA4K z9hsOfC_*KyrTscThj>!#;Dyy<22LDpw)dcm4W%?t&Zu$|Q%B;oawfVllny7)d34;s z7>uEmVQ4kRg-6`!EIs2i4f@(v8CpklMX6Qtnbz${Rl!-L__LTDhpl@UMBQuKqGVf& zn&-&T{~+u*kRDVlL}qrMJbERX8OsG%Cj`q7zxuew5i?$Yi^ap?{&Ke%%^Znxn@xVo zz15BT*3#$JU$atM$hQaexHddCKOTaVV~(5Hwh6Db5%YJ1Tjer6LC8816jU5n|DHi; zdL;6W`gG}RhlfrDh^%R<TPhwr*c}mCoLlz|64(jvU@Ln2J>q)jgF{t}rG6=SppTG} z`s7)Ef<_82cQH5Wdi+in5!=R`{;wMX+!u!6{0>FS48+KO_VX<k$pg|rHT7)R^H3f| z$^6-(x$#dN17e2dL_SsqQqCjRU2g~YF@Dv*^Y+d_USrX?vRgmR^06a1{>@rkPata* z44_{W_)VG}yJ<0Co6ZT)?=bd-`h-1i1VtSw8nM#33|6f`e7ioK35G_j^3tmjvm7Gj z3Ws3G{Xnbt>@W%o*I&IczDlL7{aJ4Fl<(gv^M#jsX@4oAKod!WHDysIzc>6Po*90< zRPBFl4_j(mEb!dJoD#{4Pkh13is<Eo%7F47<IvqoIJAcUBr|>1(yI}+(o0XiUGoi} z>dSjohhsjCS(YP1F0@OnpA_jN7-e`EFnaa>E{*s%sj|>K9Nj$ti=>9;Pm&%FzLmAE zp#<(dgDFM3NfKumX`Tk<+iw0v*VlIYvt$TtX#E5%*(RyIWIstz1*hW;yvdBR;*OMw z)s>4!tg5B!fBG@J5&b8pHt`-G8wH9+?0>@$iRV+`$yDv`7{dPItGKZaGCc)Z_-<^A zMKdXlkx|F0m-KM?+(r43vQ&(%gjU7EI`&Q6h8{=fFL9X$&ZTC`=7VX0ihn<*TyvV| z%t%?f_*~4sfG03Rke-6bqqpk#5ynk#MW<uv@NIAXboTrt6II0`S)E4OQS~k{*Kj0c z_#=<*O@>o3L&l-!3nN8mR`wGVRjw14;F%qRO7r3^hwXAxwSaK&AxBqpu%MnlB=Xpt z`kk=npR;}B(ApbO&yJ?Cg2<VErzox#pCvT9kK3QWAhcR<^gwhR7X4mkyiqKj==YS- zkZkXMYtzOoN_;(^_H3QkVhM&&na;C+oBNXOtYKD|*7NVD7<!C#bm=GmyYF~J2|KH8 z0w)Dd%OwsO-4l52&>QEYj!S4Ovv|MWi;39H|CRic9|R{R`-3h@uKUxn-pRRM<PL52 zVdF&o+^d7-LCav8YES3UsW%jj5ELhhD->A>&9TO=@^S4siMSO(U<xDyr=gTKqmdK= z*q|jNRu+z85)4Vl%p$z)@ox*^76~)rq;z=Wl45V#35b)eKUU08Cc(1!hN5ZGfBa>o zV#c-RqAMPZs@?BwpvaBYDX@W9m0%!N?m4xzZqZ|sekc03TB2bL*$;I~smKaF|MCoy zd%kKGNiV*dG4*NHX<rQ5<_3#Qtn6Y?vNu^e1kJEOj!$+~yMg+tePU#n?lo6(cg#_N z?M_-D$N?x6lE>wW@XfUQ^f>7p)qEEJ<XxJt#%CIv610crbHC)6=2xeJ=ha{?1%-c> zD#W5zzt3#P9LIk`gKJw9iWv5f%140-zU2Nf`}|I1Js!5+bkKqf%dgFD&Y)M2L-Z<J z;4ykJ%HqbNoyNVTIjzKD6BG=t0w=$B`PZ4$lG-ie|73k?sa<HmhyKPjpU23?UgnWP z|0bBLI6<-R7w6=)kD=XxwKQV2{&wkMNEn%pcszBjgg*4OQIqWWXZo7TV;Y>7A11Wk zTGdZ#H9(Jt_hXSTFtN-9FtU-CIi#?^iQE2|puzX{7%5~5_teIF7e$m_SNKgV#`h_r zt`MO_S5FBv!^?Ub_Qzuu+P@xbjj+q?bIuUS>(c;#D2ROYh`O?Afr;kN`ze+}*-0mp z`V}uIBmR4bfGVGoh%v;ZCj+b&MWT=cj{FTyR+GOZ$2q5Y*wF^fqLXr=NJVcug(Cj@ zJa1Mxo+bW3sqz`HX7jYk=(gXqb{$R;)k!c|ZO^1ib<Bd8HC`Q<j9sO>ZXZ1xO;(-5 z9Uc!*xp*46l3^i&ynH^wHym7SVTG~b9KI8xNC@@pY{}dHp%YFY5axnF+b2h;=Ym<H z+CaO+ZDmf%Krka+RBs3UtC4==!ByP(gzo3mL2yb_=pZjb#{-Z$2`X5vqa~ohcHX~L z(S#M?LLu=QECwIrLUQ6W?T6({B8p3$CA>_rh*;w{Ln{{c`Vcbcqjl_H&UQgL7pMnl z$D(Ba-2q$YbU1w^YxD9mtEB?nm5|z^(?42aPmgs#9^AFr7T*=0cOQq2Yx47VttY4B z6RY2sf;@F{N&n=ymET@qL7Q>mF-6i91LjGwBu@M1gwp2B#wnw;zHAn|ywsGDldg(h zfK|)$1sjz?0WXfxWAh`SLZTZ2*fhwR6fpWoLiatKKnfFDH0iNtPnK~Bhj}jaW=ZpY zo)55%sQ|&?d^m*P&?w=;Zm<j|q)zM6==)*^npL*8d|*?wiTXrZ{De_sE0<U5rl!Yg z3M4nRldJu|N5UZF2vq*^SwV48xY4od)TQmkw`032S6%4I3o^FSuQZj9t(GO&q9V2V zPoTPAuFXWF+v|0Ba2`mL^W)`8lS$e|U63d5MK)eZPA#mGEW*D&APK(nq&-(-M-a~6 zIxmY*$i&{X-Ms#l)aU$%l+5T&skf2dn25#;|B&9?bjvG#j%muh*PPB`VpG4bJeu$E zX1GvxMUGXDK)hi9{R<SUZNVa*R|*9^H!Ku3dOOV~zO{YHqVJ8Ke*NK97_enrT5qya zzMOjFr;?GrGH=R;+xgdgz3VT^hvKMyH}A2;KH&SJ+K^mWCea2t2>plTLvs#a@hH$6 zTGF#0$7hXe{o&zO!m%bfk)m2_Qhd=vzZvMpMe=Wxd-IP?CVrPUE8vwyk;`F_qaiMM z$9%f+_9}_e<69NEFN8Jc9qAC@|Gc;VWNYWSpuiA3(7B)ezZWYA@%-mb$KOQ2hvy7k z-y8a}|Hbf&r7p%tsH({KY@p%wvz4aK6*#6b%`~EKjbw?5bfEd*rO%e&L3|Yj5onPu z(4l3@KvFD%hY4_Sw-<EKo>#XOnGo$k7pq-u8FnUPje1Y2ELcrs4EQnx+B9yg+~uB6 z#tqjSHT7+5p>#aUVO$T3u#k*uR7<6Y$+1QnC+CwpvH2|f;Yr$o(+(LLBz2UtOvUN% z-LES@Up^NaIkfB>J8c(L-r9GQz5TH<Lqo)(Uv9l8Ul?t4PG-)miCBV2!T&iiDQ<^u z?;#<pAYErCsX|EWUn!h#BLD9_F13l4sZmi2Z<#b`&;%o{&LRsYaCUfKd7PG-o{xjo zUM$=uj{Lg93%V^csTEp`>0+$R#T&b|8!k;B4BuuLf{=gX8|^_C%$xwf-5G-t<}Ow4 z+cC<MtQ;CXrF_PI<!URZK+W_{6Jqqponcu;6Z(|kuHHprVK!qu?@Q;Gw*TVA|96?( zOh>(N-iLQ-Rc&HpDd*E%Xr^Bu<qtW*a}cTPsBvjUk<7=(4As`S>G_L<-n`9?>C_4R z?=I#x+B+`t=T1}+spUOunLg;~o)1@VR^PM<UWnuicyGxvEZ(5SC>z4^*<Wt0?x4)0 zJmd2jkjjX5rt){J#g+UC-g1CukksDo%U6)6R#O*fMRV9j2N(<W^WImnCV}O~#j@9a z(U#ikR5(xU<T$=qYPFPj^c3D#?zoglGgx0#`gw=4m$8RR_}m0M%UxZQgKw^zeXSLX zcVGZ;2VyhMlECYqpThU)zoas2Gs%~wy@V+=$)t0$RRu+~d5A`YWf)F+>YFW0py+Yq zKeupL-s?647lBglX7&d>9$-$bT(Km9q2xY4$9uV5zW9@)W`;%wTrMcu^DyWI$Oh}1 zHGQRj*Uc|xz&k{la>(y>&(edSvJc&MfhF~YkQ^d2D?QjR2}-F04hW1MLmMp8%lkS} z45Zb=2NXz~?4*JSdQ>rfpqp{AuV&f=eJehxLk_*{d!#a+nvyr^kaFs}jPsNhG-D#R z^E51DBHFmJ6PlN!h+CS>K`*W_N%f$|lg+Q6d}~$uu`L9nS6Z32NVs|UO@$JLq~~3% zkCn(@<eN8KwEm_{&a!IH5`yfg$M-W7gP@cHCi{IPMtKrHu=JGxG`l9JdguxvQ-76Y zi7!PfJt_Mr<{iTvZ2=l+-z7eL@1Q+|-}RJ}XZ7H7DPFI*8K(`8Knm17LhNcm1X$K; zmWWq{!_;?D4Tj83sgVZ}+s%(g)K^1#`B_<R`puOOm6+yN?bn#>huF^=O1h$66@E!C z2Cq4>Jg4K^*ngKEt`sP`s$PCY*zJd^Uds_HmHq-#ys626s=WEh{)f1ZrFqx=Wy4VN zx*KkU^wC@avZ^6@mY1e;Q;fW+9CgO;arTiN2(8&d-nY-NmRg=J^tZ>`K|#kQ^1)a8 zV*DFD2GW|F)7Co5j60`rX7OBua<3^vu_0-_#)aTYiAAxO`FS+rNmq(&kxMf^g36(B zTb*a8zm@=1>e2hm%O{^QES+A&Hk!^OG~iaCJk=otA9Kq1#zAaZ<{gL>ngwnS=@CIO zHma@W4<#s(bKc^SUd1R;kL?m6-U2!0Od4WVa!tvyo73YpSD4m`Xh9-b&XWWz);O5^ z1w(midWvbErsteO2v8_6ZuWO)!14tb#b2IUO1hsJ-c->PZk#+Po=P{IG#a~Mx>zuq z^^jMnqj!k+cqQ)~%qQ4Up`SsX;c3Sh7_ggyjRC4SocnW>{fahdVzB)WH-|v!1o|qn zvaVPDi!Munk-YZj8ylQ@X5%Qz8z;r69Xc9Gg?AI4Gg`zUK^5=45#AaLW{j9=o%eIO zz82+hK!F-7J}z$F*RWy05SFK0WuII|G^**hXSkVH8zxmAHitc5Qlh8CX|4VQd<*4c zOtFtv-!9}ES1}g{H@Fz3LH$ZJ4S#xu$UTQJi`}0sEWzIy#wyPevOGZv!|cofx%QJS zJb>F4Ta@Yu+xnok&)KLL-uVSQrJL5kC_?L)oAL@%y`>T{aEHJmv-Lyt2~c*q@86*R z@4Nb_G9gTmQ!lHCa_QYZ7*%(5uD2jkUdEA8NXGAzda2(t{QKo9u*UR<D%!c(Vb}I} zDhglAwP5dAL!+kGGdf7F!A?a>UdII*6pgYq<3nO-m6|*Y<(;Gt46XHcG?<Y{>f8<i zA?`QytvQJsOu-kT`68PXi&JZg13ERjjsg9x5M=h>_7I#{J&g4vPoBwIs_l}~NgyaP zk?s*AT9_qZ;#R2CDR6>03OKpcRuKjnaCVd$1)?j9lB5?eX-w|M;8UpGY!~lmN`WPN zobvpJbg2?)-k<I;JH5W!Q2)wS*I!ETWmL<n^8?enW;83p+_OX7Fl&+b-nQ#<iTYC( z25v!zxG)?^@Gg{)&27fKJD3gZZa><Mk_?N+7_?b;;Dq4+s4!8%SgUz6vp-GBD$d4K zSf`*L|4NnQdOY=f--IhtkVkN8;omsP#D7Z~e|ZdJO25amDO=1j&m`F(=<34c!}Tly z?Q_>sUTn8*q1Q7uFPvXKEx|-Z*c%&S=~mVC8Fgj!HYKYtButjuC;dL*lq$$fe(#lk z1ERa_YNrV$)DLaummZ6X@e`@=1BLcRNtizK3J1jcJ(KX)ajz=0)t;(p<L4DO)a*y? zIx3x~R7x>j-LFoG1F1T0dNzyi#>9__+G^#fcfL-zMZeo6x!K1!pIfFMkPT@7!H*i+ z=XIA>4<@D4@<cwFO?eu?EN8T=J!uN#db@Na{d5)|Ni7Qjfjr!Z>dWvyq|9FIti7R4 z;(zu21E<8pL&shNd#B<Q;v7-E)q(E3f%~4nai{vBIUVuO|G#&OK}Z0tu8!VV?W?Ld zSo=x-iXiK)-0dRe-orAtIi>8P#bnE18x2)Ia;2{t27_AK&ww9SQ93;;dNewAOpe}= zza%|OFZqVNMyFJf^56P_N!|yTF#7im!l1T}dso_T!ugf#VWdp?uhr~bn$ZCjLywJi z_v(OTh^J(QZ9oY&t9FbGyq(?=fytTB<;vmG0v&4j96wq%bwO&P@c+A*%9|s#y{c~u z#y=!K?(u4rbq`xk6kl9<&s$WS_~*zv)ovMb%b9z(dT!H1-5~5lCuu~!FNEEhEj*e2 z4r22E?FF#SRKzb|pQ=pt%)aYQ6^@C&O0?T_CMgzZG5B(>7iY&!%DmC|W*5CHhUR$B z^hIm+t0Mnv-TTR1#b4h9bIjh}d%rb!1&U<C);##Nj@MA=8+7FvG+I9@T)TEN**Cbx zo<sIl8}zu*p$EV`3A9*{sj&UFKWd-cZy@g&k%;73>R^Rx_gk;0efyKK{Z_5+Y?Rt_ z$@N~lYOwWgkKulzl1CTca^jn4&os)Sc~02COCT8vS>*vTECU#RK_LY6Cic5xKYhW% zFN}ZFd*WWE`FW<&!)0+~4!F)GZ#1Mj0?GHWn;S@rwLtb1u>Y^20uxn3OgKrWZuB;% z%Jm7bgnnZZUFV%?h6;tKAI}112Ull=PD7^&bGFA{gBiwnZmOOHwWLZr#NLlXeoRDE z)mc7X-qp{YJO5?_o$FG?#*v<m#_F2|UHlgzFB0oIz0>MChiZFX@$Ma9ULDIO#s@dh zffax${nd|VGAt&bfy2x9&#&mJy64D4dd5t8Zjz(+j`-0Hbvasz$MXSp-we)eP-UHL zqHSZe9k6`maPszvN`k99KGJ-0Q^ZJgcIXlAsisNljV=uRh?RmE?7CrRj*aY)M3Ax( z8jUeUcw8?B$$i<0t}By$xc6s`caxBWhnCK7lxN3a3_r!qFy&a~RXbs_tkrs`2NLR! zYy?XkDi`MnO2c;!Mb({5p80-b>}QL`DRYBy2gy+gp&~{W*>7|<ZrOPi6WdXO-u>@e z|4jHdWpqx(6uoaek8WgA-J@%@*m!m0llmliCURw&ivnR7Z=|v(Ih*nHZ;Rsx$A9tD zqZfHMM-8neJN3SLkX$tLkDwsrxq81Rdb1hp7q{O!Tla>Veb}Gnf<?uO+5W=%n?bfi zl2}!a11mr8*pf1t>3x4_SdB&-lh<2T{rYyv;x`P<mZ(yLTIR&fXHE1<s-43)An8D+ zQ@h9dX7m@@=3-W|jiYrQqR1v>m=-t`N46&$G*8SFH~X<!HB|@g2U6D8ZKAUK!`yct zQ%|w0UAYqNC}bfP$AZxRdx0>ACzPK3zSYooY>AjKdq~0dv9pe8{xteqjOSjoL@EK= z@xGoZPkxQOUs`A-dU!tsW)i1OjOvDaV)}dr*(%r*KND7s4uf=g&9(Ycg}FR!NwH<V zGrU}RnQl?dkzN<Ri(iGEQiJ%j+M!6ilh2^Vr)a6Xi}n{kqhiWadQRJZj9z7`&hFU% zt@l9Wadtu!>37KnKYY1(I6DP@4WWjNc_SSC>*mzTR>4^{*ZjesW|G!9YGWNLbS<9| zFN#s-JY8YlAtHdWj4a6vUO3Cu>pjKeQpQ6VU9KXBxG_cJ7$3e)>fGB3ZquW`2neN` zKQRLfl91{)aR;U{eQEx&_rTnKyc4QoZ$1w%>Zm|f{x8{W!;$`aLm*kA#CAe8eOmO! zYq9xPwf;XMSspxKW&CgOm4!S5V~I}vNWCk4u3JDA27@g9Z_zvP2fJ##z2@ku@v$*a zUZoDUZNAO|$^Y$+8xqMHr4Az2PzIG@m5J1CtKTFI8$uo@L3RPB-ZpQzS;{>-bx(gm zfJ8f$r%E85L$y9GRY899mep9vR;5gD7HdX26e)A+{~l8GIF?b#rz`$U7uhq=jLX7p zzb~47xQdqu0Vy}1h`nswNR9(Fgd9O0!a&&<k46KfVZuaQH&l}q)Dd4<%d#&lyx;G# zy*ee5Qojt=e<V1P02#PqC%Tpl%z*^jOg4jkTdow#Ed2MDFcV`zx4#Lcu}53PD+)j4 zO}B^0hyE(|7NrctCwas!3tRSqbHA1=2)qfel<xg<;xeyYTP3KeHL)YylJ79HkNlkV z^D)Ys${T&a-Xc6Uns~KJp^*3hO}U@pOJVv+&UX-!Bks)-D(oYFO^H_+WHjTkoH1N~ z7@oeekK5=FyWPMR3j7$Q@MT}@D{>+CzGR!n^Xcm{C8BhdXW)F1M6cBG{?elZ=0FOC z(3skYcd`uCmD<rDI7Ol*xVRDNQLJo*PT-;uvAH$W-?Xx<d#Jc()qdtpLpZ5TQ<5+j zB7f1KO4OiXRIsJ&BqBlj%K216x!ubbg^vL+mRF_b!4e1T24X8(T3WZ8@2&nl?jAiT z0`vn@cYc^89i_I`6s*s61-6Up=MlkRA@{>s&eCFDB>4dArv_|J)Zvvjg45b9lXV_D zwuH|h%+9Yde*f=^{26|)F^+D{LrGA};(KRtJ0^O$j!dbUN(4Q9v5C-!-3>gDR*hb( zhENRItaxryW9~VS36m-m;I-3Xz-kGp!!M|Oo)e&8swK#Xb%j&OYo!`cY0Z*^X6ble z#oen<7p9b?HtZ!2iDFGT@ttWVA{Tu!=7}AOL8_1(#h8*=^;-JheL$`zj#>89YQ+zI zzf(o>?Kd2>h`C0VN*l=`WCYHOpmsyJSvBnH9qhzIqdGCZlx3x#W~kW2(jTH$j0U2N zbHYGrkFGe3xp%a3VED5{N^eAIqDV$Q=e<}I<8Waf(Ho{OmQ_dYdVH@Ih)dZWG#zkH zcVYKG({N^jXP3V5@tM%t2TiKLP>?G=1fq^}gUkJhc)qfJ2{R)NBCu;QUseh<S1p!( z%SW(Qnmu!1+|y9*XEDG1+xSSLESVvf@^0*=I6C`MPV|lbi#*a?sS2VH7!oGFIp00n zH!Tz>QV2eteDF$RHO+=by4c4s8VKV>L}sa`NDbp<+-&L$4~_RTi=VVAaYVeQ0(*Df zDMEGr3RNwqXeLi9qOi>L3KufH)t!HpdqXIE7H>gNz<{A3(NQYJV4gC{v~J2@Owkp? zLM-^AWBum)ZWi6Q!WkM$f6moddeu36;>}hF*HR}_YaDxmx7eLKhb#BX@KaX6Zm5#1 z))bD<0X)cn>!Hz6D~&UuMG#?>X&K_eUM7`h@H3E<el7o!W>^9G&!sf&k9r2YRMeRQ zm*M`X=2{Q+u3Qp%#^oi{cG7NI-%T=8WzUA>!&j?z;L#6*klg<@y;Q>7m1aiOP)oZb zY*oQiKFnfO(&9PJ*{aQuo!#{~_mSyVneL-Gerdxmqz;-(Rn&tzWNTler9gDiJ;b22 zpS{f|!b=Jbm-v{--}L_X9&@*Mzs3CGB3<BPDqA!gy0vT5ko1~JeXPE?2Xgek>xLN= z#D*Vv{yxm@SN=lMQ&d>t^9?&i&Q|3@zpM`Vd2bCXNWF>Pfrpqx+0|#ryVy7Ta(G0d zgx)yCpHfo$ho_a%lV6hZ4fsGAXJ0Oeq~#aoG5H`z^=?CE)!A4XV;;!fau(7btG*#k zp*L#FCgQ*MVq*Mn7a&TDC4NKavzD>lu<yXB8qFodlW5mBQoI_63I~_+E^|dUc@6%4 z)0-9vWs`(@rx>X1t&+BNwh#4?kS>Xl2K9LC*=+NMcv4+Cg5A!4wJPgJ+Zt&Sd{j%4 z;V5(9U7hBvS6as@5;n8p@Wj13=IK6<12VGVYLvmIwSyk?usYU!vPE-n?<Fx-Xyfq5 zaLKXg-*q=sdg+}g2{`|45%j6ERfR?TW4^`f!67|?`7$gPj17&xR|Uoe)i+nZN`v)t z=L3wPm7bjl2hTA#*b21e;$WcxDMpmGPSd~Q2Vj5mq^1s=`SwN-G4N?Ya|0<DA2)Zq zGlqN;+iM2}8mf}!LsTJX4!sXF`jKW|d4;PdMkT_%IXlNgbmve9`B10GVx42I$R-c% zi23laBm`<>H1O8i5%_GGsRJpBb>*eL#rnk-6A}nEaL-(5{VQ-5SW^i7Jy+`1N5DfG zUs(87Nz&=u4!T&_tQ_T?BfHy93u5H?Y6$p{$8yib6-8rp+SaSS;O1WvGKr@!CYyX| zR1>MM|GL;&#~6)9X;$EwWGspqW1rYNB9AI<41yO9{Ij9)S)w5BNWbMzdBUYc-(g^E zZ6t0bqvf!hkEDZoHZU}Rc498En@m8jB*I4$$oUbr(AV9r<A9thRkT&|yr_j5sDP1| z0Y5*4OaK<Da6T&&I}mC7)u+jLaEs1rMej}0)np~E?tLXY>NEEK%MWo?z0IXJcmvb# zcgJkHD6wEG8ZU1TXC$(}@@NxN9VOSU5tQxeg^+(p{{+&Uz~g!a_*x*y{qiC%qHXHn zd9Y!svozFQO4F5sVN5I)Gu3$sjfhBN&G_m2y-!MlXbpPvZDIuSojkhSkVv^YR9uu( zLPYZwyG=VDok72h_d($X51VeWQlRsT{z@X3?*}#o)GwL;6Xj5f!r@S!%9CF6VpXXC zd9Ci&WQ4_a<i<ecpTq9Mx-ixL7%T+Ju&7c-3u2YBddkK-)2~!XSVkCaW4o89Z?L)O zJxzZ>P%sgfRsQ!f=uef=y4MLwrM;Tvku5apaUIqmQUPf*U3DYf3hJ>mC!a6n^(~MW z#Y>LxpLgmvx+|k!&|XJVwZBVC@U&6$Tx^FmhWYk(M{at-?zAfDk<rah|L@AqJ%1Dt zmXC~aIF0%?o~!_`C?~1XuMS0hBCUH*aB{5fc=m}pzM_tnlrlo6@J;G%pUo>L=3x_Y zr9|OXxfsG4&38*v&0Lxb{jVXphpTxJ|0I0~m@o)=iVLE5QgTtZXNiUJ7Pz#M4AQd- z`&I%s@6D$G>HOjuF-MX%zq*cbxQCajSyQWg_^(Pghu-RDHaSry*@-}5WGn(^!DDT? z|GpVYREoZo9_;7-uH1~RetDs!YZo~}>kwL%#||x>9?hL#S8|d4CgY-Y5DY7r-Zx>s znSPcmgQ&EG*6TKe9^t)>U@rcT7;<Q$<8DMj^bvyeUbBRj!HW-_zx8@kuX?}w%nXj+ z9hJwz*^$VyODk%^=aIOIWs9&RY#Sa-=Uu4#RKzNW!VOYuA^}Piseds_j!{KM<w68S zre7Y}g%HZs`Si;+K%*rOFHq95-&|LS;FJ!zKl{uv#igMz<JR(`j^%>FNx&!a13bE+ zK(kRZIWwS_Ebo4aIqOL(rj?po^%q)ua4qS!7hj~WuBHyc{`@~gU1dO(!O}*$yYm3j z-3ZbLX^`$ii*$ELcS=ilcXx+$r-UHV0@9`53*LLb|D0v_nP+$BoqcA;ECkKLM?G}} z#-W1~bEMAYtD;IA*$F-t=4&TH=-W&1Jruy^m)TtM3Dn}BgiwTrB54rdNF2m`8q9Ic z6y|O5RR7D{;#ewhyd+APQei8Q#tAPQg*shD^@IrNK@0$+2&=;<u;T}^@2t=dryA9b zMfk)I2AvJTeZazME`AmUccpo`+>Z{XjtJ(hjvTc|fS`-?@sYcQ4>I<vYKpeza9+*~ z%-1?+r2!3r?6z7H+ey2lRwUiHLmlmS<+@4R{Nuv)w=PM$11d;p>iKPfcc1`C{4uOW zw`%PUl^&i1+7$wCPbwh{$iTk|#VKyz{C=}PW}%G;u6LmF74Nr7D}!|TcDI53DTiWf zrt&}*`>KtA#tUq%Nt#n0usrBk22*j=x4?13iVRiIRxRpRH*9o*;gUox>bJ`M!&(S& z7Ws?{jQQI0>}vojV_nMSL<c(tv0WuLT-mJ+nOunNakv<&n@<HpUt|AZiE2(G2e$!6 za9K|&YcVffiI(zQY4+-8=ia)>1594Yn$g7m>ZPjom0~)#X_CY3t_uXR>}6@^t-&CW zbi<Y^oY)ts-Li!!Ih=f&w3Y#?ItP|{gSMq07?+`zMqy>eL`)4lK32M_(Qi8@xl`Nj zn|EVw5sNH9^RBs+aM<u!g60Gp>WO^jmD(?}mcdp8nr6d0l5yk+)fE3|gE;H4$|LNo zO*cUBvrlUS@A|zy9iBi&jeX-_IBJTta*zYJnw&-8aFX*UQCzoZyT4@BOlw%QK`n5h zsjTu9fPO^p#J((oP1PxW8|V#VYUHKaS>QtuY;Djk6iA4T#}B9pUd#!43Uoznh%xFn zA4S`6{H|VXMA%4(-jrFDp7PMHS_C1msIh*J%)`+~!fWc%zIML+YEo8pY*f;s@$FI= zQwm39Y22|XjImxw`vLr4Zb)Hmw^9A4gK29_K^=7+BywF~ISARzh@7IZo!{}Q6lcqX zIzIJv4!CY~aUBJ6!8f%kmI@3HJ1%GJ_IWwlcXQMTN@pIt@{Ot@N4R)(0nzT%da6_F z!@poK2>_!S-f(WZyOb>{>zmTcI`^3T*B0<mt{ayM&AT)pu<0*(mlR5=#Q7uVAiuH+ z`w{4UGY(K&2y|_RR>*`?-xA9h&;UF7A~k4*!J(BvK(J(#cN(cJ7vsbn6UY~j(+E() zgC%13{8@B!TEYd?a{O&~=dWAL^;f@9J^O=;{!pL$s{>*XxI9ENsx?MENaY3`&B+YB z&aDH=$+s6YQvR002^x(wfsJhB4I4Ogor?yrVr^vJWuOtLSsXs!c7cN?d-}bdv+_Z6 z`4!pfe9(^jB1Tf&^hvRMhN;6b)YXm(itipqOGQq0T9I~}(b*=NPsyBu4-g5U=qW}H zKqVA%n!AygDs<*lR>7>L)R7%%MS42K;IfOTc>7?r)--neYRhp~MRU}<{}z3e)BS)7 zC8qQ$FOY-Gv7RU!Ir=KaVCv!T)pc|*NZP8G4)%FOm$@4?^R<X2tw!}7wd&)RZO2+A z$i9~6Ek~PmMK!0!*%gOeq*kcbJ9$bypz&P!1%y>YY!Hd!5qsW_m9V$j1%dEuKmb^| zZxl{?&krQ66zC=pfQl*P)DO(`A^Afk&BTYWD;#>GLxRE36sF|O>$crDnyi3>-0$sc zS}S3+Bd+GpXUl~_VLFdQAwI#<HVTI-hKc81Oa;Kk#pgTa?7S5&08<$QM;me7!8tiv z@w%cyK4;{f4!$kYM>9B-|0tt-wnDFsarl$yM#)cbLNr9bSAP)dk}JsLM3)KX58%L{ zZ$u+<8eWboY;uuFQh`QmbC(Paf~#(@n2vVuULS?ZYmG$Vv^`xNikvF!Ca|W;iX^Q5 zV08S;N7lH9CqK8`l;?(QgvG7?WwYstoed?x8Rd2^8fZo`_3ct<PPt$#tS?#)U$xJC z2oH%VsxK<dL+ew3R<!$hF7iPMQi5k@%(Q*8^5**t#9#u-vMoXpQx0Z<*3W|{{afa| z5|K!=Q(JhzaA2kNGob}-Q_*lw>wWc<aYn46bveF^<mDpGj#ftIew4HlqZNN7O54cr zl$J9=BqMMDP}{+&L=hdBkh?n7h~EqspU;#tu9)~-Os!GkhCm)>oVNLZ3lykv(S0!c zmNJ4g?W&+RN$!}Gi@K2$y`RYtUhE#LqYulpXFn~y%UmD=<P&X>(^gR-J$)w$rpyy0 zPdRv1?aQb05h^t$ndaW7_Kn=YxSjx+Wr%I~&PU!bL?YC)W9t9^&uv+X(KnB)iNPZ5 z&O>wCzO`?pQqd80ifz-&PJ`?@XrX?QsSQHHIB1N{QMRxq1Wvl>!AH>*vGlTSFmF+S z)8cX-ZBsQ<5)<sdwDwn{`D-%?_q1L}3VYn3XQWHru62`Z7mN0KUU_oGrwVf4&u%H~ z2jHIO{jS2_fmSXQeXwVs34f9G|F<?~L3G1|Wb3l)`!VVIFeCgROhx&Tcx{Kr!@Woy zYm+od5Mw;3e#BW~t35@)^eC{U0gcLC4b#+bKaJ!C5X9|1E79tR;TZ9PTZNQdoHJG& zC135qjPY(<`MEo554=UB7Nkgb!$8Dj`iI;yg93^{ndf*usOvv`!z`FWN)O;;uH&$+ zKLIZ&ab!sFB=3ooqmnWbuth4Z?53b=MK#@A$f)wLRwcO1Gf8NwX`m*_j59@lshIK| z(}nxvO#R=@fGZaFiZ;yrJsm_P5+dd8Ct&c7#}}Pi_EB#rKugkni7jm}@phdP6$VJk zbiHQL-ciQp=1H^G=JNTCGD*;_8tVv1Iw*yl(t+&>e4Pk{#OR9T>vNDl=44U)xEO-% zvc~l}=Tr#`K}wU9y5cn0^&P6_i}K8nnMjH(JXAr#SZjK4-O^uUl3f><xRq-;ecE3Q z29yj+>rDW4pCt&rb{Pb`L)0U;%E@G!kH<?In0*l$A7XI|tyvR*I<7vsdS7o#N9cW) z#BGL!YjE(Jd<;h?;>uJo)tCZ6WI5)xommI;!1G<67_Lb-$YtbPW{2L?7oynmCUvuw z+1jZ65TCOn7Hu*0WY*d!>$3Zr_xs0FEu#u(a6rJtFAI=;7v%%b{?a%l@T-}G2xUXx z%g)=DHPhOYP}z21%3}xX&rEzP+m7&n_Zo5HJ_@bO0f#l{bd?&*L--$e@hj-<0@U=N z4;F}(^IF9;Hq9_;RFYx=mqJ2L;r}p;6V4+6hZCAmd0veS;8Y^}hqQ^^O76am4zuDY zUFfA%YiQ-Q{^~#(aE2)q(-8%lWYlR+t-)(zE(tjan)c8x4#?vabIGSat7oK?);%bd zt1cD*G=u>lG-u~1#umGCaq;75dd>ltGP62UMc8kzZaeS>*|7X#NWL()r<g54cZHW@ z+VN~Hq-ptU7CVOvXwV=JpiDDy5d;L~nX~5pgD;=~SKlA|XG((o)go-*fFVeitv(3W zQnzM2%s7a}+)PrfPXf<tdm|aeH{~w(s~Y;I#kp6#a{>q}Uf=H{ix^Z+=+F^xxB;cR zU=N7FOwh05(C?`ql1{d6Rq&KpC3tu>SeDB2%h;H^U-4Bt4<PA(k)$)=3}}eTY907z z0>oJ!@YB(OV}fO`oXf&;N-WDcV|BXtvR%}PW^9aCvSk;JnSPJiu5tWp#<8#p@igKH z#%P^(7W!@9J2PX^8C-y;^j<I41ctg?t2S3NLKQRU8`~D>3(^8}gy5m!{r14j&6U?* z{Yqs*|K3utO0R;IV<DAUJ<U4w%Zg0esg5ARAIne8L-SVj(yuSaDG$<OsGixe<ky{b zNN|za!`CGF0M{)j-{p|O6f#o|hU?Bc&E`t?>SU{9e-Nlh9c1~9YWsceb1O+qh%NsN zgtl1mrrPXs-u6n(9N0jZ1v^`8=FZ?Z`16%xW51OR24Mr~nIG>BnTD?vpE$=tn&px! zvVG0Utd6Smm_OB&#cQ<MaI|sQ*iVHevK~h8{SV@^rTT|3)*qq<8D~zuVRMPxzW9}7 zhn_C0+^GHQR<b0hK;#q+RDsNTyZ$M{y;iksl5dW~!9(rDJvaZJ7{hSjX+N!4@%i)z zbPsLNkGsb{^MPlJ+4?JEUcMl<D%FKtCJ>l|3gzg`QqH{dt$vMa^H`D`&lXV3gol3# z4_kSz&Q+_3GpEWbsxAnsQU1f{Yjv(~4Y1xFfD8;I{T`U00Z|keQv?hx@#9YfBiLHY zFqhvUNZNj#O9kN&{)3dXzOp5=@L*@gLq<(nzx^sXkI#N#YrpDDLZ9g^1og-BntI(! z!%QY8V0;cs@*yZr2fhN(plAM`FzusJ4}5omi=C^W<MZ8sWvtJTUJVXuuSSvq&QdT0 zDuw+#T@y@qEipVH(*_|onA7-iFlkDV+kyenMg|s)X<E~3FydPzGF7!Xk9Be!NRc}r zd9^EugB*mJvWJO-=Q`*LmTE+;cf=GY<><W!1qHvizv*luYwleBBx{k+Zp5S}Sou~A z*^RE$@q&NYH*dH)O2kte`S$v7?G1E6?cJXahG%;R`FA@%zwPL+zFEpj*$rH6_&K{< zrvugUEkB^m9Sg)GW{k-?6vT^+=7G=l7YT3h%2-Ilh8o#rmwJr|8T6&f85UYZ+r)=N zyQkB-$G~6@pJwJ8cw6}X6l0^~8E5kzgB&2lYTca2<(AE)K?QB<K)U@Sf|IQX#Nh4m z$SmQ#O;;;aJ+8N{=f`>YpuR~V#}t$2z~`rsp|XiVwnSTYTS2mE%*Sk{S;VT|S{2#+ zLJ0iF!RN5!^=sc^1>Qt;c?hcx&X>bv_9{~j+77~avr#mwi5Wb$wl&X*V0xedqvj?> zxv!}Oi)-IXax2S9PX$RxZv};|Tk#NjqyzDxi}zj!{9T!gGEyM>Vor`308QKmeD*Z} z%}Q4OLh<;~lP3u)LDCwoT`6WInHV_4KwCtUC2biH$wq1rbO}egMQ>{&tE>IxoqXIl z&e40DQ#V!F$Fx~rQNid7|9t46ot3UvZ>62Q@!U%MIw00wG#;lg*K2<8`$&_p<Fn!U zk+wI=>FDkf24tip#z^9<U6C$b2;@tKpMSZ=al3R*2?lr}fFYdr0KDo5$z*3YDMrJ& zaD6M=7JNLsE}OFx%miys81k(3vhTN8!-fCAD92BCSrX@C1w`&x-iKGz?iybBZ(VGP z7feJ}9vQr;7~t8k1KOP74p8djYT5?Rs}JG2M>)5XXvUX}sWhg`xGlsKO!B(*%kOvS zgx_ZX3LdL1oN|L+uC-^;G{XRgLHjJi#Yto`_D>BwJcz}oCr*c2PNTI3;Ob7bRH<AN zYx0R}=vU684(WsaLH+!I;QjlO$^C;DAQ<$CHTWi3z6L-2Nt=R~E2TnM{Vn2V))K#t zS#SJc`PrI|x0#q;dR`AxYDZG9q_4|CY6-CZz5u1fXEr@+Z_jfQOhnUMLMW;)Y}J*+ zvAf50IeRH%Haqni9}nwHgFELbndsnqA6(R~^%o%R^-kd>tgwJg6QLvj1wtf1V_2HY zg>I{^7p_&U)qFhI$@rtc{8QO(6(LR<&^OL8{v_<U9{r>)@yrG`+(_9bGyqOa0Aa)9 zg%z+$B(udML!Kv5Oz}v#_+cAmhHfERY+SN6src%C?TVv@4jvOpV`FYn)nFRg0Qfd{ zhHk}Nm4LFkJP{yx*xTD){2wSKFd2MJ7B#|f*)XVA>gWv;k0OxSnwi%fx(KC}N`Jnk zEgQ`r&tyI-h*8g9(C!P+3YZQEKqYo>ym>b1vkZ8a^UGIWJoUB5o0^@ooShFG3N_h0 z;Dsp=?C2<s4*uh}OlM9aXU61#DV5g`zYrp@3sQQ@8?$@s*IpF1-~fZiCQEIuGaC=H z{ok@g<HBBpaqVLQp9*_V<taT1Ddrr$eok|~&Ah@9_5~+lvy3=a`{uBV1q5iyiv*fC zzvv^w;Pcj01UuZ+&Pl!BtltOZ5ciiK;yx5me<-u^!`xORsIcUgb=J#YO~PX;6A(-j zLp^xwKJ@&!A@pnsu~pIbVb8XJfLIi}cg&^OMsTG|O48v+R=uYJNk=V09z5G-NHbXC zndHYu5sivBI7kRtjsK;BSR8BNI$KUZB5Edo9LQx996n0Cy-=i;(vJ4^Eo~ighrj_| z?016ZS!-q~T=&AKq_j+}2=0amX9{=T=SR|in%H|FVPW@5f=)0wn**qM%;?5Z%fg|{ zMmd1@CwDE&D;o+b<G$b^K%MMb2Y;XpbUzMfBWU>u#z&4{43KL6pD|&T^F~*R3qJxO z-$2uy-zc&K%5VioP3CK^3OQ$M;cF2AL!H@^*Rq<dU0fAn)tRW<KXJiP4YIiVMbzZD z@a9SgX#bs2T$Ly;r4eK#w3n$hag-etxfh25^(5>*7&Zb%{L3jKf2}JU>>;m~X<K|S zT28Sp+I(Fp=oQS30i0R@KY`<SYOV@+m;fOoCV{4F>-GuZI-;-{jq<FNse<PBIFKx9 zRa{gSmAmAp{e2Rv^y+Xw7-9I%Z}AuX|7yfupZ$_P_DXb-3SYYY#wMEOqY=IN6h-9C z9MO^~`?i&tRvEn`a3Jn>MiwV6#bfNKPxY$w7tK-&>Vf(h>h(WubR42Zs2TWYRiO#@ zd$Yl-)prZLN`yy|71h4@WaKQGtVDJG?aVRYpD0TjM=+cC)!Qw?fHI^CW!9V&M-q*E z=AUdGadxMHDWQTfIT+*Jk^(D@4r5;!uJ-0Y6RL!sqQAoDk*+c0`Q5${XiBKW)flD} zS#SyCIr1oyBQ%L3*hf;~{h2NfqVNV*a|+8%UQ(|@APjl?Kb!!eo?mFQJS<VGn%H3- zQ1HSf;!Cg9CG&^DGQ0lf-c`J#xW)rk>X_UW;V?=(@4t<-T9@JstXe7B`Nv$FF0u<I z6pJ!{V0qS75DDdTIi(*~rM4^p={ivMc^Vl5<l)0<0;Q{1)^A2DYPwePuy3ox(g9ZU zKk;QXXEXwQ0%V{V@iS9lCXkS2m}LEx=M2kYN)DqiIW}m3)_scR`XA9rbFZ1*51*Zb z0&4eYysM%3GR`0;bYpU<G8<E>oIhW(RX&8jZ)TaK*bcT8Ft)I=9zRiLv&%Nhwvp|v z@U7LNM1D0S>J3u75~Qeqm9zJ!a7oRI8TTa2B|I5&$OH}LKKe3v@%dlMl-4(Q<~~W$ zR)K>aFx)Zioul_gP8$lWNjsFh%bwj?^}@^E`-t;21f@+fh_52Uk)b+!yMGx%c!hj$ zecg@1`~Ftn%T#FBk{%$RH9UJu(y_BXBHPMQCY^Qd*fJ!>Ds(AlGnnuddJ_86gnN{2 zCLV=13$<NmW@fvCP=BX^+Ekh6W9Jnnl^=N{{qi*I`O2Lb)37y?PP)>Is(bohJ}`vj zKRv}o?r5gCz3+T~(!O+LRek2L`$*YWS3_;uUF(i}(Xda<<^CP};4Q7Mv84H42dA&3 zlLJC|pb80;=gd`kWKTaJ4+mVi(XGcYuW;zJp7*=$vnWCc9(sJYy3_;CJw^k8jOkSs zEPvRtWB8-ol_$pflC{UD<d{iufrr|=jG@H3p(kccqt7r>a%#qvdvFS|ZWPZB3VcfM z9agNRl3Ab+@`8Uu+(0Q&b{2c@RV8xx){S;D|7f`qr<$!UWVs0~*=9}s6R${b4`bzt zxJ{bnFYM$#`J$>0S8z4O{oFSxF)atIaC)K)b7bH%GT@RZ@QQka&8wUm)tO75XRd1l zHaOZxO&jd2dN=x0VTNoh@+2ZJbTD`9CtvO1UF==Ar@I0#%oc3VLlRn~0mN+GrsJ#* z8m_F|;Fk)(C0HV9_`OhX`)h7~qe_Iz{m{*O`t4R-oYND0XJZPMMZz&?OtT6Zt-sA0 z8O~|O)}zRI?G|iGpPuIe^6A||ZALIxY7hMYJ!pm>pR;z@bjlMg#Wm->KQOSrxHdn2 zS{GRAcr<$uRrcottgMZ0_5SNvdwghx2p(_o7h=Go4q+S`9-EzF7anP(@}sixv5@N% zuy*_2h9fVWPxC;9tu21=-J6R&A7vUxii4X5OM-H@DEYso;UkXhRbebQ`yx6^J#V!U zqKwU<-j%st$tCqNb(^s>;(D*n{S>o_h1wqXR^J115=%`JZ9k|+2ESfy`CA$MyRTSQ zXed{zvi{<o;u;}Pr6|y1gh7qMaW#M5d#?%qWSYA6dHm&k^lZ?$Ne=#Q<-q!4X+F$r znhr})wQhD36lRc`#5GI$5yJE;;YO2<xwTS8t&aj2il7DkN<i(4*rHvrmWdc3EE&oy zqa8FRnP)~;<JaP0WB7U<5hM9MYr)wYfDy1NY2eiZkCs>DCFjIIDtLx95K7q#`ISrO zzGm|7@L7O^KOfkhDMKXUPR99uqRD|)3zrzq9`|!Xd74$?C=({h*@au=b^%Yi6i_M@ za1;Cg*(F{~oVV3*j;)iSr8CgE3`Jm_0#8^jWVr6KQ@}V-iH-D9D~!1Bw`G_?@zLZ! z$|=5Eu}1R>TItU7f?e4Or|x=}<zSIQoX45bZ>@sGj^2F^Cf@H*v*Q(BozlwDIVC{P z&1W*TwX#lA$8cXNpU0@yLSN{;NyngJjvp7x)3#G{0sKBtrKx?^41gVwi2BMl@r#)# zJD;>kF3(XC5)|7^&(Ig1Q(BC^C^@qP#=0q>){qO#kyHMX`uetUsb1Y9rXWe-^hejp zc+kOIKn}LR#3Hc!Ir&i+>m6&Z@x{bvCHNw&Ysfv|b%25bv6?ud7i_bGcZljk2$>%8 zrbZOMY|8L)HX$C|dG{ORrW_EPl6|#ltWDkk(8v}$|5Ru1iYlxHbcgb4$ggjpy!J#+ z>Xe#qr!*Z)w+2n}89VREvmu*{H1f{4iHZVT-OD)Lb-oF$&M5nBK-}4mlYgr6WdQ6B z?S|=EHL&_8t$+ed^w|{l3*x#HFmT5)7dFfo=Z(5l%sH?n#Bbhzm_sP<YL?|UY+?f} zHM|uC0`7dQ0;IEd7EEn8nDEgqwn=iS72Uojb_>foG>oPucD#If5M4#0NWR(;?~zA= zQ8&>?<~5C<2}MqZeL#ImbW6h8?UZ0Bu{bf~nqPl=S9M{LkT&RHLJv>64Vua|t|YAu zcwN=QaeU<`2Ve~ly0fZ><@jol*3|o?QT-6!52U)M>2?Hs3xw}HqL+X$!y(O|TP~qE zPl?Bg8QK53_%A}3XwE_reYA<QVtDf81qK~8n86`s8zsXdzq)|L!VY99pdfEDh^}I# z!qC_3eG5psnVtXU`_?f-05{SGvoygp$_|)~gSy@^NP)YM)3k&;a8M1|&&09TMt2oU z-Nc)^>?AMZF78ARlcJS=M+*?bCja_mFZC6u!W0k$YljPaE{TtvOI*x*A+C?7*%y1& z8HE6WC_M`JdW~s+_cqE4veR0E?tRESI4)@MS^n+oFKL8F9sm+R9ilg8zs44$g0jOe zn6en!ElX<yI}e5!Y%@4yoDj%O+L6F^2|<<#L%uWaA^YC^*1iaAZn(9f!{M%^jo=lS zv4cJTU|-eyKOhRM!i+^JuHo93T#dbD>PN0se?rshNZo?GLYRQg3}Wi<qZoNoDa6o& zmYX!se3p4J3!G3Vc?9^qB0vfOd_c&ZrOu(G>LX%$qD-^x0-=5qp5|hV;s=PjhJJOB zc9~h8oF)qs0c9^nY7AVjRjUD!wjkul41s76Y1R{dkC-GwND^ooM*=5yp9LW{IHdjb zxz&v$K*!p8t*X`H0EyoyKvFia@M<CY`^TRHr4`hf5d`srRcA-0WAP9}`^l9TqrBRn z2R_QeYzg~0JB*vv7csPbj5ESCpUSS78wRL??tFO6jl#tJ+$%Atk@NWP+CB*2zMf#` zAGWo>#ufVl1sFukGYrHwmF@s%B`GrSdplLf>?+Re8}^P=#xAbbwLzDh;+CMlCm$l9 zRmNu`#TWThPk)FmSN;%W9K^vtZ1ge?tQ|gZ+BD6M>-j<)=pNnZE(6)7md1o}z6)|O zpFxjkn-D6JDR%N|33QV~-bAc;I?&lqZ&;yD-Vy%~1wbpu$t2!BG#I_(0%0Bzu0O3{ z#-WI|)c_J;Y%)I_?(W*$Q`5GV0mptruh>t5nR87PUClVpenzl}4wm2?aa*NGrOE#< zE3OFf&;<t^bUQ($Vn7#p@_ym#Pikvil<`^0>N$0}%8b#oo=^CJKL`Je8LOKPm*SiB zxyY5Cb<BE8O5UJdt^tL^{{D}(VsSCsW>1*i<%93^+0QUs?P6b7Q$VRRBOO@@RrO<J zUiLuFYH7D!A#68;oIn~)jJSiY{NXF6XfBB+iGr}qy|uH4Nw$Psjc!kBD09`MyK=t$ z%q%MD(B5=FVO@Z6=9yYP?BEL#E342b<0!3Pwj&pgt-8MyLw$F%8k2Mp!E%nWy9F1{ zPu^^^wm^}z8${sJWWyC1{?}haVG=v3P~yYl`Iin!-x^{V`@`M4-HA)>Z%tg(1f*<~ zVeszx&-c@-O7B!D!I&%SQn(e9&O=QsZW97FfsVTH@I?$?-83`Fia<=2?7MY2vr?6- zh_Q~tv;Iy6Ax{In#TEs2p0$dY-=jyQrkf5OL7*>N6Tp=>yMwwIsOR=}8GVX6v*{@) zM3c<dR@YdcQvyL3g63OY{P(jBCTiKYMQzr|Z`F28x<jLUIE0&wrcDXGZC99Jm<|Tu zlDdcTPK_-2mU!!u2@0Ez567-O6+2WV!|8U<&^hz!^!o-qvuv1;Y43=+q^zy~=n8i8 zN~%jJ74dz5KMFUG{b9qCLEp9EkFh0nkKIuLM17tIJi;E>rX-m@8WIStO)TO31Xn5d zrb@lyhG}Z?tGJM<ad37^yn*=w3(b|9F$6)r$k~*Zi0sga;u~*;qFeseBXmVRlp#}4 z$Z-yLxsD5TIA#IOmf3UiKEhUihe2F0KWuHBJB|IU7~Q_`{&k&zyIAhd&qB-1rjsw2 z%8i5frVBv5bL5dDzt&MTJhbl%Xyx%I9a;#@86t0a&M703%J^SRBrK2ScsG#-Bjuq% z7@s{cDB*D|goWFh1=xvq<$>8uUkDMf8z8mSd0XHAY8Nn~67R}XYCwH#P&_;8)GJsv zSN~J-q0gtodrQY7*O^Kh>45!K7syh4o+Ih`upKJV;w%<-i(WCtHm7<fCjn<#J02Tp z-Wjiohr!nhj>JV;t=FI=M9$_iKX)=vHz&lM>`@~OTm1u&g8rOc{coTH@_UQ7``HT` zo9Y!ITX=9==<V#5z;}x#kUvtW*_`#2aa0Rk#H~~j1<rX78H$`1I0%GaQS2j9Q8~FG zr>{gvnO7XBH#29g6*cf82#IvQ)-941Hxu;VZ}hpWC;ggC9P$b%V<k%>>)1D7VDFx0 zqNDI0YZ`fGizoD}D7#@h;3>>z11l2C>tj+@!<~opjjiIZ?U*zmIUvC#?FKYk!XCJ! zR+ypovlrN!WH1q+WgciqCBkB{)$wC3OnMC_qGo)YeuV*Kok&yoVK@N|OLRP&Ba(?Y z=8_z_uExByKd`D3Ign1mh7$OeCRQH$eso!k1#*x(4v|!BLEp;my>9@T!ozr{QcE}Q zM6i4q%b9tSx&ECg>h<e4$SKWz(98=7Yvqzez$wH1N|T4rXu`PfrdLjH|GwqxY$T6F zeIB*t%&eOJt=E68Bjy=g<5tdTud9*#N!yn2SM#6k`!ESm-*{vmF^Sh;%q`1}WhACb zEK7WYLHck(n@)RtO_hdN+?6CxWC41Wqw-_&)+rXSpwM0fj(|(#PWNW`E9mV(f1tuZ zrjGb=xvgGHj0?EJ06}C2ep9Mek#%U`0XFPSw60KXR8uUm%WPDutNei)fx_mqoA}{i zFc)~urw#OO=EeE3ZmA|N9ulK2G0Zd01(V7y0)*CLM#{~0vFTLK)0_Lpl;jt*p`e7N zpx}@P<XG%uyc1QR4)MWlbp7f;P6s0Pt6NdYILNEh#p@Yl|7{-1JRlUtv@UPVSRQIk z>$cJaA%D+!6ivf=c4+8B^RR=D@+iP^i%2C&QgvVGB-*s-I5*7_9&5OXuuhFQTf9|| zBIXI#q1&FWQG~XLg;ojXMuts$tuOK|FqR|N`j=ZU3Bd@$7A&GWtxWR#_XUP-5UGPl zaj<{Y!*le+s%H-cK*+uMnu3vyT)(+Q<3=tx`-o`s(;RmaM3&QkoA}fzRMe8;dp**7 zXi+iYi*`**_Jv8FbaE{kZZ*dEq+RMq-DpdSKvpTtg6y6L(wEu9Yf#GNuOT5)UZG?n zzC%dk@JHP2UH>cFI;+LDq@jSYywJTMzMVnaK_B0_Y<{HQ2UY`b3oN|a4<boQJ<ri) zg~tUJC%5$!0qTU_sFZI0o&wFEnDlxSMISLOZpbC{qY}5)89aRTt#d!S-WrsBGQK!a zp%-Yr#gr&H-wdtY#z~&ZZB{uN*3%r_2P4*o)j<c8`0i=PBZ5s$5>GBHEA`|V%H^Et zX|ib|O9>8|{j&6VbVmm7aWb}a(8ls2^(^}SM6`G|ueK?$B2q`*UHilP29Px2S(n(e z?KDh5AAgG%Z;@L|N#cITF^UT>*EoQhG**c{-@=QN54u$tfyS(KKOgl!-s@X9{(1yY zzyWI^<nBW)UG3+_G<$Q|E6Ex|(XYj7x*sL=q&FVWQ0O>iT%}oe-dd)xkrXK+95gSK zkl1@_Oug-y)>^a>=++&DK(+4~jEe4_`QK4cw<Le@e1H#w<m_+b+5bvfjxea^6b-A= z^G)kgvpHLn3l1*}6kC*Z=^6a!qixBnj_J*$*D~NsDb2lg74!n_h^QZdC&(1W&2JGI zGf6XcDe~^aaP_z>mFK&2nbJqt*f1Mac2r3X)=Xqm+Dr|!`OdtD&Q;ss#({F-hDlTb z_h0|P74b~mjzoYG{UpL8IXvJ)Ka(>H^P`(~o1sW#L@^VAox>KBrVFd|Hz`aled7p@ z8BeMsRVKD5S3PIx_FkvZe|FvsB=DF56^&gHr!<u*__k{5DkI`*3vud$+N?^q2hj3` zvzl*#U}s)k3~V$H5^)^$#RSgN4^xI==T(e=Y#t;y8Qd)n@QaBGPJ1Isk^D597U|)_ zHQ5Ea<@M;eh;OyoJFaCaH1&$=;zkY|ZIFu&nCou?D#X%U#4FSmMKN=+LQ3jTL6xxC zKM-e`w$>vqh1}z*Z3@T$xeYr?64d#sB0^f|XTkF1tYS4Euj}=yKV~`sylswH;>3B! zgOkpq0w83n#VL>v%G%#vX_9YK4<Vo@xQ)tZqy=UNoy$?W$IGzhJ$G2F>1(QkM6bBu zpj7ZkqLXo(;Rc1W_9A7?eQ#u0X!F(S-r@CQB`p++9Nauf#Qk}pT@MP`frMJAb2?dm z(*`yDKAMbWa<mQ_E<cA@i@=esX&Xb3q#L_tR5)WvhD`-FV;=Gx*`rq`lsZ|(+w5d{ zIw#HgefTFXRonp3I>tt+G=TV<0B}SzO-`3QWMis)xI2oV%%OdWaM1v<6i4VB9%f~p zjPYd4>|@O>x)%}#TQ^TvM#YY?(0Z)(Us4>rZs0lM0~>Iy_4&Jz&E9ND#(?w#_h;28 zNZN+O`ZQRMLYdd_sH0F)DDvF!jv|>cA&cf|Lt97n8Sf6GYsJel&(_X!1PKZ%3|yg% zq79;n%}ia&u9NJ|FkxrlP6=O(DApEMVmI<mSv-vYyPH+O_f8e)qp)ChALH|Ns2p7S z<9ftwJ-K6qwV1I{ycRpOq_SDW3p4N!jl_2bJW`lvM;VblNNwNOX7Na8AgNCj?ExUi zvr#E{=#FWu0=fOkbmd`Atimht<Q!Rbx9MxOr^~vyupN)}WfBg2NrB!xO**q^8QCL^ zBjpXj32h-1(Rv#MYS~Dv0B0EYT`HJYkbT5i$;(qT1}Du!*vgve8lP<z3geEjD#CaL zDQFNDt?>_^PHdMrk7>0&+irfBvkuM9-XImLgUi9tOJSgPln(|3;F{zX8WH@zEZ^gH z%e9iApt2Ltt<A6!6V-*cing5d^@5{8hT5v=e2Kh-z*-n1isY+Vv@P|p7lKL?`16_4 zeH@%8QVv7tu4tWT$X~-?yJ4;Ul()Dwe6?DoXH0EetVT=Z>+@bM{;xIJX0a<aH;~{< zvb6%fC+`>mpy)}j&Bok$ZJK72Kcw_J{6xwo&B%o$Bv+jehsE~<0iU)k@RUY40Cmel zE-V#Vq42RylHPf>&^oR+KL!=nJ(v1<60f(X2@zPDQ5*6pPH?5(GL9i_vYtZIUWbyg z$&pGO72v53y6q#vYHMq!%ljXoUwU9sw~IdB7pi`WyW*U~%Y%<a=fvC!251Dk5f>&b zHstuY+?3fD)W{;SdtVqC!!uBw!OxmZM8u4*xy={0h*T8MQ-Y1O?WRr9(S*msWb|#M z4>6ftBNu{2(>Wve9QXj%7TH6BeLxmqYKAx5dxB2~vG5+e@*Ro7;<S414s*Vhx0jGQ zA@?Yc7!Rbgj)xU8<`XY_!4-LBg1Srolt_v(!ATSkAPWDC??Pa6d``If0EQ>&u7wCn zhRZW!iYF!zhm>m4syx;udXT}SnSI^Xj37I&cO7X$kxMnawhd=70)MYtAoB_UvA{kL zKy?-Zjsx9BUxCYCiF(0CFm@FroqSzgTCro32;9Y^sa_R>(7>&GWa8vAsR&R?KL$LW zW5xc@(ys#=aJmWZDr4AYuqb@1^d|DC`8(<kJg<g-J0{I4{M}uMXLmQ-RJr?Id$O#v zU15(-UY?@6G@eiT2|g|+@VT!Rk~<gG2#C5~twALN*2k#&=+y$y!Nm_iW5<ncX6Po6 z&s7To^JyLNk49<?v86Fxx?RGeYAsLV-UF*HL0$FwHgCu!zdI4-i_rr>-_K=13#D5( z^lMkM2zgMdG-WC@FhFs@Z9^dI71Dc1CGcv0zEo%#)Ma^Mn2fH>KVq48OtB^-PHGhv z8%Y#_Qebh0Egr`TZ6^%`jbfQ6^D=FI-xi*rC8Uip)w6CQIFOPTuxM(qYW75EeO5oj zk;0;#%oCe;Z?Rffownzaz@*`i0iMZTe(#B)PAZu?9j4K96PTSVWZiALh^}7KtyN90 zbNlD)N{hEp6t%zB-fw6sun$ePiELAwcP)PjeN^!y7hQsgv~sCtcMy~`kVP5&LPNv= zRQxto!v;t15?RAtyoAd8s<P~Ar4LA0M_8)3<@a=BTk1}`$e)em+<HzmvrFm*1p2c^ zO6G{m6Df3TpoXacIn35X7~rbgJ`RO#w`p99EhcMrw8Y4z97=YiE-Z1GR2FoUeX1f% z_^@%$NBv%{s4(Zs`HSn%*q9*l1KI#ocy|dv2IGta*%7FAIUz+D<unNQnW;Sl>f9v& z5%waB#kcudpHdgVcrZI<2@l5+97v8JGrHHZZbcs|>40oku?5q$9tYF_XRMczE^#1% zo-1vNrdzW}EN2mDGm>}`;$^i|%>H-}Ru_vz+Shs-Y)3fu_zAYIl7|JL^Kubv$`BKx zf6N8E;=}!ziw@}S{Nu=9W4}QrYSk)@o<Ya0)+FK#HS~^<45&(_z3(d~8)T?GK=Q?L zO)Qc0CB<B+YK6oCBo23ovzw<9<npH^e4;d26$%*_(QsNY0F1C92Yl&C+vPZ(BNH3s zJ&n=TzI9h5p463TIel#Dbinbb5lpHuu_*z^jTg#UOBGP++e-v~37fepyAqpG_HOiK z;1_>I%!SZmMk*Z~f@}2VRng(cO2zS!U=V5t#<Mfu8(1T+mbeHDo31;>Fim{=`i~|b zGE?-DyGF9_GTRx1_m5_9;C!89DRS*;)+?rk-^P~g>e?3ibtWJj^Z;gOc`$eC$XQ~t zUgsCOca2Yf?M~MNt0v0sd!90!x^&&<F5%jA+YV4H6Mj;qf(Jp2dAL|I;&O1<<*#+V z$cLNE=cv;Pm<`R!lQMDTr!g`SMTaL5XAXq>CFJxMU}y4M7C}1%fGh(?^x<@J*fwuE z_tHcr+o!ar1iD>T9#*DWJ5KLie4euQR=lb^ugxku7rTVA-2HpLQ{G#HFcD!V={nLs zv@pn!#r0NEh*}wZY#of+ERZ`eKa)6{UFdr>e1u+?)0_MrqCBHLqMUL)Dg(Ll)2-Ui zcSPwWjOsL^B>mjui}l0?3<bT1kPz)Ti(lw+X3>IaS4PJ3jbS<iCP-rwz914igTN-8 z5NJkC>TT^%%R2s<AIDjp%4Lv6u~`*uzo6kNtMB*Ej!mT%JoLL+za9>1(nwKYei>|} z7bC?AAC-)l^6FP0^W>GH=HPt|7Uzo;*yz7-F4Fr(gm%HMrE;Zf!ms;@YLdM%13Uay zk-yHb6;B%#`3S!AXTY){0Vd~v5lDE|q-?ck0e{a*+bC!I>-TgX?;mSkxv^bG`vW|T zVh?*_dgi|;ZMOBs0aT>OmbSOE=--tlBn&shnvj73dhR5meA`2vQI;qb4VM(Ro%RB& zGb+e3xgQxH4|iT$kcIq0hs^0;TX@uc6Ml@L^2)@W(qLM;>Xh|nE7JL%vqat8N9nrp zM14s8f))zLZ!+Nm3^Z8>iw=G0mE@nitO)5oo7J)AXSz_1TEcwdo90=!G#cESy_I@} zq6l`D8Vr^lyh?5OnLQHu!Kx0tnV;*mik@MDH60ish_i0XJO<|}LU)EmY+9zbRo>Dx z9JrYIP)(vUP^}&U9ae7EHaWz`0IwvB;g;b+C&$NPL&$-Jaz-#+QF2I|Rrh%$Xo-Om zf~`1V{xJ4c+6ws?(!f`hzAZbUDW#VcNJ<i$Qy;h-j#9eP4=*)XW%X7=c6ojmR;ni2 zmhP$j-jEv}gDJaQ&+0_NBYMF+nD7qT3+@fVOrfodl@0uD4bo;-fy);0+A7S!HUop= z*9pDPPl9?_+F3(sg^Bmho`H^|Nwv8gat#5$A6BfhHn;F_rg#~CJ-JuImAlAVHpzPs zTk;|D{IjS(;W@O|@Ur6ao`{e)8|9`NiVW|nk*ed+F85wg+M()F;rz`?RcI^C50|gJ z9!j&$x+oMQO`B&Mv4SQ6IUeRF8nV+0Mm&5jNha+aEh(+W65E64X?HJ(qN8#+!d-_@ zA9>T1W4JUlVblaB9vRF}7k^(<6pxX^$U7ShRd{Rls&Do1!_o|+_jk&lln^KQ{OhKG zy4$DZz{Jhi;ECaQ8O>)<W5_vv!(PWYEh1edp+Jb%4bv0I4B$s&vMJ-OZ4NF#t6s9P z8*Rbcb8mUNjU=4Rs@Z^&!>*-J{0=9KhMxOA{V1O{I(Ek7)A?5tj<o-{=3DHkTE1Od zUHI~{Nkj(dv6h+gU^wMfDHmZMMpG$<77n5X;}nffbUq&&`GNzpFqTNk4^Sh5(F}^2 zXuF_wiakTnhkiOgUB4puLQq_*&%bhaeolri`8?ZEtb9qs(=bJ8`_!b`NF_}z(aD+X z+Cbm=J(jqHKvE3c*y<iomtwYxY_V=@NICJheB!K%DRKqHdVT3^F8>@4jmAxx`0eJ~ zKVb;%qjWE%3i^q5j5qTNY0}j!u>w`gLC*Cmak;*6uj5X=CsFDb>caG<Uj~P^S)B}f zMdJ6bo}_eWge;OL+Bg^re{7c&#rbLcMM3XFr?dP!sRTe`YVVjDIyklD*xrb5NJ33~ zfUu?<zhimAAz7^|t;9>nFa&ydzh$#CJD`w@PrLGr`53!amCG}WtEdhvFas_~1NCJ# zd7L`=t|>}#^FNdwL*NP}_vGn?Ecb4Fx*=v?yX&X?C##(GQ}DyY4)}bEeW-&t&4_+2 za^i{v%^~y1DJH|<0~`+xnpX7hq!yqQQybC_;0-@*jc>xux|m<IjB;Teh_G5;9=zE5 z6Z8wWvX8(KHuKHE$I^J=q&YEvMuv=VQII_|q7B}Q?ZCmXyd~N`CF`SwD^)b+tu(~} z-8+|s?)#t)=QI7$z(0^Prd}PwlUc?n*PM5GGoRTQl%`x800NYVeT?scV3Ea9GQMVK zX-Eno-M}v7tuwulV`9FuV<m93{iye6QUJcUpMczM!f9H+T_6fS@8?gy+UR|uVQgR# zq`73!UXsqD0VPpA=SIh`-0aACnkx9nT%-%?w-=Ga2~eiqV4~X`M0knZ<&1SjeVY1= zC(h60-(v)N%~9h9rh6SWiU_MhO#I`E@`k4-w$zD{tJTtH=Og^Tk=wEeJIdswRd_hj z=NY+)7BbWy<s>%x1uFfLTl%z-U=J}r<NOx@XcJ|}z!O&G?UIIwgq>V6CEwy8eS+ij zjJMxSh|30hvyu_bUt?-f7JzCr!3d^d$Vjl)a3_ypAwJnGwT3LbXZ-ZzM{*xsnzn-8 z#svSs(_Tv5b;q|%DJ%l>)BBseyWHs6z{-pRF;Zjle;^IWEXy3eW~Bwa-xCuMv3>Oh z)TAoj_4vyHY-ukYGe~&Wp3*OabPO|d1nni^EF4l2CkkRGSG7hUF`3(orJQZKGYM1C z2`3j~j-9N(kc@ov^||eo9L$lwJ9xsLCmm1Ow<qsB+t?-Le+a|JcqSZCo;Yxi_<~Mg z%W4Zt^;^r4d=A-vm=C~gD?}t5OyA(@2vz<zc!Jm)Hzw&MEOMR|TjnGq9Q4b)AqO+T zUB~PP!73B^i*8wq)rA(?c|^HbzSc?BukvYEYO|4-mFh3}>fLpLc;V8PB*&QQ`gwyf zqhWsT{^7NW;qHW>oXie<k;J^KVRaa~G-eVOaQU;z9*e|M*C^%G|I8w3ny#W{soXUw z7$C(-OoJOpT!7LrQLNppTJ&GO;u$n2Q}%k<d=hHXz$S_stZFuvd7HDjpJ}e#Ya*C( z>{&NiR#A;o^f2C_+gQ-gNF12Oy(o*^O(rUS(8PZ7HfqqxV#6G1FF(;g@E_Lz?xtdo z{8?zS%DqG+_iE*NyY#BK;f}qH&KACIp)gbGXQkc<;f;0cZ{~*v{+6oqX-4nkl~jEJ z8lwo{IQ<VAAp2w^g%K;>0&_ECWRjISD<1RmhA3|I)mh0+<zn;nsX06x9y<TpS!7X% zPBe!wCM**VfeviANxVE5Y_J({vx^#%e6bO{)~M1Dw6Vm8s(?ApXi92^JLwQ`j9T2} zU~piSP05f=Zg$i<S|B(Aefr8<%Wn3vVO}_aiP#Xl<Y%YgMR6uzgqxLwdq5x7fmSul zM4RQ~yiZ)an5C=mmZ0*H`XW7~NFl|q)G1~%9@f=wU-reCAWVMSsLo$*DbrO1i`I9a zFKENw2}3D0JKOxJ`or>D&Nn!v>C0B<??_H*G9uYZrMs3fR|vhY)NFL{{zvEa(KpJh zu!y8@^0bliIDxf*Fr~kWe1)_pAY|^92t7iq@;^L$5yUbXrRtPGAzTs56$US5+V19I z6(WD`DDuT?F$&>KpIvP+AkbnYWJ3LF$~3_$Pd_zb<S#`1CGdHxJm2K{&_p*6@QrIi z-WKMvjw^4ks~ZwzcN_%C?|QZktrE64!qNLmFANLCCWk3`XvO)daj43Yf%E9)$3FQ# z`NgA!)@Fw)TJ@9vyesElHRrB?L%XjE+Uz==Gd^LrHnyXB4=oPA5y7JUdvyUhcrd|@ zZN1gSaMGfd<3G#dk3Fk;KR>G|^Vc@QTu%LujSn`g{sq(Eo<m_|(R4D0MWe;glygr~ zEOdYSqLl=m>e|Q#a-)0Q2AR-({NG8^{|tjz!QObn7b0v>c{a=9@V4M`U%PIN$BTUB z56V4g;?IR$Dk?_#GJ?5mm)C3_j=Wg+eEua?rIP3M%a#EE-m*8eQT}4Qgjzf`WtSsy z5oTZ$T<Cg~mZ-Sq|2k7hEXAhqwYOpI(0<ePXPIX2uc3zas}enaOZ~<+Q_sibvyJSV zKt#JHlc}arodIslE&V1dJC8>v#0uf>{zOBO;n*w`{7CE?h)PTuvOa0Frd?Ld=sMLT zfa!@%i{m!OHg7U~wlgr)!t%mvkMM**>m7W-K>qdG&?7FE=t)MlYk$dTEQ`T@r^7CF z6LA5Y%Y?2|)fCcb$2iwVF;2YyOycsR#hT?Ll+WJxudBvC-+;4g^;id6_SpsV1}}6^ zhx*|7(KI#WTSD_$jBFqUy#$yD-}SrJfhrOVSJv8l+zu&P!HzoA%8ow=6S9Kq%xw;6 zUd;V`t4+K9jS?D%v@?b8RTdg#E4}f_GV{v*E%s^ZL%Ob~CehbyB%)hXrsAAU?-l#A z6oEHZI>1e9Wu8kx4x!*jnNQma{^{+}EJD^$xlyb@W<#;~)nWE5{fesc-@^SxdjgzS zu%ps<Uazmdwt^3DSCnfQwCo(M{az~QA}wG{ZI=<12!Dh$paFS0Mz~ZtoOASWythr> zXDN=XtOjAz6&?w!Tvs(TS3V>h2#)RaXIY?`lo;}2d<XRVFX(32e4G?JKpx&oUMrAy zsCSRUN2FLC>R*Vje5;s=OkP)8+dhBOZ==6vw$4wN5z{23&?aV0`R3JrO@#X0VlO^g ze|pcpV{C}Pu&6P|o=Eyc(+0x7kzt`33Zr*=K9MYc$tiw~RH>dCNo6ko!}NhU0&LP> z?jl)(u&7`#-?}PbvfXK}HMQJ6T2uP=*x$k<?HHGu6u5?7aIVL&I!Z80LSLjA;G!jO z$KL%ZlHFmGzqTjmE^vDDw*%pj<%jdwF6YGFMQ<zqZ~sA3k5<J79f*uY>s!il+BX&B z7Ghgov%KE&ZU*&}7?7embX>CSW{v+$5*@F-{>!M-s-tX<{{G5ugM_uiOtZ@+$idOw zG?h?Lw;pRQj)~7N>QmuSCMtTiHi__x)XN_Z`!XI~tlEbe@^|s6we+nJmVcbsdTZjz z^sD9=jAn8&P|G*qNtT9v|Lv~kqkVU-!F7MaP1K*Q`|ooXC)+8T4CgD>ye)I7g4Bgk zbI=zOY*~S)p&=&QJpZ9rp?=zv`P4gNr=nE}FGlwag08-qLUcjG<JR=dArp^XrNHT% zBl9}e*&83(rvnYvA1({NNBP(6<HAv1mHr>K_{slmA9S?uTE`geHE2TSB4FWrBfUfJ z3P@39QK4eLfN#oQ=c7}!pL^=OBnSntv!Ub!^wSdZZTICravmv(A4^z`NnU(=X#Yk2 zA5QqMM0BioRt5TNzkS0k_tD9xt;X|@;AZ}G0CTMJO&-O7y5qh*C)^R*xhMEjR+a$e zK2#J!V0*@meX_&_ugT!QgR(wW%LOrYe{PGo%Jxap30pX%<D3B<`6!(cTefSEYH&w) zxd0`XJE#9_-a<R<p$q%Qbd_X()#I~|0BmE7#y?uDQ;|mcg(Xk$o=NmHl?;76&y0)e z#b>b>eplx;V~J+)MA#0hZSAzeGxr$^qHr%BmyzSC)WCx;{;kRn^N;y-11E~F!koTY z&no842Htp^iLcQNki`=h=flq{YfHm{V<O(!Go$a44s&G3BE8(8OJPpfudt*xOdslQ zD&98kU}Q1*y!l-gthTYpEAZ2w)VCOmM+qsDA-5(u0#o5n3`NAs6(h1ir`X#N)n^yf zUqam4962oPLwQJ(C5KBE_vUBy&tER+7K;U5KL~&Fo^kRbR2XY^K$}bjg;)xKo#O`6 zLw?sBSp^m94!tmT8P0ft5=8ao*sx|S+`<ZFiPc*DN8B`-x{2Kt*~W1rvabEG-`~lg zTLgS72l+j~wdH$Rt^L58a40ahZVuGqD14Wt8!??^+nX^f953rX6N(iJ1};nl3Z_`B z!Iwr!48Iu%bJww-{eJ%gthHQds=Sp+mX5VVomZ9MhFe8hl(QYuZ>}jC&J{^nz29#p zWW#=;9$R|hT#cyot&PiWDHPjKpoBgf8=d027Az?5D|B>Ctc<1YFctYNUKf345<*+2 zRm%dSO|V?f_tlB6{-Z$6Q-b;x=FE(Y*QYe&l~ssM`%d!$?;2xJ6-Z)a0Fy7jAU|X3 z4-?vGML#Uots6*=o-%1BJ%wHQIVt;dWEp?-7aPdMo%hr6>S)qbD(Po`h|~U%#9ZX^ zDsUA{QvJgXczQNm@n|%ED|;;UmGXSKr?A;wrlFIGmBzzfxVg(@n??`i)Nz)Q@E!<K zh_F+$*zCFk0NQ^<9Hs(bXTc;4#&0q}LL0LXO;K+QX~>jYQw+JCocf}=;9@;!ij(tc z3f7Dlo~Imx$4$^`3&GR!?m4W&@!y}PqJGZp#1MR6*I!sqp0NbHzFdxLa#|iZK?>c< zH!WQB?KjFKg{USmMFv#bPD&F!BJ{~dDaiYJHR0sYaM0xe$A<x6e!#~j(XFkVl?L)P zTSmdeuKcE3Z(#$9>N8SiivG|BRcT$a@7%xbM$4UR)t6k#EA{5*J|ibI^C=e%iR%Qc zE=41(dRe?-#6%<|?|Xv?5E2Cz8kQ%t(c@lYG8`P)HP(Efb0Dk9cl*QJSBmbSwAwJU z_MG*j{id-M6M-?aAkD|doWelPT{MKkxQ@0cds%=gn9YK4U~mE)w7-z?q0FVqFhcN> zVwUdOiq7<pt&XZ@M@p(>w~@{=9n#MdeMT(hz#rNSL`aGPtOUG6@nd7`&O#sU(PHO= zgm>M$8qIhtb;ial|Hso;#x>!+Zz~{(q;z*mNlJHvbdFG@MoGsgrMpLWi!gF@cS(%~ zX(la<l+tJV{r#Ue`|QomIlIqw_jS(cFA*@6OrCrXmTu1z#{MJyzB|JlMQ$j8WX1y- zrQ}$CrK~Nv$;vhFBdo7;;4b*uxaEnFki(0pdVbcw?omlP;fM`buTM?xP6CP^v4p#1 zp|nd^iK5BNHz4QlF@K*6IV<uYpn=!`o7#tyX0`zxMz+e()h?p3Ra^CvRD7pT%VcuY zCuR;7ztXv=x3YVhYIw06=r)ydQjl_ELCP(txR-vdPjul&nTLRqE$87!oFfBUb)ftm zDRB=#<qLx5W^E)B<K%0D+$L|WNvP#Z{FiV4D%Tz^1jieXsl5&E^qxQpw%h6Ho*{1t zKr65~LygIKV(TT8-Fq|!*upnt?Nbra81VY?ITE?;NM+D_znCsmNG-lDcStdTeTs<4 z5+I^cvMmIef~6&u7<d6Yt#+$lp#Ffqohw&Kyct)~%KyV3a$d2|O<Z=QAYCm<d)#hD zqb8RL;!&D=-+Myl$1z^xXJhEzzx%9IF-6%(inG!UgU!~+-)<DU3+-Xn<+3AHfb*Y! z8trwOag1?~D7;$W{ux_{dOg=fYq?VcOX6n<sQJ`wwOWZFJ)YLy!K5KXD&CX-{&CO~ zv^F%=hJ^Bw?xVJ=nWzBBg7U3S`Jnesng-9}f$Vvx_#%c{ti2)5h4{7h3<30L(*CIU zSzq1%5E>+1AX25NbexQVRk|mxy6rx!EV{5MlD}Os{>+SdG)kOS5fPqlzFKKv$U(V~ zZ1nawqOR?))%)i&l!DAOzBn`io92<v43=;Rf$^fG?i|<F!}20L?oN(^TiqGf6!ni3 zRM%4#YUbF<a~zTwt+$VCX_{?6QH!)&qT@c9G5yb{J`vye>2Ok2fP5C*jXf}=<kCN? zNpO4xF>ukq{fsSh-`k8dmcaLgHmW<b4YA#OC9hBn_C`g)2+v~>{L7`Ca_Z1eT~)Kg zw&T@M&-OR+^Z$iRON;<f*6%cvCKW&$n1Ws&KMi|o0I@mN?7nh5QBfV{kwHA>Rd}Ld z8ZR=;YVrl;rUcD=I#kA{LXj<(J4js2^07|Zp!O+uQKF93&)jXv?w%9D)MGsSSGPvy ze>e`q$%|(<C^OK$fc*PSwHK=%_g!iM-RkTUhPLXzg1lX&j8)k^*P=O*x!}oIkew#y zy}mV%ZnyQBre!Pck#08$naF$FE0UTI@`6a*BcUj4DIMN+v+8HrJN0>Q!&1_vT7<`q z>`_!~jU8IQd_aEn_WQ)oqS(JuBIFfgX1}tV$!D4P^F`^i0iRFU<ycCnQ$zvjPqp<p z#Obn}&kxth=zmpDX}SW7cTEMhZ<0N`LIxa%W)ExpV=el}uVG<}?8q=u=!opr@tHY2 znQ!bu9uyYf2oQ}X*)su{27RxZ4Y&MX2<39d*6>)>@=(J6CvYs;RDF;qo&v@r@w|Jm zqW>dpb)sX0$tAm%d5lHjWj_~8|2=cW2PPM#@=L%rfe&^5!(tm()v4bu75e{T#dw+} zJLRaKC|?DifZEPelMM*r59r)k`Ds#`r=xOxeXk;+=^ta?4B7d0Tflr(oV3F8&Sa=! zuf*~^*KJsGI`RIK*>frsCe*k|ww-18R+w@ZL<O?hm~v1Oh=ufw1ionrpL5vFn-o|= zQD#OzY4{wEg<YC@wv3Fc*32I1ylHtwHiX0aUmzv@9wTFHzuq?e2K2+Ie*Cug*F$xf z?uWGw1=1J$7G6_*&k{m%QhGgmBiVnOpRcnOm#)^MuNJ!91?tkb9}|6{V$bdGKl=~S zC~sZ93(aw#$Q;Op3*?A0SbFglLT|4*o$8*HHX9gC2g_+F&GIx6%*=;wy?s|%>;F1% zxqQyafb_1kqi>oyfL(QUof+~q7V$#RHsVL6$UBnU{{`^<(o3%zrJL5lt1Ts`Q3a{d z6xmAvr=+oQLwoVdPV3@sQZt6kLN1Nnm*Fq>27;RmC*6qbuiHS{N0<@+1x?cL-#pK@ zq^)&aU_XWt+!L%NTMy<Z(}K%FyXT`-x{c>I(Hb54%j~fMqwT_`p`UZuZqoji4F3i& zPx~Z=4Zx-g0)n*bCnozoVK*$0uG7UzzK0%P%$f(SF4o5n#H|m}Jka?leg^Wx1%i3* z0ufVKLs)?K(tl&<G7R1J1ZvkGjTF%@|6YfDNG_g57I1)mle(KBL#MNMXZP2v+qb=> z9zBC@uYMVB+tDNahnL-^-(;teFp;L{zlAi!kXfQeJcUxc)|V8)11B5`??QK5F)SYX ztg_0aCW=j1Ew80UR#$$6KVVXL%P_*99Bnp30oyX83tuW`Ui}Gx-2H=(i)kb;pUcBi z801aMr>{pnH(L?$3h7HuO&YcpO5Ld{_h}krrOlEL=Cac5+*KY^l;xli^v?8QIc~Xs z64`mVW4ifJWQEceR>E1a#XVg<IqDl$yu&(t6yzle;x3WxdKxf%-~`D~Uc69Mx8LIx zpfFf5lWFIA;>0_?3j3h{4}8OMWc?^l@fL=p1gnjy9y)&^YDrLia(GE~iA7AA{=nTb z+p1SZe+T{AtmJ~VUOoF$8wEC6T~Xjat9o@N;ZEVT_1s9qK$zj55uqB$AbM_;p{m-{ z)!gh0Y#YQ}URuvp(P^>KR7<&lf$;OfMcFPhk@#<J#cW|6R!V!kdqlA=u%0A`s|ga= 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/src/components/App/index.tsx b/apps/dashboard/src/components/App/index.tsx new file mode 100644 index 00000000..902d5a12 --- /dev/null +++ b/apps/dashboard/src/components/App/index.tsx @@ -0,0 +1,49 @@ +import React, { useEffect, useState } from "react"; +import { ToastContainer } from "react-toastify"; +import PageRoutes from "@dashboard/routes"; +import modalStore from "@dashboard/store/modalStore"; +import { observer } from "mobx-react"; +import s from "./styles.module.scss"; +import useGlobalAuth from "@dashboard/hooks/useGlobalAuth"; +import { setConfig as setOcmEngineConfig } from "@dashboard/engine-api"; +import getConfig from "@dashboard/utils/getConfig"; + +const App = observer(() => { + const auth = useGlobalAuth(); + const [isAppLoading] = useState(false); + + useEffect(() => { + const config = getConfig(); + setOcmEngineConfig({ + wsUrl: config.OCMENGINE_WS_URL, + httpUrl: config.OCMENGINE_HTTP_URL, + getToken: async () => auth.token || "", + }); + }, [auth.token]); + + let content; + if (isAppLoading) { + content = ( + <div className={s.loader}> + <img + className={s.loaderLogo} + alt="vereign" + src="https://www.vereign.com/vereign-logo.svg" + /> + </div> + ); + } else { + content = <PageRoutes />; + } + return ( + <div className={s.root}> + {content} + <ToastContainer /> + {modalStore.modals.map((p) => ( + <React.Fragment key={p.id}>{p.modal as React.ReactNode}</React.Fragment> + ))} + </div> + ); +}); + +export default App; diff --git a/apps/dashboard/src/components/App/styles.module.scss b/apps/dashboard/src/components/App/styles.module.scss new file mode 100644 index 00000000..7960966f --- /dev/null +++ b/apps/dashboard/src/components/App/styles.module.scss @@ -0,0 +1,31 @@ +.loader { + display: flex; + flex-grow: 1; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: black; +} + +.loaderLogo { + width: 200px; + height: 200px; + margin-bottom: 20px; + animation: fadeInOut 1s infinite; +} + +@keyframes fadeInOut { + 0%, 100% { + opacity: 0.8; + } + 50% { + opacity: 1.0; + } +} + +.root { + display: flex; + flex-direction: column; + min-height: 100vh; +} + diff --git a/apps/dashboard/src/components/BasicMessageItem/index.tsx b/apps/dashboard/src/components/BasicMessageItem/index.tsx new file mode 100644 index 00000000..6102f72d --- /dev/null +++ b/apps/dashboard/src/components/BasicMessageItem/index.tsx @@ -0,0 +1,35 @@ +import React from "react"; +import { observer } from "mobx-react"; +import format from "date-fns/format"; +import { MessageRecordDto, MessageRecordDtoRole } from "@dashboard/engine-api"; +import { Tag } from "antd"; +import RecordItem from "../RecordItem"; +import s from "./styles.module.scss"; + +interface BasicMessageItemProps { + item: MessageRecordDto; + onClick?: () => void; +} + +const BasicMessageItem = observer( + ({ item, onClick }: BasicMessageItemProps) => { + return ( + <RecordItem onClick={onClick} rawData={item}> + <div className={s.content}> + <Tag + color={item.role === MessageRecordDtoRole.Sender ? "blue" : "green"} + > + Role: {item.role} + </Tag>{" "} + {item.content} + </div> + + <div className={s.createdAt}> + {item.createdAt && format(item.createdAt, "dd.MM.yyyy HH:mm:ss")} + </div> + </RecordItem> + ); + }, +); + +export default BasicMessageItem; diff --git a/apps/dashboard/src/components/BasicMessageItem/styles.module.scss b/apps/dashboard/src/components/BasicMessageItem/styles.module.scss new file mode 100644 index 00000000..65855af0 --- /dev/null +++ b/apps/dashboard/src/components/BasicMessageItem/styles.module.scss @@ -0,0 +1,7 @@ +.createdAt { + position: absolute; + right: 16px; + bottom: 4px; + font-size: 14px; + color: rgba(0, 0, 0, 0.7); +} diff --git a/apps/dashboard/src/components/BasicMessageList/BasicMessageListStore.ts b/apps/dashboard/src/components/BasicMessageList/BasicMessageListStore.ts new file mode 100644 index 00000000..ecbbfad8 --- /dev/null +++ b/apps/dashboard/src/components/BasicMessageList/BasicMessageListStore.ts @@ -0,0 +1,52 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { MessageRecordDto } from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class BasicMessageListStore { + public loading = false; + public sendingMessage = false; + public items: MessageRecordDto[] = []; + constructor() { + makeAutoObservable(this); + } + + public async loadAll(connectionId: string | null) { + runInAction(() => (this.loading = true)); + try { + const items = await api.fetchBasicMessages( + undefined, + connectionId || undefined, + ); + runInAction(() => { + this.items = items; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } + + public sendMessage = async (connectionId: string, content: string) => { + runInAction(() => (this.sendingMessage = true)); + try { + const message = await api.sendMessage({ + connectionId: connectionId, + message: content, + }); + runInAction(() => { + this.items.push(message); + this.sendingMessage = false; + }); + return true; + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.sendingMessage = false)); + } + return false; + }; +} + +export type { BasicMessageListStore }; + +export default BasicMessageListStore; diff --git a/apps/dashboard/src/components/BasicMessageList/CreateMessage/index.tsx b/apps/dashboard/src/components/BasicMessageList/CreateMessage/index.tsx new file mode 100644 index 00000000..156e0e6e --- /dev/null +++ b/apps/dashboard/src/components/BasicMessageList/CreateMessage/index.tsx @@ -0,0 +1,45 @@ +import React, { useState } from "react"; +import { observer } from "mobx-react"; +import { Button, Input } from "antd"; + +export interface CreateMessageProps { + onCreateMessage: (message: string) => Promise<boolean>; +} + +const CreateMessage: React.FC<CreateMessageProps> = observer( + ({ onCreateMessage }) => { + const [text, setText] = useState(""); + const [loading, setLoading] = useState(false); + + const handleCreate = async () => { + setLoading(true); + try { + const result = await onCreateMessage(text); + if (result) { + setText(""); + } + } catch (e) { + console.error(e); + } + setLoading(false); + }; + return ( + <div> + <div>Create a message</div> + <Input.TextArea + rows={6} + value={text} + onChange={(e) => { + setText(e.target.value); + }} + disabled={loading} + /> + <Button onClick={handleCreate} disabled={loading} loading={loading}> + Send message + </Button> + </div> + ); + }, +); + +export default CreateMessage; diff --git a/apps/dashboard/src/components/BasicMessageList/index.tsx b/apps/dashboard/src/components/BasicMessageList/index.tsx new file mode 100644 index 00000000..15a4f760 --- /dev/null +++ b/apps/dashboard/src/components/BasicMessageList/index.tsx @@ -0,0 +1,52 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Spin } from "antd"; +import BasicMessageListStore from "./BasicMessageListStore"; +import NoRecordsMessage from "../NoRecordsMessage"; +import BasicMessageItem from "@dashboard/components/BasicMessageItem"; +import CreateMessage from "@dashboard/components/BasicMessageList/CreateMessage"; + +export interface BasicMessageListProps { + connectionId: string | null; +} + +const BasicMessageList: React.FC<BasicMessageListProps> = observer( + ({ connectionId }) => { + const [store] = useState(() => new BasicMessageListStore()); + + useEffect(() => { + store.loadAll(connectionId); + + // Todo. Code for gateway-api + // const unsubscribe = api.subscribeToBasicMessages((message) => { + // if (connectionId === message.connectionId) { + // store.items.push(message); + // } + // }); + // return () => { + // unsubscribe(); + // }; + }, [store, connectionId]); + return ( + <div> + {store.items.map((p) => ( + <BasicMessageItem key={p.id} item={p} /> + ))} + {!store.loading && !store.items.length && <NoRecordsMessage />} + {store.loading && <Spin />} + + {connectionId && ( + <div> + <CreateMessage + onCreateMessage={(message) => + store.sendMessage(connectionId, message) + } + /> + </div> + )} + </div> + ); + }, +); + +export default BasicMessageList; diff --git a/apps/dashboard/src/components/ConnectionItem/index.tsx b/apps/dashboard/src/components/ConnectionItem/index.tsx new file mode 100644 index 00000000..c64689fc --- /dev/null +++ b/apps/dashboard/src/components/ConnectionItem/index.tsx @@ -0,0 +1,35 @@ +import React from "react"; +import { observer } from "mobx-react"; +import format from "date-fns/format"; +import { ConnectionRecordDto } from "@dashboard/engine-api"; +import RecordItem from "@dashboard/components/RecordItem"; +import s from "./styles.module.scss"; +import { Tag } from "antd"; + +interface ConnectionItemProps { + item: ConnectionRecordDto; + onClick?: () => void; +} + +const ConnectionItem = observer(({ item, onClick }: ConnectionItemProps) => { + return ( + <RecordItem onClick={onClick} rawData={item}> + {item.connectionName && ( + <div className={s.prop}> + Their label: <b>{item.connectionName}</b> + </div> + )} + <div className={s.prop}> + Status: <Tag>{item.state}</Tag> + </div> + <div className={s.prop}>ConnectionId: {item.id}</div> + <div className={s.prop}>OutOfBandId: {item.outOfBandId}</div> + + <div className={s.createdAt}> + {item.createdAt && format(item.createdAt, "dd.MM.yyyy HH:mm:ss")} + </div> + </RecordItem> + ); +}); + +export default ConnectionItem; diff --git a/apps/dashboard/src/components/ConnectionItem/styles.module.scss b/apps/dashboard/src/components/ConnectionItem/styles.module.scss new file mode 100644 index 00000000..932e36d3 --- /dev/null +++ b/apps/dashboard/src/components/ConnectionItem/styles.module.scss @@ -0,0 +1,11 @@ +.createdAt { + position: absolute; + right: 16px; + bottom: 4px; + font-size: 14px; + color: rgba(0, 0, 0, 0.7); +} + +.prop { + margin: 4px 0; +} diff --git a/apps/dashboard/src/components/CreatedDidItem/index.tsx b/apps/dashboard/src/components/CreatedDidItem/index.tsx new file mode 100644 index 00000000..f3d57ea6 --- /dev/null +++ b/apps/dashboard/src/components/CreatedDidItem/index.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { observer } from "mobx-react"; +import { DidRecordDto } from "@dashboard/engine-api"; +import RecordItem from "../RecordItem"; +import s from "./styles.module.scss"; + +interface CreatedDidItemProps { + item: DidRecordDto; + onClick?: () => void; +} + +const CreatedDidItem = observer(({ item, onClick }: CreatedDidItemProps) => { + return ( + <RecordItem onClick={onClick} rawData={item}> + <div className={s.name}>{item.did}</div> + </RecordItem> + ); +}); + +export default CreatedDidItem; diff --git a/apps/dashboard/src/components/CreatedDidItem/styles.module.scss b/apps/dashboard/src/components/CreatedDidItem/styles.module.scss new file mode 100644 index 00000000..5a4fae3f --- /dev/null +++ b/apps/dashboard/src/components/CreatedDidItem/styles.module.scss @@ -0,0 +1,3 @@ +.name { + font-weight: bold; +} diff --git a/apps/dashboard/src/components/CreatedInvitationItem/index.tsx b/apps/dashboard/src/components/CreatedInvitationItem/index.tsx new file mode 100644 index 00000000..a354a05c --- /dev/null +++ b/apps/dashboard/src/components/CreatedInvitationItem/index.tsx @@ -0,0 +1,37 @@ +import React from "react"; +import { observer } from "mobx-react"; +import { CreateInvitationResponseDto } from "@dashboard/engine-api"; +import RecordItem from "../RecordItem"; +import { Tag } from "antd"; +import format from "date-fns/format"; +import s from "./styles.module.scss"; + +interface CreatedInvitationItemProps { + item: CreateInvitationResponseDto; + onClick?: () => void; +} + +const CreatedInvitationItem = observer( + ({ item, onClick }: CreatedInvitationItemProps) => { + return ( + <RecordItem onClick={onClick} rawData={item}> + {item.shortInvitationUrl && ( + <div className={s.prop}> + Short URL: <b>{item.shortInvitationUrl}</b> + </div> + )} + <div className={s.prop}> + outOfBandId: <Tag>{item.outOfBandId}</Tag> + </div> + <div className={s.prop}>role: {item.role}</div> + <div className={s.prop}>state: {item.state}</div> + + <div className={s.createdAt}> + {item.createdAt && format(item.createdAt, "dd.MM.yyyy HH:mm:ss")} + </div> + </RecordItem> + ); + }, +); + +export default CreatedInvitationItem; diff --git a/apps/dashboard/src/components/CreatedInvitationItem/styles.module.scss b/apps/dashboard/src/components/CreatedInvitationItem/styles.module.scss new file mode 100644 index 00000000..932e36d3 --- /dev/null +++ b/apps/dashboard/src/components/CreatedInvitationItem/styles.module.scss @@ -0,0 +1,11 @@ +.createdAt { + position: absolute; + right: 16px; + bottom: 4px; + font-size: 14px; + color: rgba(0, 0, 0, 0.7); +} + +.prop { + margin: 4px 0; +} diff --git a/apps/dashboard/src/components/CredentialDefinitionItem/index.tsx b/apps/dashboard/src/components/CredentialDefinitionItem/index.tsx new file mode 100644 index 00000000..fd98db32 --- /dev/null +++ b/apps/dashboard/src/components/CredentialDefinitionItem/index.tsx @@ -0,0 +1,26 @@ +import React from "react"; +import { observer } from "mobx-react"; +import { Space } from "antd"; +import { CreddefRecordDto } from "@dashboard/engine-api"; +import RecordItem from "../RecordItem"; +import s from "./styles.module.scss"; + +interface CredentialDefinitionItem { + item: CreddefRecordDto; + onClick?: () => void; +} + +const CredentialDefinitionItem = observer( + ({ item, onClick }: CredentialDefinitionItem) => { + return ( + <RecordItem onClick={onClick} rawData={item}> + <Space direction="vertical"> + <div className={s.name}>{item.tag}</div> + <div className={s.credDefId}>{item.id}</div> + </Space> + </RecordItem> + ); + }, +); + +export default CredentialDefinitionItem; diff --git a/apps/dashboard/src/components/CredentialDefinitionItem/styles.module.scss b/apps/dashboard/src/components/CredentialDefinitionItem/styles.module.scss new file mode 100644 index 00000000..c49a2c53 --- /dev/null +++ b/apps/dashboard/src/components/CredentialDefinitionItem/styles.module.scss @@ -0,0 +1,7 @@ +.name { + font-weight: bold; +} + +.attributes { + +} diff --git a/apps/dashboard/src/components/CredentialItem/index.tsx b/apps/dashboard/src/components/CredentialItem/index.tsx new file mode 100644 index 00000000..204d1432 --- /dev/null +++ b/apps/dashboard/src/components/CredentialItem/index.tsx @@ -0,0 +1,108 @@ +import React, { useState } from "react"; +import { observer } from "mobx-react"; +import { Button, Space, Tag } from "antd"; +import { + CredentialRecordDto, + CredentialRecordDtoState, +} from "@dashboard/engine-api"; +import format from "date-fns/format"; +import api from "@dashboard/engine-api"; +import modalStore from "@dashboard/store/modalStore"; +import RecordItem from "../RecordItem"; +import s from "./styles.module.scss"; +import displayError from "@dashboard/utils/displayError"; + +interface CredentialItemProps { + item: CredentialRecordDto; + onOpen?: () => void; + onRemove?: () => void; + onAccept?: () => void; + onDecline?: () => void; + statusChanging?: boolean; +} + +const CredentialItem = observer( + ({ + item, + onOpen, + onRemove, + onAccept, + onDecline, + statusChanging, + }: CredentialItemProps) => { + const [loadingFormatData, setLoadingFormatData] = useState(false); + const [formatData, setFormatData] = useState<unknown>(null); + + const openFormatData = async () => { + if (!formatData) { + setLoadingFormatData(true); + try { + const formatData = await api.getCredentialFormatDataById(item.id!); + setFormatData(formatData); + setLoadingFormatData(false); + modalStore.openViewJsonDialog({ data: formatData }); + return; + } catch (e: unknown) { + displayError(e); + setLoadingFormatData(false); + return; + } + } + + modalStore.openViewJsonDialog({ data: formatData }); + }; + + return ( + <RecordItem rawData={item}> + <div className={s.prop}> + Status: <Tag>{item.state}</Tag> + </div> + <div className={s.prop}> + Attbiutes:{" "} + {item.attributes?.map((p) => ( + <Tag color="green" key={p.name}> + {p.name}: {p.value} + </Tag> + ))} + </div> + <div className={s.createdAt}> + {item.createdAt && format(item.createdAt, "dd.MM.yyyy HH:mm:ss")} + </div> + <Space direction="horizontal"> + {onOpen && <Button onClick={onOpen}>Go to credential</Button>} + <Button + type="primary" + disabled={loadingFormatData} + loading={loadingFormatData} + onClick={openFormatData} + > + View Format Data + </Button> + {item.state === CredentialRecordDtoState.OfferReceived && + onAccept && ( + <Button + disabled={statusChanging} + onClick={onAccept} + type="primary" + > + Accept + </Button> + )} + {item.state === CredentialRecordDtoState.OfferReceived && + onDecline && ( + <Button disabled={statusChanging} onClick={onDecline} danger> + Decline + </Button> + )} + {onRemove && ( + <Button disabled={statusChanging} danger onClick={onRemove}> + Delete + </Button> + )} + </Space> + </RecordItem> + ); + }, +); + +export default CredentialItem; diff --git a/apps/dashboard/src/components/CredentialItem/styles.module.scss b/apps/dashboard/src/components/CredentialItem/styles.module.scss new file mode 100644 index 00000000..e1d557e6 --- /dev/null +++ b/apps/dashboard/src/components/CredentialItem/styles.module.scss @@ -0,0 +1,16 @@ +.row { + display: flex; + margin-bottom: 4px; +} + +.createdAt { + position: absolute; + right: 16px; + bottom: 4px; + font-size: 14px; + color: rgba(0, 0, 0, 0.7); +} + +.prop { + margin: 4px 0; +} diff --git a/apps/dashboard/src/components/CredentialList/CredentialListStore.ts b/apps/dashboard/src/components/CredentialList/CredentialListStore.ts new file mode 100644 index 00000000..13867491 --- /dev/null +++ b/apps/dashboard/src/components/CredentialList/CredentialListStore.ts @@ -0,0 +1,107 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { CredentialRecordDto } from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import displayError from "@dashboard/utils/displayError"; + +class CredentialListStore { + public loading = false; + public items: CredentialRecordDto[] = []; + + public statusChangeId: string | null = null; + constructor() { + makeAutoObservable(this); + } + + public async loadAll(connectionId: string | null) { + runInAction(() => (this.loading = true)); + try { + const items = await api.fetchCredentials( + undefined, + connectionId || undefined, + ); + runInAction(() => { + this.items = items; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } + + public async accept(credId: string) { + runInAction(() => { + this.statusChangeId = credId; + }); + try { + const credRecord = await api.acceptCredential({ + credentialId: credId, + credentialUrl: "", + }); + runInAction(() => { + const index = this.items.findIndex((p) => p.id === credRecord.id); + if (index >= 0) { + this.items[index] = credRecord; + } + this.statusChangeId = null; + }); + toast.success("Credential offer accepted"); + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.loading = false; + this.statusChangeId = null; + }); + } + } + + public async decline(credId: string) { + runInAction(() => { + this.statusChangeId = credId; + }); + try { + const credRecord = await api.declineCredential(credId); + runInAction(() => { + const index = this.items.findIndex((p) => p.id === credRecord.id); + if (index >= 0) { + this.items[index] = credRecord; + } + this.statusChangeId = null; + }); + toast.success("Credential offer declined"); + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.loading = false; + this.statusChangeId = null; + }); + } + } + + public async remove(credId: string) { + runInAction(() => { + this.statusChangeId = credId; + }); + try { + await api.deleteCredentialById(credId); + runInAction(() => { + const index = this.items.findIndex((p) => p.id === credId); + if (index >= 0) { + this.items.splice(index, 1); + } + this.statusChangeId = null; + }); + toast.success("Credential record deleted successfully"); + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.loading = false; + this.statusChangeId = null; + }); + } + } +} + +export type { CredentialListStore }; + +export default CredentialListStore; diff --git a/apps/dashboard/src/components/CredentialList/index.tsx b/apps/dashboard/src/components/CredentialList/index.tsx new file mode 100644 index 00000000..cdea9914 --- /dev/null +++ b/apps/dashboard/src/components/CredentialList/index.tsx @@ -0,0 +1,64 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Spin } from "antd"; +import CredentialItem from "@dashboard/components/CredentialItem"; +import CredentialListStore from "./CredentialListStore"; +import NoRecordsMessage from "../NoRecordsMessage"; +import modalStore from "@dashboard/store/modalStore"; + +export interface CredentialListProps { + connectionId: string | null; +} + +const CredentialList: React.FC<CredentialListProps> = observer( + ({ connectionId }) => { + const [store] = useState(() => new CredentialListStore()); + + useEffect(() => { + store.loadAll(connectionId); + }, [store, connectionId]); + + const handleDelete = async (credId: string) => { + modalStore.openConfirmDialog({ + title: "Are you sure you want to delete this credential record?", + description: "", + dangerOk: true, + onOk: async (e) => { + await store.remove(credId); + e.close(); + }, + }); + }; + + const handleDecline = async (credId: string) => { + modalStore.openConfirmDialog({ + title: "Are you sure you want to decline this credential offer?", + description: "", + dangerOk: true, + onOk: async (e) => { + await store.decline(credId); + e.close(); + }, + }); + }; + + return ( + <div> + {store.items.map((p) => ( + <CredentialItem + key={p.id} + item={p} + onAccept={() => store.accept(p.id!)} + onDecline={() => handleDecline(p.id!)} + statusChanging={store.statusChangeId === p.id} + onRemove={() => handleDelete(p.id!)} + /> + ))} + {!store.loading && !store.items.length && <NoRecordsMessage />} + {store.loading && <Spin />} + </div> + ); + }, +); + +export default CredentialList; diff --git a/apps/dashboard/src/components/CredentialList/styles.module.scss b/apps/dashboard/src/components/CredentialList/styles.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/apps/dashboard/src/components/JsonDetails/index.tsx b/apps/dashboard/src/components/JsonDetails/index.tsx new file mode 100644 index 00000000..a2a4ed5a --- /dev/null +++ b/apps/dashboard/src/components/JsonDetails/index.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import { observer } from "mobx-react"; +import s from "./styles.module.scss"; + +interface JsonDetailsProps { + //TODO: this should be fixed + // eslint-disable-next-line @typescript-eslint/no-explicit-any + object: any; + onClick?: () => void; +} + +const JsonDetails = observer(({ object }: JsonDetailsProps) => { + return ( + <div className={s.item}> + <pre> + {object && + typeof object === "object" && + JSON.stringify(object, null, 2)} + {!object && "Empty"} + </pre> + </div> + ); +}); + +export default JsonDetails; diff --git a/apps/dashboard/src/components/JsonDetails/styles.module.scss b/apps/dashboard/src/components/JsonDetails/styles.module.scss new file mode 100644 index 00000000..933e3f77 --- /dev/null +++ b/apps/dashboard/src/components/JsonDetails/styles.module.scss @@ -0,0 +1,24 @@ +.item { + display: flex; + flex-direction: row; + margin: 4px 0; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 12px; + background: rgba(0, 0, 0, 0.04); + padding: 8px; + position: relative; + word-wrap: break-word; + overflow: auto; + + pre { + padding: 0; + margin: 0; + background: transparent; + } +} + +.title { + font-size: 18px; + font-weight: bold; + margin-bottom: 8px; +} diff --git a/apps/dashboard/src/components/Modal/Body.tsx b/apps/dashboard/src/components/Modal/Body.tsx new file mode 100644 index 00000000..a2e55d50 --- /dev/null +++ b/apps/dashboard/src/components/Modal/Body.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import classNames from "classnames"; +import s from "./styles.module.scss"; + +export interface BodyProps { + className?: string; + children: React.ReactNode; +} + +const Body = ({ children, className }: BodyProps) => ( + <div className={classNames(s.body, className)}>{children}</div> +); + +export default Body; diff --git a/apps/dashboard/src/components/Modal/Footer.tsx b/apps/dashboard/src/components/Modal/Footer.tsx new file mode 100644 index 00000000..195b8b00 --- /dev/null +++ b/apps/dashboard/src/components/Modal/Footer.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import s from "./styles.module.scss"; + +export interface FooterProps { + children: React.ReactNode; +} + +const Footer = ({ children }: FooterProps) => ( + <div className={s.footer}>{children}</div> +); + +export default Footer; diff --git a/apps/dashboard/src/components/Modal/index.tsx b/apps/dashboard/src/components/Modal/index.tsx new file mode 100644 index 00000000..b9b6eb98 --- /dev/null +++ b/apps/dashboard/src/components/Modal/index.tsx @@ -0,0 +1,60 @@ +import React, { useEffect, useState } from "react"; +import { Modal as ModalAntd } from "antd"; +import Body from "./Body"; +import Footer from "./Footer"; + +export interface ModalEvent { + close: () => void; +} + +export interface FcProps<TData> { + setTitle: (title: string) => void; + setClassName: (name: string) => void; + setWrapClassName: (name: string) => void; + setWidth: (width: string | number) => void; + onClose: () => void; + data: TData; +} + +export interface ModalProps<TData> { + Component: React.FC<FcProps<TData>>; + onClose: () => void; + data: TData; +} + +function Modal<TData>({ Component, onClose, data }: ModalProps<TData>) { + const [title, setTitle] = useState("Loading"); + const [className, setClassName] = useState<string | undefined>(); + const [width, setWidth] = useState<string | number | undefined>(); + const [wrapClassName, setWrapClassName] = useState<string | undefined>(); + const [open, setOpen] = useState(false); + + useEffect(() => setOpen(true), []); + + return ( + <ModalAntd + title={title} + open={open} + footer={null} + width={width} + className={className} + wrapClassName={wrapClassName} + onCancel={onClose} + maskClosable={false} + > + <Component + setTitle={setTitle} + onClose={onClose} + setWidth={setWidth} + setClassName={setClassName} + setWrapClassName={setWrapClassName} + data={data} + /> + </ModalAntd> + ); +} + +Modal.Body = Body; +Modal.Footer = Footer; + +export default Modal; diff --git a/apps/dashboard/src/components/Modal/styles.module.scss b/apps/dashboard/src/components/Modal/styles.module.scss new file mode 100644 index 00000000..3c1584db --- /dev/null +++ b/apps/dashboard/src/components/Modal/styles.module.scss @@ -0,0 +1,14 @@ +.body { + display: flex; + flex-direction: column; +} + +.footer { + display: flex; + margin: 12px 4px; + align-items: flex-end; + justify-content: center; + & > * { + margin-left: 8px; + } +} diff --git a/apps/dashboard/src/components/NoRecordsMessage/index.tsx b/apps/dashboard/src/components/NoRecordsMessage/index.tsx new file mode 100644 index 00000000..e5306460 --- /dev/null +++ b/apps/dashboard/src/components/NoRecordsMessage/index.tsx @@ -0,0 +1,8 @@ +import React from "react"; +import { observer } from "mobx-react"; + +const NoRecordsMessage = observer(() => { + return <div>No data</div>; +}); + +export default NoRecordsMessage; diff --git a/apps/dashboard/src/components/Page/index.tsx b/apps/dashboard/src/components/Page/index.tsx new file mode 100644 index 00000000..22f65ea2 --- /dev/null +++ b/apps/dashboard/src/components/Page/index.tsx @@ -0,0 +1,11 @@ +import React from "react"; +import s from "./styles.module.scss"; + +interface Props { + children: React.ReactNode; +} +const PageWithSidebar: React.FC<Props> = ({ children }) => { + return <div className={s.body}>{children}</div>; +}; + +export default PageWithSidebar; diff --git a/apps/dashboard/src/components/Page/styles.module.scss b/apps/dashboard/src/components/Page/styles.module.scss new file mode 100644 index 00000000..b0f27b92 --- /dev/null +++ b/apps/dashboard/src/components/Page/styles.module.scss @@ -0,0 +1,11 @@ +.body { + display: flex; + overflow: auto; + scroll-behavior: smooth; + flex-grow: 1; + flex-direction: column; + flex-shrink: 0; + min-width: 400px; + max-width: 100%; + background-color: #f4f6f7; +} diff --git a/apps/dashboard/src/components/PageTitle/index.tsx b/apps/dashboard/src/components/PageTitle/index.tsx new file mode 100644 index 00000000..57e2bccb --- /dev/null +++ b/apps/dashboard/src/components/PageTitle/index.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import s from "./styles.module.scss"; + +interface Props { + children: React.ReactNode; +} + +const PageTitle: React.FC<Props> = ({ children }) => { + return <div className={s.title}>{children}</div>; +}; + +export default PageTitle; diff --git a/apps/dashboard/src/components/PageTitle/styles.module.scss b/apps/dashboard/src/components/PageTitle/styles.module.scss new file mode 100644 index 00000000..1725213e --- /dev/null +++ b/apps/dashboard/src/components/PageTitle/styles.module.scss @@ -0,0 +1,7 @@ +.title { + text-align: center; + padding: 16px; + font-size: 28px; + color: #14b7cc; + font-weight: bold; +} diff --git a/apps/dashboard/src/components/PageWithSidebar/index.tsx b/apps/dashboard/src/components/PageWithSidebar/index.tsx new file mode 100644 index 00000000..1e33d2cb --- /dev/null +++ b/apps/dashboard/src/components/PageWithSidebar/index.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import Sidebar from "../Sidebar"; +import s from "./styles.module.scss"; + +interface Props { + children: React.ReactNode; +} + +const PageWithSidebar: React.FC<Props> = ({ children }) => { + return ( + <div className={s.body}> + <Sidebar /> + <div className={s.workspaceArea}> + <div className={s.content}>{children}</div> + </div> + </div> + ); +}; + +export default PageWithSidebar; diff --git a/apps/dashboard/src/components/PageWithSidebar/styles.module.scss b/apps/dashboard/src/components/PageWithSidebar/styles.module.scss new file mode 100644 index 00000000..a5271157 --- /dev/null +++ b/apps/dashboard/src/components/PageWithSidebar/styles.module.scss @@ -0,0 +1,22 @@ +.body { + display: flex; + flex-grow: 1; + background-color: #f4f6f7; +} + +.workspaceArea { + display: flex; + overflow: auto; + scroll-behavior: smooth; + flex-grow: 1; + margin-left: 260px; +} + +.content { + display: flex; + flex-direction: column; + flex-grow: 1; + flex-shrink: 0; + min-width: 400px; + max-width: 100%; +} diff --git a/apps/dashboard/src/components/ProofItem/index.tsx b/apps/dashboard/src/components/ProofItem/index.tsx new file mode 100644 index 00000000..ceb44f31 --- /dev/null +++ b/apps/dashboard/src/components/ProofItem/index.tsx @@ -0,0 +1,93 @@ +import React, { useState } from "react"; +import { observer } from "mobx-react"; +import { Button, Space, Tag } from "antd"; +import api, { ProofRecordDto } from "@dashboard/engine-api"; +import format from "date-fns/format"; +import modalStore from "@dashboard/store/modalStore"; +import RecordItem from "../RecordItem"; +import s from "./styles.module.scss"; +import displayError from "@dashboard/utils/displayError"; + +interface ProofItemProps { + item: ProofRecordDto; + onOpen?: () => void; + onRemove?: () => void; + onAccept?: () => void; + onDecline?: () => void; + statusChanging?: boolean; +} + +const ProofItem = observer( + ({ + item, + onOpen, + onRemove, + onAccept, + onDecline, + statusChanging, + }: ProofItemProps) => { + const [loadingFormatData, setLoadingFormatData] = useState(false); + const [formatData, setFormatData] = useState<unknown>(null); + + const openFormatData = async () => { + if (!formatData) { + setLoadingFormatData(true); + try { + const formatData = await api.getProofFormatDataById(item.id!); + setFormatData(formatData); + setLoadingFormatData(false); + modalStore.openViewJsonDialog({ data: formatData }); + return; + } catch (e: unknown) { + displayError(e); + setLoadingFormatData(false); + return; + } + } + + modalStore.openViewJsonDialog({ data: formatData }); + }; + + return ( + <RecordItem rawData={item}> + <div className={s.prop}> + Status: <Tag>{item.state}</Tag> + </div> + <div className={s.prop}>ProofId: {item.id}</div> + + <div className={s.createdAt}> + {item.createdAt && format(item.createdAt, "dd.MM.yyyy HH:mm:ss")} + </div> + + <Space direction="horizontal"> + {onOpen && <Button onClick={onOpen}>Go to credential</Button>} + <Button + type="primary" + disabled={loadingFormatData} + loading={loadingFormatData} + onClick={openFormatData} + > + View Format Data + </Button> + {onAccept && item.state === "request-received" && ( + <Button disabled={statusChanging} onClick={onAccept} type="primary"> + Accept + </Button> + )} + {onDecline && item.state === "request-received" && ( + <Button disabled={statusChanging} onClick={onDecline} danger> + Decline + </Button> + )} + {onRemove && ( + <Button disabled={statusChanging} danger onClick={onRemove}> + Delete + </Button> + )} + </Space> + </RecordItem> + ); + }, +); + +export default ProofItem; diff --git a/apps/dashboard/src/components/ProofItem/styles.module.scss b/apps/dashboard/src/components/ProofItem/styles.module.scss new file mode 100644 index 00000000..932e36d3 --- /dev/null +++ b/apps/dashboard/src/components/ProofItem/styles.module.scss @@ -0,0 +1,11 @@ +.createdAt { + position: absolute; + right: 16px; + bottom: 4px; + font-size: 14px; + color: rgba(0, 0, 0, 0.7); +} + +.prop { + margin: 4px 0; +} diff --git a/apps/dashboard/src/components/ProofList/ProofListStore.ts b/apps/dashboard/src/components/ProofList/ProofListStore.ts new file mode 100644 index 00000000..a22c489e --- /dev/null +++ b/apps/dashboard/src/components/ProofList/ProofListStore.ts @@ -0,0 +1,105 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { ProofRecordDto } from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import displayError from "@dashboard/utils/displayError"; + +class ProofListStore { + public loading = false; + public items: ProofRecordDto[] = []; + + public statusChangeId: string | null = null; + + constructor() { + makeAutoObservable(this); + } + + public async loadAll(connectionId: string | null) { + runInAction(() => (this.loading = true)); + try { + const items = await api.fetchProofs(undefined, connectionId || undefined); + runInAction(() => { + this.items = items; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } + + public async accept(proofRecordId: string) { + runInAction(() => { + this.statusChangeId = proofRecordId; + }); + try { + const credRecord = await api.acceptProof({ + proofId: proofRecordId, + proofUrl: "", + }); + runInAction(() => { + const index = this.items.findIndex((p) => p.id === credRecord.id); + if (index >= 0) { + this.items[index] = credRecord; + } + this.statusChangeId = null; + }); + toast.success("Proof request accepted and credential data is shared"); + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.loading = false; + this.statusChangeId = null; + }); + } + } + + public async decline(proofRecordId: string) { + runInAction(() => { + this.statusChangeId = proofRecordId; + }); + try { + const credRecord = await api.declineProofRequest(proofRecordId); + runInAction(() => { + const index = this.items.findIndex((p) => p.id === credRecord.id); + if (index >= 0) { + this.items[index] = credRecord; + } + this.statusChangeId = null; + }); + toast.success("Proof request declined"); + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.loading = false; + this.statusChangeId = null; + }); + } + } + + public async remove(proofRecordId: string) { + runInAction(() => { + this.statusChangeId = proofRecordId; + }); + try { + await api.deleteProofById(proofRecordId); + runInAction(() => { + const index = this.items.findIndex((p) => p.id === proofRecordId); + if (index >= 0) { + this.items.splice(index, 1); + } + this.statusChangeId = null; + }); + toast.success("proof request deleted successfully"); + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.loading = false; + this.statusChangeId = null; + }); + } + } +} + +export type { ProofListStore }; + +export default ProofListStore; diff --git a/apps/dashboard/src/components/ProofList/index.tsx b/apps/dashboard/src/components/ProofList/index.tsx new file mode 100644 index 00000000..1faf09ac --- /dev/null +++ b/apps/dashboard/src/components/ProofList/index.tsx @@ -0,0 +1,62 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Spin } from "antd"; +import ProofListStore from "./ProofListStore"; +import NoRecordsMessage from "../NoRecordsMessage"; +import ProofItem from "@dashboard/components/ProofItem"; +import modalStore from "@dashboard/store/modalStore"; + +export interface ProofListProps { + connectionId: string | null; +} + +const ProofList: React.FC<ProofListProps> = observer(({ connectionId }) => { + const [store] = useState(() => new ProofListStore()); + + useEffect(() => { + store.loadAll(connectionId); + }, [store, connectionId]); + + const handleDelete = async (proofId: string) => { + modalStore.openConfirmDialog({ + title: "Are you sure to delete this proof request?", + description: "", + dangerOk: true, + onOk: async (e) => { + await store.remove(proofId); + e.close(); + }, + }); + }; + + const handleDecline = async (proofId: string) => { + modalStore.openConfirmDialog({ + title: "Are you sure you want to decline this proof request?", + description: "", + dangerOk: true, + onOk: async (e) => { + await store.decline(proofId); + e.close(); + }, + }); + }; + + return ( + <div> + {store.items.map((p) => ( + <ProofItem + key={p.id} + item={p} + onAccept={() => store.accept(p.id!)} + onDecline={() => handleDecline(p.id!)} + statusChanging={store.statusChangeId === p.id} + onRemove={() => handleDelete(p.id!)} + /> + ))} + {!store.loading && !store.items.length && <NoRecordsMessage />} + {store.loading && <Spin />} + </div> + ); +}); + +export default ProofList; diff --git a/apps/dashboard/src/components/RecordItem/index.tsx b/apps/dashboard/src/components/RecordItem/index.tsx new file mode 100644 index 00000000..e6fb7ed1 --- /dev/null +++ b/apps/dashboard/src/components/RecordItem/index.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import { observer } from "mobx-react"; +import classNames from "classnames"; +import modalStore from "@dashboard/store/modalStore"; +import s from "./styles.module.scss"; + +interface RecordItemProps { + children: React.ReactNode; + onClick?: () => void; + rawData?: unknown; +} + +const RecordItem = observer( + ({ children, rawData, onClick }: RecordItemProps) => { + return ( + <div + className={classNames(s.record, { [s.clickable]: onClick })} + onClick={onClick} + > + <> + {rawData && ( + <div + className={s.rawData} + onClick={(e) => { + e.stopPropagation(); + e.preventDefault(); + modalStore.openViewJsonDialog({ data: rawData }); + }} + > + {`{ }`} + </div> + )} + {children} + </> + </div> + ); + }, +); + +export default RecordItem; diff --git a/apps/dashboard/src/components/RecordItem/styles.module.scss b/apps/dashboard/src/components/RecordItem/styles.module.scss new file mode 100644 index 00000000..f9842e34 --- /dev/null +++ b/apps/dashboard/src/components/RecordItem/styles.module.scss @@ -0,0 +1,41 @@ +.record { + width: 100%; + border: 1px solid rgba(0,0,0,.1); + padding: 8px; + position: relative; + overflow: hidden; + background: hsla(0,0%,100%,.7); + max-width: 1080px; + border-radius: 16px; + transition: all .25s ease; + min-height: 36px; + margin: 12px 0; + &:hover { + box-shadow: 0 0 10px -5px rgba(0,0,0,.5) + } +} + +.clickable { + cursor: pointer; +} + +.rawData { + user-select: none; + cursor: pointer; + position: absolute; + right: 8px; + top: 6px; + font-size: 14px; + color: #06b4cb; + background-color: #d4eef2; + padding: 4px 8px; + font-weight: bold; + border-radius: 4px; + display: none; + .record:hover & { + display: block; + } + &:hover { + background-color: #c1e2e7; + } +} diff --git a/apps/dashboard/src/components/RequireAuth/index.tsx b/apps/dashboard/src/components/RequireAuth/index.tsx new file mode 100644 index 00000000..f9911f3f --- /dev/null +++ b/apps/dashboard/src/components/RequireAuth/index.tsx @@ -0,0 +1,37 @@ +import * as React from "react"; +import { useLocation, Navigate } from "react-router-dom"; +import { observer } from "mobx-react"; +import useGlobalAuth from "@dashboard/hooks/useGlobalAuth"; +import config from "@dashboard/routes/config"; +import { Spin } from "antd"; + +export interface RequireAuthProps { + children: React.JSX.Element; +} + +const RequireAuth = observer(({ children }: RequireAuthProps) => { + const { loading, authorized } = useGlobalAuth(); + const location = useLocation(); + + if (loading) { + return <Spin />; + } + + if (!authorized) { + // Redirect them to the /login page, but save the current location they were + // trying to go to when they were redirected. This allows us to send them + // along to that page after they login, which is a nicer user experience + // than dropping them off on the home page. + return ( + <Navigate + to={config.login.getLink()} + state={{ from: location }} + replace + /> + ); + } + + return children; +}); + +export default RequireAuth; diff --git a/apps/dashboard/src/components/SchemaItem/index.tsx b/apps/dashboard/src/components/SchemaItem/index.tsx new file mode 100644 index 00000000..aee31ec3 --- /dev/null +++ b/apps/dashboard/src/components/SchemaItem/index.tsx @@ -0,0 +1,43 @@ +import React from "react"; +import { observer } from "mobx-react"; +import { SchemaRecordDto } from "@dashboard/engine-api"; +import { Tag } from "antd"; +import s from "./styles.module.scss"; +import RecordItem from "../RecordItem"; + +interface SchemaItemProps { + item: SchemaRecordDto; + onClick?: () => void; +} + +const SchemaItem = observer(({ item, onClick }: SchemaItemProps) => { + return ( + <RecordItem onClick={onClick} rawData={item}> + <div className={s.prop}> + Name: <b>{item.name}</b> + </div> + <div className={s.prop}> + SchemaId: <b>{item.id}</b> + </div> + <div className={s.prop}> + issuerId: <b>{item.issuerId}</b> + </div> + <div className={s.prop}> + methodName: <b>{item.methodName}</b> + </div> + <div className={s.prop}> + version: <b>{item.version}</b> + </div> + <div> + Attributes:{" "} + {item.attributes?.map((p) => ( + <Tag color="green" key={p}> + {p} + </Tag> + ))} + </div> + </RecordItem> + ); +}); + +export default SchemaItem; diff --git a/apps/dashboard/src/components/SchemaItem/styles.module.scss b/apps/dashboard/src/components/SchemaItem/styles.module.scss new file mode 100644 index 00000000..9183a0fe --- /dev/null +++ b/apps/dashboard/src/components/SchemaItem/styles.module.scss @@ -0,0 +1,3 @@ +.prop { + margin: 4px 0; +} diff --git a/apps/dashboard/src/components/Sidebar/index.tsx b/apps/dashboard/src/components/Sidebar/index.tsx new file mode 100644 index 00000000..3ccd9cf6 --- /dev/null +++ b/apps/dashboard/src/components/Sidebar/index.tsx @@ -0,0 +1,44 @@ +import React from "react"; +import { Link } from "react-router-dom"; +import config from "@dashboard/routes/config"; +import s from "./styles.module.scss"; + +const Sidebar = () => { + return ( + <div className={s.sidebar}> + <div className={s.sidebarBar} /> + <div className={s.title}>OCM engine UI</div> + <Link className={s.link} to={config.connection_list.getLink()}> + Contacts + </Link> + <Link className={s.link} to={config.credential_list.getLink()}> + Credentials + </Link> + <Link className={s.link} to={config.proof_list.getLink()}> + Proof Requests + </Link> + <div className={s.subTitle}>Administration</div> + <Link className={s.link} to={config.schema_list.getLink()}> + Schemas + </Link> + <Link className={s.link} to={config.cred_def_list.getLink()}> + Credential Definitions + </Link> + <Link className={s.link} to={config.createdDids.getLink()}> + Your DIDs + </Link> + <Link className={s.link} to={config.resolveDid.getLink()}> + Resolve did + </Link> + <Link className={s.link} to={config.vcmSelfIssue.getLink()}> + VCM self-issued credentials + </Link> + <div className={s.space} /> + <Link className={s.logoutLink} to={config.welcome.getLink()}> + Logout + </Link> + </div> + ); +}; + +export default Sidebar; diff --git a/apps/dashboard/src/components/Sidebar/styles.module.scss b/apps/dashboard/src/components/Sidebar/styles.module.scss new file mode 100644 index 00000000..37dbeccb --- /dev/null +++ b/apps/dashboard/src/components/Sidebar/styles.module.scss @@ -0,0 +1,57 @@ +.sidebar { + width: 250px; + height: 100vh; + position: fixed; + left: 0; + top: 0; + background-color: #333f51; + overflow: auto; + transition: all 0.3s; + display: flex; + flex-direction: column; +} +.sidebarBar { + position: absolute; + right: 0; + top: 0; + bottom: 0; + width: 6px; + background-color: #c7ced4; +} + +.link { + display: block; + padding: 10px 20px; + color: #fff; + text-decoration: none; + font-size: 16px; + transition: all 0.3s; + + &:hover { + background-color: rgba(255,255,255,0.08); + color: #00B3CA; + } +} + +.logoutLink { + @extend .link; + text-align: center; +} + +.title { + padding: 20px 8px 20px 16px; + font-weight: bold; + font-size: 24px; + color: #fff; +} + +.subTitle { + color: #fff; + font-weight: bold; + font-size: 20px; + padding: 30px 8px 16px 16px; +} + +.space { + flex-grow: 1; +} diff --git a/apps/dashboard/src/components/VaultHeader/index.tsx b/apps/dashboard/src/components/VaultHeader/index.tsx new file mode 100644 index 00000000..27d829d3 --- /dev/null +++ b/apps/dashboard/src/components/VaultHeader/index.tsx @@ -0,0 +1,53 @@ +import React from "react"; +import { Link } from "react-router-dom"; +import config from "@dashboard/routes/config"; +import s from "./styles.module.scss"; + +interface Props { + hideTry?: boolean; +} + +const VaultHeader: React.FC<Props> = ({ hideTry }) => { + return ( + <div className={s.root}> + <div className={s.vault}> + <div className={s.columns}> + <div className={s.column}> + <div className={s.title}>Organization Credential Manager (OCM)</div> + <p className={s.ultraText}> + An advanced solution for medium to large enterprises to manage and + deploy Verifiable Credentials seamlessly. + </p> + <p className={s.specialText}> + Whether you're looking for on-premises, cloud-based, or a SaaS + model, OCM is ready to cater to your needs. Experience our + user-friendly demo interface, and discover a robust backend that's + deployment-ready for any use case. + </p> + {!hideTry && ( + <Link to={config.login.getLink()}> + <div className={s.tryIt}>Try it</div> + </Link> + )} + </div> + <div className={s.column}> + <div className={s.toDashboard}> + <Link to={config.connection_list.getLink()}> + Jump to dashboard + </Link> + </div> + <div> + <img + className={s.vaultImage} + src="/assets/vault_image.png" + alt="vault product" + /> + </div> + </div> + </div> + </div> + </div> + ); +}; + +export default VaultHeader; diff --git a/apps/dashboard/src/components/VaultHeader/styles.module.scss b/apps/dashboard/src/components/VaultHeader/styles.module.scss new file mode 100644 index 00000000..d60adbf7 --- /dev/null +++ b/apps/dashboard/src/components/VaultHeader/styles.module.scss @@ -0,0 +1,84 @@ +.root { + background-color: black; + color: #fff; + display: flex; + align-items: center; + justify-content: center; +} +.vault { + max-width: 1400px; + justify-content: space-between; + flex-direction: column; + padding: 80px 0; + overflow: hidden; +} + +.columns { + display: flex; + width: 100%; + position: relative; + justify-content: center; + align-items: stretch; + gap: 30px; +} + +.column { + width: 50%; + font-size: 20px; + justify-content: center; + display: flex; + flex-direction: column; + padding: 20px; +} + +.title { + text-align: left; + font-size: 38px; + font-family: Helvetica Neue Bold,Helvetica,sans-serif; + background: -webkit-linear-gradient(#6be1f0,#52b4ca); + background-clip: text; + font-weight: bold; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.ultraText { + letter-spacing: 0; + font-size: 30px; + color: #fff; + margin-bottom: 30px; + text-align: left; +} + +.specialText { + font-size: 20px; + letter-spacing: 0; + color: #fff; + text-align: left; +} + +.vaultImage { + position: absolute; + width: 25vw; + left: 70%; + bottom: -25vw; + transform: translateX(-50%) translateY(-20%); + transition: all .2s ease; + &:hover { + width: 27vw; + } +} + +.tryIt { + text-align: center; + margin-top: 20px; + font-size: 90px; + color: #14b7cc; + font-weight: bold; +} + +.toDashboard { + position: absolute; + top: 40px; + right: 150px; +} diff --git a/apps/dashboard/src/favicon.ico b/apps/dashboard/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3468d54388acec967d1f0aeeee1194337652b988 GIT binary patch literal 32038 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 Y*=}-Hj-QULagWDqs`b#6Eock>2Y>VA?f?J) literal 0 HcmV?d00001 diff --git a/apps/dashboard/src/hooks/auth/Provider.tsx b/apps/dashboard/src/hooks/auth/Provider.tsx new file mode 100644 index 00000000..896415c1 --- /dev/null +++ b/apps/dashboard/src/hooks/auth/Provider.tsx @@ -0,0 +1,11 @@ +import useAuth from "./useAuth"; +import AuthContext from "./context"; + +interface Props { + children: React.ReactNode; +} + +export const AuthProvider: React.FC<Props> = ({ children }) => { + const auth = useAuth(); + return <AuthContext.Provider value={auth}>{children}</AuthContext.Provider>; +}; diff --git a/apps/dashboard/src/hooks/auth/context.ts b/apps/dashboard/src/hooks/auth/context.ts new file mode 100644 index 00000000..2bb8a4d1 --- /dev/null +++ b/apps/dashboard/src/hooks/auth/context.ts @@ -0,0 +1,19 @@ +import { createContext } from "react"; + +interface Auth { + authorized: boolean; + loading: boolean; + token: string | null; + setToken: (token: string | null) => void; +} + +const authContext = createContext<Auth>({ + authorized: false, + loading: true, + setToken: () => { + console.warn("Context not overwritten"); + }, + token: null, +}); + +export default authContext; diff --git a/apps/dashboard/src/hooks/auth/useAuth.ts b/apps/dashboard/src/hooks/auth/useAuth.ts new file mode 100644 index 00000000..82e205e3 --- /dev/null +++ b/apps/dashboard/src/hooks/auth/useAuth.ts @@ -0,0 +1,40 @@ +import { useEffect, useState } from "react"; + +const LS_KEY = "token"; + +const useAuth = () => { + const [authorized, setAuthorized] = useState(false); + const [token, setToken] = useState<string | null>(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const lsToken = localStorage.getItem(LS_KEY); + if (lsToken) { + setToken(lsToken); + setAuthorized(true); + } + setLoading(false); + }, []); + + const updateToken = (token: string | null) => { + if (token) { + localStorage.setItem(LS_KEY, token); + setToken(token); + setAuthorized(true); + } else { + localStorage.removeItem(LS_KEY); + setToken(null); + setAuthorized(false); + } + }; + + return { + token, + // TODO disable login functionality + authorized: true, + loading: false, + setToken: updateToken, + }; +}; + +export default useAuth; diff --git a/apps/dashboard/src/hooks/useGlobalAuth.ts b/apps/dashboard/src/hooks/useGlobalAuth.ts new file mode 100644 index 00000000..afe8ead3 --- /dev/null +++ b/apps/dashboard/src/hooks/useGlobalAuth.ts @@ -0,0 +1,12 @@ +import { useContext } from "react"; +import AuthContext from "./auth/context"; + +export const useGlobalAuth = () => { + const context = useContext(AuthContext); + if (!context) { + throw new Error("useGlobalAuth must be used within an AuthProvider"); + } + return context; +}; + +export default useGlobalAuth; diff --git a/apps/dashboard/src/hooks/withAuthorize.ts b/apps/dashboard/src/hooks/withAuthorize.ts new file mode 100644 index 00000000..b6b018d4 --- /dev/null +++ b/apps/dashboard/src/hooks/withAuthorize.ts @@ -0,0 +1,31 @@ +import { useEffect, useState } from "react"; + +const LS_KEY = "token"; + +const useAuth = () => { + const [authorized, setAuthorized] = useState(false); + const [loading, setLoading] = useState(true); + + useEffect(() => { + localStorage.getItem(LS_KEY) && setAuthorized(true); + setLoading(false); + }, []); + + const setToken = (token: string | null) => { + if (token) { + localStorage.setItem(LS_KEY, token); + setAuthorized(true); + } else { + localStorage.removeItem(LS_KEY); + setAuthorized(false); + } + }; + + return { + authorized, + loading, + setToken, + }; +}; + +export default useAuth; diff --git a/apps/dashboard/src/index.html b/apps/dashboard/src/index.html new file mode 100644 index 00000000..f42b4596 --- /dev/null +++ b/apps/dashboard/src/index.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8" /> + <title>OCM engine dashboard</title> + <base href="/" /> + + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link rel="icon" type="image/x-icon" href="favicon.ico" /> + <link rel="icon" type="image/x-icon" href="assets/Vereign_Logo_ICON_BLACK.png" /> + + <script src="assets/config.js"></script> + </head> + <body> + <div id="root"></div> + </body> +</html> diff --git a/apps/dashboard/src/main.tsx b/apps/dashboard/src/main.tsx new file mode 100644 index 00000000..0e7223c9 --- /dev/null +++ b/apps/dashboard/src/main.tsx @@ -0,0 +1,50 @@ +import * as ReactDOM from "react-dom/client"; +import { BrowserRouter } from "react-router-dom"; +import { ConfigProvider } from "antd"; +import getConfig from "./utils/getConfig"; +import App from "./components/App"; + +import ocmApi, { setConfig as setOcmEngineConfig } from "@dashboard/engine-api"; +import tsaApi, { setConfig as setTsaConfig } from "@dashboard/tsa-api"; +import { AuthProvider } from "@dashboard/hooks/auth/Provider"; + +import "normalize.css"; +import "react-toastify/dist/ReactToastify.css"; +import "@fontsource/roboto"; +import "@fontsource/roboto/500.css"; +import "@fontsource/roboto/700.css"; + +const config = getConfig(); + +setOcmEngineConfig({ + wsUrl: config.OCMENGINE_WS_URL, + httpUrl: config.OCMENGINE_HTTP_URL, + getToken: async () => "", +}); + +setTsaConfig({ + tsaUrl: config.TSA_URL, +}); + +ocmApi.initialize(); +tsaApi.initialize(); + +const root = ReactDOM.createRoot( + document.getElementById("root") as HTMLElement, +); +root.render( + <BrowserRouter basename={window.BASE_PATH}> + <ConfigProvider + theme={{ + token: { + colorPrimary: "#06b4cb", + fontFamily: "Roboto", + }, + }} + > + <AuthProvider> + <App /> + </AuthProvider> + </ConfigProvider> + </BrowserRouter>, +); diff --git a/apps/dashboard/src/modals/AcceptConnectionlessCredentialOfferDialog/index.tsx b/apps/dashboard/src/modals/AcceptConnectionlessCredentialOfferDialog/index.tsx new file mode 100644 index 00000000..11aa9101 --- /dev/null +++ b/apps/dashboard/src/modals/AcceptConnectionlessCredentialOfferDialog/index.tsx @@ -0,0 +1,85 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Form, Input, Button } from "antd"; +import api, { CredentialRecordDto } from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import s from "./styles.module.scss"; +import displayError from "@dashboard/utils/displayError"; + +export interface AcceptConnectionlessCredentialOfferDialogProps { + onCredentialReceived: (credentialRecord: CredentialRecordDto) => void; +} + +const AcceptConnectionlessCredentialOfferDialog = observer( + ({ + setTitle, + onClose, + data, + }: FcProps<AcceptConnectionlessCredentialOfferDialogProps>) => { + useEffect(() => { + setTitle("Accept credential by URL"); + }, [setTitle]); + + const [loading, setLoading] = useState(false); + + const onFinish = async ({ credentialUrl }: { credentialUrl: string }) => { + try { + setLoading(true); + const credentialRecord = await api.acceptCredential({ + credentialUrl, + credentialId: "", + }); + + if (credentialRecord) { + toast.success(`Credential offer accepted`); + data.onCredentialReceived(credentialRecord); + onClose(); + } + } catch (e: unknown) { + displayError(e); + } + setLoading(false); + }; + + return ( + <Modal.Body> + <div className={s.body}> + <Form + layout="vertical" + initialValues={{ + credentialUrl: "", + }} + onFinish={onFinish} + autoComplete="off" + > + <Form.Item + label="credential url" + name="credentialUrl" + rules={[ + { required: true, message: "Please enter credential url!" }, + ]} + > + <Input.TextArea rows={12} /> + </Form.Item> + + <div className={s.footerActions}> + <Button type="primary" htmlType="submit" disabled={loading}> + Accept Offer + </Button> + <Button + className={s.cancelButton} + onClick={onClose} + disabled={loading} + > + Close + </Button> + </div> + </Form> + </div> + </Modal.Body> + ); + }, +); + +export default AcceptConnectionlessCredentialOfferDialog; diff --git a/apps/dashboard/src/modals/AcceptConnectionlessCredentialOfferDialog/styles.module.scss b/apps/dashboard/src/modals/AcceptConnectionlessCredentialOfferDialog/styles.module.scss new file mode 100644 index 00000000..5cc463b5 --- /dev/null +++ b/apps/dashboard/src/modals/AcceptConnectionlessCredentialOfferDialog/styles.module.scss @@ -0,0 +1,4 @@ +.footerActions { + display: flex; + justify-content: space-around; +} diff --git a/apps/dashboard/src/modals/AcceptConnectionlessProofRequestDialog/index.tsx b/apps/dashboard/src/modals/AcceptConnectionlessProofRequestDialog/index.tsx new file mode 100644 index 00000000..7d750bef --- /dev/null +++ b/apps/dashboard/src/modals/AcceptConnectionlessProofRequestDialog/index.tsx @@ -0,0 +1,82 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Form, Input, Button } from "antd"; +import api, { ProofRecordDto } from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import s from "./styles.module.scss"; +import displayError from "@dashboard/utils/displayError"; + +export interface AcceptConnectionlessProofRequestDialogProps { + onProofReceived: (proofRecord: ProofRecordDto) => void; +} + +const AcceptConnectionlessProofRequestDialog = observer( + ({ + setTitle, + onClose, + data, + }: FcProps<AcceptConnectionlessProofRequestDialogProps>) => { + useEffect(() => { + setTitle("Accept proof request by URL"); + }, [setTitle]); + + const [loading, setLoading] = useState(false); + + const onFinish = async ({ proofUrl }: { proofUrl: string }) => { + try { + setLoading(true); + const proofRecord = await api.acceptProof({ + proofUrl, + proofId: "", + }); + toast(`Proof request accepted`); + if (proofRecord) { + data.onProofReceived(proofRecord); + onClose(); + } + } catch (e: unknown) { + displayError(e); + } + setLoading(false); + }; + + return ( + <Modal.Body> + <div className={s.body}> + <Form + layout="vertical" + initialValues={{ + proofUrl: "", + }} + onFinish={onFinish} + autoComplete="off" + > + <Form.Item + label="proof url" + name="proofUrl" + rules={[{ required: true, message: "Please enter proof url!" }]} + > + <Input.TextArea rows={12} /> + </Form.Item> + + <div className={s.footerActions}> + <Button type="primary" htmlType="submit" disabled={loading}> + Accept + </Button> + <Button + className={s.cancelButton} + onClick={onClose} + disabled={loading} + > + Close + </Button> + </div> + </Form> + </div> + </Modal.Body> + ); + }, +); + +export default AcceptConnectionlessProofRequestDialog; diff --git a/apps/dashboard/src/modals/AcceptConnectionlessProofRequestDialog/styles.module.scss b/apps/dashboard/src/modals/AcceptConnectionlessProofRequestDialog/styles.module.scss new file mode 100644 index 00000000..5cc463b5 --- /dev/null +++ b/apps/dashboard/src/modals/AcceptConnectionlessProofRequestDialog/styles.module.scss @@ -0,0 +1,4 @@ +.footerActions { + display: flex; + justify-content: space-around; +} diff --git a/apps/dashboard/src/modals/ConfirmDialog/index.tsx b/apps/dashboard/src/modals/ConfirmDialog/index.tsx new file mode 100644 index 00000000..d88a07fd --- /dev/null +++ b/apps/dashboard/src/modals/ConfirmDialog/index.tsx @@ -0,0 +1,58 @@ +import React, { useEffect, useState } from "react"; +import Modal, { FcProps, ModalEvent } from "@dashboard/components/Modal"; +import { Button } from "antd"; +import displayError from "@dashboard/utils/displayError"; + +export interface ConfirmDialogProps { + title: string; + description: string | React.ReactNode; + dangerOk?: boolean; + onOk: (e: ModalEvent) => Promise<void>; + onCancel?: (e: ModalEvent) => Promise<void>; +} + +const ConfirmDialog = ({ + setTitle, + onClose, + data, +}: FcProps<ConfirmDialogProps>) => { + useEffect(() => setTitle(data.title), [setTitle, data.title]); + const [loading, setLoading] = useState(false); + + return ( + <Modal.Body> + <div>{data.description}</div> + <Modal.Footer> + <Button + type="primary" + disabled={loading} + danger={data.dangerOk} + onClick={async () => { + setLoading(true); + try { + await data.onOk({ close: onClose }); + } catch (e: unknown) { + displayError(e); + } + setLoading(false); + }} + > + Confirm + </Button> + <Button + onClick={() => { + onClose(); + data.onCancel && + data.onCancel({ + close: onClose, + }); + }} + > + Cancel + </Button> + </Modal.Footer> + </Modal.Body> + ); +}; + +export default ConfirmDialog; diff --git a/apps/dashboard/src/modals/NewCredentialDefDialog/index.tsx b/apps/dashboard/src/modals/NewCredentialDefDialog/index.tsx new file mode 100644 index 00000000..b60c95b0 --- /dev/null +++ b/apps/dashboard/src/modals/NewCredentialDefDialog/index.tsx @@ -0,0 +1,95 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Form, Input, Button } from "antd"; +import api from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import s from "./styles.module.scss"; +import displayError from "@dashboard/utils/displayError"; + +export interface NewCredentialDefDialogProps { + onCredDefCreated: (credDef: unknown) => void; +} + +const NewCredentialDefDialog = observer( + ({ setTitle, onClose, data }: FcProps<NewCredentialDefDialogProps>) => { + useEffect(() => { + setTitle("Add new credetial definition"); + }, [setTitle]); + const [loading, setLoading] = useState(false); + const onFinish = async ({ + schemaId, + tag, + }: { + schemaId: string; + tag: string; + }) => { + try { + setLoading(true); + + const schema = await api.getSchemaById({ id: schemaId }); + if (!schema) { + throw new Error("Schema with specified id not found"); + } + + const credDef = await api.createCredentialDefinition({ + schemaId, + tag, + }); + console.log(credDef); + toast.success(`New credential definition created`); + data.onCredDefCreated(credDef); + onClose(); + } catch (e: unknown) { + displayError(e); + } + setLoading(false); + }; + + return ( + <Modal.Body> + <div className={s.body}> + <Form + layout="vertical" + initialValues={{ + schemaId: "", + tag: "", + }} + onFinish={onFinish} + autoComplete="off" + > + <Form.Item + label="Schema Id" + name="schemaId" + rules={[{ required: true, message: "Please enter schemaId!" }]} + > + <Input /> + </Form.Item> + <Form.Item + label="Credential definition name" + name="tag" + rules={[{ required: true, message: "Please enter name!" }]} + > + <Input /> + </Form.Item> + + <div className={s.footerActions}> + <Button type="primary" htmlType="submit" disabled={loading}> + Create + </Button> + <Button + className={s.cancelButton} + onClick={onClose} + disabled={loading} + > + Close + </Button> + </div> + </Form> + </div> + </Modal.Body> + ); + }, +); + +export default NewCredentialDefDialog; diff --git a/apps/dashboard/src/modals/NewCredentialDefDialog/styles.module.scss b/apps/dashboard/src/modals/NewCredentialDefDialog/styles.module.scss new file mode 100644 index 00000000..5cc463b5 --- /dev/null +++ b/apps/dashboard/src/modals/NewCredentialDefDialog/styles.module.scss @@ -0,0 +1,4 @@ +.footerActions { + display: flex; + justify-content: space-around; +} diff --git a/apps/dashboard/src/modals/NewSchemaDialog/index.tsx b/apps/dashboard/src/modals/NewSchemaDialog/index.tsx new file mode 100644 index 00000000..c31e905e --- /dev/null +++ b/apps/dashboard/src/modals/NewSchemaDialog/index.tsx @@ -0,0 +1,100 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Form, Input, Button, Select } from "antd"; +import api, { + CreateSchemaRequestDto, + SchemaRecordDto, +} from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import s from "./styles.module.scss"; +import displayError from "@dashboard/utils/displayError"; + +export interface NewSchemaDialogProps { + onSchemaCreated: (schema: SchemaRecordDto) => void; +} + +const NewSchemaDialog = observer( + ({ setTitle, onClose, data }: FcProps<NewSchemaDialogProps>) => { + useEffect(() => { + setTitle("Add new schema"); + }, [setTitle]); + const [loading, setLoading] = useState(false); + + const onFinish = async (values: CreateSchemaRequestDto) => { + try { + setLoading(true); + const schema = await api.createSchema(values); + toast(`New schema ${schema.id} created`); + data.onSchemaCreated(schema); + onClose(); + } catch (e: unknown) { + displayError(e); + } + setLoading(false); + }; + + return ( + <Modal.Body> + <div className={s.body}> + <Form + layout="vertical" + style={{ maxWidth: 600 }} + initialValues={{ + name: "", + version: "", + attributes: [], + }} + onFinish={onFinish} + autoComplete="off" + > + <Form.Item + label="Name" + name="name" + rules={[{ required: true, message: "Please enter name!" }]} + > + <Input /> + </Form.Item> + <Form.Item + label="Version" + name="version" + rules={[ + { required: true, message: "Please enter version!" }, + { + pattern: /^(\d+\.)?(\d+\.)?(\*|\d+)$/, + message: 'Invalid format. Please enter the version number in the format \'major.minor.patch\', e.g., \'1.0.0\', \'1.0\' or \'1\'.', + } + ]} + > + + + <Input /> + </Form.Item> + <Form.Item + label="Attributes" + name="attributes" + rules={[{ required: true, message: "Please enter attributes!" }]} + > + <Select mode="tags" style={{ width: "100%" }} /> + </Form.Item> + + <div className={s.footerActions}> + <Button type="primary" htmlType="submit" disabled={loading}> + Create + </Button> + <Button + className={s.cancelButton} + onClick={onClose} + disabled={loading} + > + Close + </Button> + </div> + </Form> + </div> + </Modal.Body> + ); + }, +); + +export default NewSchemaDialog; diff --git a/apps/dashboard/src/modals/NewSchemaDialog/styles.module.scss b/apps/dashboard/src/modals/NewSchemaDialog/styles.module.scss new file mode 100644 index 00000000..5cc463b5 --- /dev/null +++ b/apps/dashboard/src/modals/NewSchemaDialog/styles.module.scss @@ -0,0 +1,4 @@ +.footerActions { + display: flex; + justify-content: space-around; +} diff --git a/apps/dashboard/src/modals/OfferCredentialDialog/OfferCredentialDialogStore.ts b/apps/dashboard/src/modals/OfferCredentialDialog/OfferCredentialDialogStore.ts new file mode 100644 index 00000000..bc98939c --- /dev/null +++ b/apps/dashboard/src/modals/OfferCredentialDialog/OfferCredentialDialogStore.ts @@ -0,0 +1,84 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { CreddefRecordDto, SchemaRecordDto } from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import displayError from "@dashboard/utils/displayError"; + +class OfferCredentialDialogStore { + public initLoading = false; + public connectionId: string | undefined = undefined; + public credDefList: CreddefRecordDto[] = []; + public selectedCredDefId: string | null = null; + public schemaLoading = false; + public schema: SchemaRecordDto | null = null; + + public issuingLoading = false; + + constructor() { + makeAutoObservable(this); + } + + public async init(connectionId: string | undefined) { + runInAction(() => { + this.initLoading = true; + this.connectionId = connectionId; + }); + try { + const credDefList = await api.fetchCredentialDefinitions(); + runInAction(() => { + this.credDefList = credDefList; + this.initLoading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.initLoading = false)); + } + } + + public selectCredDef = async (credentialDefId: string) => { + runInAction(() => { + this.selectedCredDefId = credentialDefId; + this.schema = null; + this.schemaLoading = true; + }); + const credDef = this.credDefList.find((p) => p.id === credentialDefId); + + try { + const schema = await api.getSchemaById({ id: credDef!.schemaId! }); + runInAction(() => { + this.schema = schema; + this.schemaLoading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.schemaLoading = false)); + } + }; + + public offerCredential = async ( + attributes: { name: string; value: string }[], + ) => { + runInAction(() => (this.issuingLoading = true)); + try { + const cred = await api.offerCredential({ + connectionId: this.connectionId, + credentialDefinitionId: this.selectedCredDefId!, + attributes: attributes, + }); + toast.success("Credential offer sent"); + runInAction(() => { + this.issuingLoading = false; + }); + return cred; + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.issuingLoading = false; + }); + } + return null; + }; +} + +export type { OfferCredentialDialogStore }; + +export default OfferCredentialDialogStore; diff --git a/apps/dashboard/src/modals/OfferCredentialDialog/index.tsx b/apps/dashboard/src/modals/OfferCredentialDialog/index.tsx new file mode 100644 index 00000000..90b3c5e5 --- /dev/null +++ b/apps/dashboard/src/modals/OfferCredentialDialog/index.tsx @@ -0,0 +1,135 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Form, Input, Button, Spin, Select } from "antd"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import { CredentialOfferResponseDto } from "@dashboard/engine-api"; +import OfferCredentialDialogStore from "./OfferCredentialDialogStore"; + +export interface OfferCredentialDialogProps { + connectionId?: string; + onCredentialOffered: (cred: CredentialOfferResponseDto) => void; +} + +const OfferCredentialDialog = observer( + ({ setTitle, onClose, data }: FcProps<OfferCredentialDialogProps>) => { + const [store] = useState(() => new OfferCredentialDialogStore()); + useEffect(() => { + if (data.connectionId) { + setTitle("Offer credential to " + data.connectionId); + } else { + setTitle("Offer connectionless credential"); + } + store.init(data.connectionId); + }, [store, setTitle, data]); + + const onFinish = async ({ + attributes, + }: { + attributes: { name: string; value: string }[]; + }) => { + const response = await store.offerCredential(attributes); + if (response) { + data.onCredentialOffered(response); + onClose(); + } + }; + + const attributesInitialValue = + store.schema?.attributes.map((p) => ({ + name: p, + value: "", + })) || []; + + return ( + <Modal.Body> + {store.initLoading && <Spin>Loading credential definitions...</Spin>} + {store.schemaLoading && ( + <Spin>Loading credential definition attributes...</Spin> + )} + + <div> + <Form + labelCol={{ span: 8 }} + wrapperCol={{ span: 16 }} + style={{ maxWidth: 600 }} + autoComplete="off" + > + <Form.Item + label="Credential definition" + name="credDef" + rules={[ + { + required: true, + message: "Please select credential definition!", + }, + ]} + > + <Select + style={{ width: 300 }} + value={store.selectedCredDefId} + showSearch + onChange={(val) => store.selectCredDef(val)} + options={store.credDefList.map((p) => ({ + value: p.id, + label: p.tag || p.id, + }))} + /> + </Form.Item> + </Form> + {} + {store.schema && ( + <Form + labelCol={{ span: 8 }} + wrapperCol={{ span: 16 }} + style={{ maxWidth: 600 }} + initialValues={{}} + onFinish={onFinish} + autoComplete="off" + > + <Form.List + name="attributes" + initialValue={attributesInitialValue} + > + {(fields, b, c) => { + return ( + <> + {fields.map((field) => ( + <Form.Item + {...field} + label={attributesInitialValue[field.key].name} + name={[field.name, "value"]} + rules={[ + { + required: true, + message: `Please enter ${ + attributesInitialValue[field.key].name + }!`, + }, + ]} + > + <Input /> + </Form.Item> + ))} + </> + ); + }} + </Form.List> + + <Form.Item wrapperCol={{ offset: 8, span: 16 }}> + <Button + type="primary" + htmlType="submit" + disabled={store.issuingLoading} + > + Submit offer + </Button> + </Form.Item> + </Form> + )} + </div> + </Modal.Body> + ); + }, +); + +export default OfferCredentialDialog; diff --git a/apps/dashboard/src/modals/OfferCredentialDialog/styles.module.scss b/apps/dashboard/src/modals/OfferCredentialDialog/styles.module.scss new file mode 100644 index 00000000..5cc463b5 --- /dev/null +++ b/apps/dashboard/src/modals/OfferCredentialDialog/styles.module.scss @@ -0,0 +1,4 @@ +.footerActions { + display: flex; + justify-content: space-around; +} diff --git a/apps/dashboard/src/modals/ReceiveInvitationDialog/index.tsx b/apps/dashboard/src/modals/ReceiveInvitationDialog/index.tsx new file mode 100644 index 00000000..c55cc2f0 --- /dev/null +++ b/apps/dashboard/src/modals/ReceiveInvitationDialog/index.tsx @@ -0,0 +1,78 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Form, Input, Button } from "antd"; +import api, { ConnectionRecordDto } from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import s from "./styles.module.scss"; +import displayError from "@dashboard/utils/displayError"; + +export interface ReceiveInvitationDialogProps { + onInvitationReceived: (connection: ConnectionRecordDto) => void; +} + +const ReceiveInvitationDialog = observer( + ({ setTitle, onClose, data }: FcProps<ReceiveInvitationDialogProps>) => { + useEffect(() => { + setTitle("Accept invitation"); + }, [setTitle]); + + const [loading, setLoading] = useState(false); + + const onFinish = async ({ invitation }: { invitation: string }) => { + try { + setLoading(true); + const connRecord = await api.acceptInvitation({ + invitationUrl: invitation, + shortInvitationUrl: "", + }); + toast(`Invitation received`); + if (connRecord) { + data.onInvitationReceived(connRecord); + onClose(); + } + } catch (e: unknown) { + displayError(e); + } + setLoading(false); + }; + + return ( + <Modal.Body> + <div className={s.body}> + <Form + layout="vertical" + initialValues={{ + invitation: "", + }} + onFinish={onFinish} + autoComplete="off" + > + <Form.Item + label="outOfBandInvitationUrl" + name="invitation" + rules={[{ required: true, message: "Please enter invitation!" }]} + > + <Input.TextArea rows={12} /> + </Form.Item> + + <div className={s.footerActions}> + <Button type="primary" htmlType="submit" disabled={loading}> + Accept invitation + </Button> + <Button + className={s.cancelButton} + onClick={onClose} + disabled={loading} + > + Close + </Button> + </div> + </Form> + </div> + </Modal.Body> + ); + }, +); + +export default ReceiveInvitationDialog; diff --git a/apps/dashboard/src/modals/ReceiveInvitationDialog/styles.module.scss b/apps/dashboard/src/modals/ReceiveInvitationDialog/styles.module.scss new file mode 100644 index 00000000..5cc463b5 --- /dev/null +++ b/apps/dashboard/src/modals/ReceiveInvitationDialog/styles.module.scss @@ -0,0 +1,4 @@ +.footerActions { + display: flex; + justify-content: space-around; +} diff --git a/apps/dashboard/src/modals/RequestProofDialog/RequestProofDialogStore.ts b/apps/dashboard/src/modals/RequestProofDialog/RequestProofDialogStore.ts new file mode 100644 index 00000000..514018b0 --- /dev/null +++ b/apps/dashboard/src/modals/RequestProofDialog/RequestProofDialogStore.ts @@ -0,0 +1,144 @@ +import { action, makeAutoObservable, runInAction } from "mobx"; +import api, { CreddefRecordDto, SchemaRecordDto } from "@dashboard/engine-api"; +import { toast } from "react-toastify"; +import displayError from "@dashboard/utils/displayError"; + +interface ProofUiAttribute { + credentialDefinitionId: string | null; + schemaLoading: boolean; + schema: SchemaRecordDto | null; + attributeName: string | null; +} + +class RequestProofDialogStore { + public initLoading = false; + public connectionId: string | undefined = undefined; + public credDefList: CreddefRecordDto[] = []; + + public rows: ProofUiAttribute[] = []; + + public issuingLoading = false; + + public get formIsValid() { + if (!this.rows.length) { + toast.error("Your need to create at least one row"); + return false; + } else if ( + this.rows.some((p) => { + return p.attributeName === null || p.credentialDefinitionId === null; + }) + ) { + toast.error("Please fill in all fields"); + return false; + } + return true; + } + + private _schemaCache: { + [id: string]: SchemaRecordDto; + } = {}; + + constructor() { + makeAutoObservable(this); + } + + public async init(connectionId: string | undefined) { + runInAction(() => { + this.initLoading = true; + this.connectionId = connectionId; + }); + try { + const credDefList = await api.fetchCredentialDefinitions(); + runInAction(() => { + this.addRow(); + this.credDefList = credDefList; + this.initLoading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.initLoading = false)); + } + } + + public addRow = action(() => { + this.rows.push({ + credentialDefinitionId: null, + schemaLoading: false, + schema: null, + attributeName: null, + }); + }); + + public removeRow = action((index: number) => { + this.rows.splice(index, 1); + }); + + public selectCredDef = async (index: number, credentialDefId: string) => { + runInAction(() => { + this.rows[index].credentialDefinitionId = credentialDefId; + this.rows[index].schema = null; + this.rows[index].schemaLoading = true; + this.rows[index].attributeName = null; + }); + const credDef = this.credDefList.find((p) => p.id === credentialDefId); + const schemaId = credDef!.schemaId; + + try { + if (this._schemaCache[schemaId]) { + runInAction(() => { + this.rows[index].schema = this._schemaCache[schemaId]; + this.rows[index].schemaLoading = false; + }); + return; + } + + const schema = await api.getSchemaById({ + id: credDef!.schemaId!, + }); + runInAction(() => { + this.rows[index].schema = schema; + this.rows[index].schemaLoading = false; + this._schemaCache[schemaId] = schema; + }); + } catch (e: unknown) { + displayError(e); + } + }; + + public selectAttributeName = action( + (index: number, attributeName: string) => { + this.rows[index].attributeName = attributeName; + }, + ); + + public issueProofRequest = async () => { + if (!this.formIsValid) return; + + runInAction(() => (this.issuingLoading = true)); + try { + const proofRequest = await api.requestProof({ + connectionId: this.connectionId, + attributes: this.rows.map((p) => ({ + attributeName: p.attributeName!, + credentialDefinitionId: p.credentialDefinitionId!, + schemaId: p.schema!.id!, + })), + }); + toast("Proof request created"); + runInAction(() => { + this.issuingLoading = false; + }); + return proofRequest; + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.issuingLoading = false; + }); + } + return null; + }; +} + +export type { RequestProofDialogStore }; + +export default RequestProofDialogStore; diff --git a/apps/dashboard/src/modals/RequestProofDialog/index.tsx b/apps/dashboard/src/modals/RequestProofDialog/index.tsx new file mode 100644 index 00000000..98426a3d --- /dev/null +++ b/apps/dashboard/src/modals/RequestProofDialog/index.tsx @@ -0,0 +1,106 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Button, Spin, Select, Space } from "antd"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import { RequestProofResponseDto } from "@dashboard/engine-api"; +import RequestProofDialogStore from "./RequestProofDialogStore"; +import s from "./styles.module.scss"; + +export interface RequestProofDialogProps { + connectionId?: string; + onProofRequested: (cred: RequestProofResponseDto) => void; +} + +const RequestProofDialog = observer( + ({ setTitle, onClose, data }: FcProps<RequestProofDialogProps>) => { + const [store] = useState(() => new RequestProofDialogStore()); + useEffect(() => { + if (data.connectionId) { + setTitle("Request proof from " + data.connectionId); + } else { + setTitle("Create connectionless proof request"); + } + + store.init(data.connectionId); + }, [store, setTitle, data]); + + return ( + <Modal.Body> + {store.initLoading && <Spin>Loading credential definitions...</Spin>} + + <div> + {store.rows.map((row, rowIndex) => ( + <Space direction="horizontal" className={s.row} key={rowIndex}> + <div className={s.field}> + <div className={s.field__label} /> + <span>{rowIndex + 1}.</span> + </div> + <div className={s.field}> + <div className={s.field__label}> + Credential definition + </div> + <Select + placeholder="Select credential" + // style={{ width: 300 }} + value={row.credentialDefinitionId} + showSearch + onChange={(val) => store.selectCredDef(rowIndex, val)} + options={store.credDefList.map((p) => ({ + value: p.id, + label: p.tag || p.id, + }))} + /> + </div> + {row.schemaLoading && <Spin/>} + {row.schema && ( + <div className={s.field}> + <div className={s.field__label}> + Attribute + </div> + <Select + placeholder="Select attribute" + // style={{ width: 300 }} + value={row.attributeName} + showSearch + onChange={(val) => store.selectAttributeName(rowIndex, val)} + options={row.schema.attributes.map((p) => ({ + value: p, + label: p, + }))} + /> + </div> + )} + <div className={s.field}> + <div className={s.field__label}> </div> + <Button + disabled={row.schemaLoading} + onClick={() => store.removeRow(rowIndex)} + > + Remove + </Button> + </div> + </Space> + ))} + <Space direction="vertical" className={s.actions}> + <Button onClick={() => store.addRow()}>Add row</Button> + <Button + type="primary" + disabled={store.issuingLoading} + onClick={async () => { + const pr = await store.issueProofRequest(); + if (pr) { + data.onProofRequested(pr); + onClose(); + } + }} + > + Request proof + </Button> + </Space> + </div> + </Modal.Body> + ); + }, +); + +export default RequestProofDialog; diff --git a/apps/dashboard/src/modals/RequestProofDialog/styles.module.scss b/apps/dashboard/src/modals/RequestProofDialog/styles.module.scss new file mode 100644 index 00000000..84072c05 --- /dev/null +++ b/apps/dashboard/src/modals/RequestProofDialog/styles.module.scss @@ -0,0 +1,21 @@ +.footerActions { + display: flex; + justify-content: space-around; +} +.row { + display: flex; + margin: 12px 0; +} + +.actions { + margin-top: 12px; +} + +.field { + display: flex; + flex-direction: column; + + &__label { + height: 24px; + } +} diff --git a/apps/dashboard/src/modals/ViewConnectionlessCredentialOffer/index.tsx b/apps/dashboard/src/modals/ViewConnectionlessCredentialOffer/index.tsx new file mode 100644 index 00000000..1307449d --- /dev/null +++ b/apps/dashboard/src/modals/ViewConnectionlessCredentialOffer/index.tsx @@ -0,0 +1,64 @@ +import React, { useEffect } from "react"; +import { observer } from "mobx-react"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import { CredentialRecordDto } from "@dashboard/engine-api"; +import CredentialItem from "@dashboard/components/CredentialItem"; +import { QRCode } from "antd"; +import s from "./styles.module.scss"; + +export interface ViewConnectionlessCredentialOfferProps { + credentialUrl: string | undefined | null; + credentialUrlShort: string | undefined | null; + credentialRecord: CredentialRecordDto; +} + +const ViewConnectionlessCredentialOffer = observer( + ({ + setTitle, + setWidth, + setClassName, + onClose, + data, + }: FcProps<ViewConnectionlessCredentialOfferProps>) => { + useEffect(() => { + setClassName(s.modal); + setWidth("80vw"); + setTitle("Connectionless credential offer"); + }, [setClassName, setWidth, setTitle]); + + return ( + <Modal.Body className={s.body}> + <div className={s.info}> + <div> + <div className={s.qrCodeHint}> + Scan this QR code with mobile wallet + </div> + <div className={s.qrWrapper}> + {data.credentialUrlShort && ( + <QRCode value={data.credentialUrlShort} size={500} /> + )} + </div> + <div> + <div className={s.urlTitle}>Credential offer URL:</div> + <div className={s.url}> + <b>{data.credentialUrl}</b> + </div> + <div className={s.urlTitle}>Credential offer short URL:</div> + <div className={s.url}> + <b>{data.credentialUrlShort}</b> + </div> + {data.credentialRecord && ( + <div> + Details: + <CredentialItem item={data.credentialRecord} /> + </div> + )} + </div> + </div> + </div> + </Modal.Body> + ); + }, +); + +export default ViewConnectionlessCredentialOffer; diff --git a/apps/dashboard/src/modals/ViewConnectionlessCredentialOffer/styles.module.scss b/apps/dashboard/src/modals/ViewConnectionlessCredentialOffer/styles.module.scss new file mode 100644 index 00000000..66d3a4f7 --- /dev/null +++ b/apps/dashboard/src/modals/ViewConnectionlessCredentialOffer/styles.module.scss @@ -0,0 +1,46 @@ +.modal { + top: 40px; +} + +.body { + height: calc(100vh - 140px); +} + +.qrWrapper { + display: flex; + align-items: center; + justify-content: center; + background: white; + padding: 16px; +} + +.info { + display: flex; + flex-direction: column; + justify-content: space-between; + overflow: scroll; +} + +.urlTitle { + margin-top: 12px; + font-weight: bold; +} + +.url { + margin-top: 12px; + word-break: break-word; + border-right: 8px; + background-color: rgba(0,0,0, 0.04); + padding: 8px; +} + +.urlHint { + margin-top: 12px; + font-size: 16px; +} + +.qrCodeHint { + text-align: center; + margin: 24px 0 12px 0; + font-size: 18px; +} \ No newline at end of file diff --git a/apps/dashboard/src/modals/ViewConnectionlessProofRequest/index.tsx b/apps/dashboard/src/modals/ViewConnectionlessProofRequest/index.tsx new file mode 100644 index 00000000..97c26016 --- /dev/null +++ b/apps/dashboard/src/modals/ViewConnectionlessProofRequest/index.tsx @@ -0,0 +1,64 @@ +import React, { useEffect } from "react"; +import { observer } from "mobx-react"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import { ProofRecordDto } from "@dashboard/engine-api"; +import ProofItem from "@dashboard/components/ProofItem"; +import { QRCode } from "antd"; +import s from "./styles.module.scss"; + +export interface ViewConnectionlessProofRequestProps { + proofUrl: string | undefined | null; + proofUrlShort: string | undefined | null; + proofRecord: ProofRecordDto; +} + +const ViewConnectionlessProofRequest = observer( + ({ + setTitle, + setWidth, + setClassName, + onClose, + data, + }: FcProps<ViewConnectionlessProofRequestProps>) => { + useEffect(() => { + setClassName(s.modal); + setWidth("80vw"); + setTitle("Connectionless proof request"); + }, [setClassName, setWidth, setTitle]); + + return ( + <Modal.Body className={s.body}> + <div className={s.info}> + <div> + <div className={s.qrCodeHint}> + Scan this QR code with mobile wallet + </div> + <div className={s.qrWrapper}> + {data.proofUrlShort && ( + <QRCode value={data.proofUrlShort} size={500} /> + )} + </div> + <div> + <div className={s.urlTitle}>Proof request URL:</div> + <div className={s.url}> + <b>{data.proofUrl}</b> + </div> + <div className={s.urlTitle}>Proof request short URL:</div> + <div className={s.url}> + <b>{data.proofUrlShort}</b> + </div> + {data.proofRecord && ( + <div> + Details: + <ProofItem item={data.proofRecord} /> + </div> + )} + </div> + </div> + </div> + </Modal.Body> + ); + }, +); + +export default ViewConnectionlessProofRequest; diff --git a/apps/dashboard/src/modals/ViewConnectionlessProofRequest/styles.module.scss b/apps/dashboard/src/modals/ViewConnectionlessProofRequest/styles.module.scss new file mode 100644 index 00000000..66d3a4f7 --- /dev/null +++ b/apps/dashboard/src/modals/ViewConnectionlessProofRequest/styles.module.scss @@ -0,0 +1,46 @@ +.modal { + top: 40px; +} + +.body { + height: calc(100vh - 140px); +} + +.qrWrapper { + display: flex; + align-items: center; + justify-content: center; + background: white; + padding: 16px; +} + +.info { + display: flex; + flex-direction: column; + justify-content: space-between; + overflow: scroll; +} + +.urlTitle { + margin-top: 12px; + font-weight: bold; +} + +.url { + margin-top: 12px; + word-break: break-word; + border-right: 8px; + background-color: rgba(0,0,0, 0.04); + padding: 8px; +} + +.urlHint { + margin-top: 12px; + font-size: 16px; +} + +.qrCodeHint { + text-align: center; + margin: 24px 0 12px 0; + font-size: 18px; +} \ No newline at end of file diff --git a/apps/dashboard/src/modals/ViewJsonDialog/index.tsx b/apps/dashboard/src/modals/ViewJsonDialog/index.tsx new file mode 100644 index 00000000..d93eefa9 --- /dev/null +++ b/apps/dashboard/src/modals/ViewJsonDialog/index.tsx @@ -0,0 +1,26 @@ +import React, { useEffect } from "react"; +import { observer } from "mobx-react"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import JsonDetails from "@dashboard/components/JsonDetails"; + +export interface ViewJsonDialogProps { + title?: string; + data: unknown; +} + +const ViewJsonDialog = observer( + ({ setTitle, setWidth, onClose, data }: FcProps<ViewJsonDialogProps>) => { + useEffect(() => { + setWidth("80%"); + setTitle(data.title || "JSON"); + }, [setWidth, setTitle, data]); + + return ( + <Modal.Body> + <JsonDetails object={data.data} /> + </Modal.Body> + ); + }, +); + +export default ViewJsonDialog; diff --git a/apps/dashboard/src/modals/ViewJsonDialog/styles.module.scss b/apps/dashboard/src/modals/ViewJsonDialog/styles.module.scss new file mode 100644 index 00000000..5cc463b5 --- /dev/null +++ b/apps/dashboard/src/modals/ViewJsonDialog/styles.module.scss @@ -0,0 +1,4 @@ +.footerActions { + display: flex; + justify-content: space-around; +} diff --git a/apps/dashboard/src/routes/config.ts b/apps/dashboard/src/routes/config.ts new file mode 100644 index 00000000..7c58f039 --- /dev/null +++ b/apps/dashboard/src/routes/config.ts @@ -0,0 +1,103 @@ +import ConnectionListPage from "./pages/ConnectionListPage"; +import ConnectionCreatePage from "./pages/ConnectionCreatePage"; +import ConnectionViewPage from "./pages/ConnectionViewPage"; +import SchemaListPage from "./pages/SchemaListPage"; +import CredentialDefListPage from "./pages/CredentialDefListPage"; +import CredentialListPage from "./pages/CredentialListPage"; +import ProofListPage from "./pages/ProofListPage"; +import WelcomePage from "./pages/WelcomePage"; +import LoginPage from "./pages/LoginPage"; +import ResolveDidPage from "./pages/ResolveDidPage"; +import VcmSelfIssuePage from "./pages/VcmSelfIssuePage"; +import RedirectWithTokenPage from "./pages/RedirectWithTokenPage"; +import CreatedDidListPage from "./pages/CreatedDidListPage"; +import CreatedInvitationListPage from "./pages/CreatedInvitationListPage"; + +const routes = { + connection_create: { + Component: ConnectionCreatePage, + route: "/connections/create", + getLink: () => "/connections/create", + requireAuth: true, + }, + connection_list: { + Component: ConnectionListPage, + route: "/connections", + getLink: () => "/connections", + requireAuth: true, + }, + connection_view: { + Component: ConnectionViewPage, + route: "/connection/view/:id", + getLink: (id: string) => `/connection/view/${id}`, + requireAuth: true, + }, + schema_list: { + Component: SchemaListPage, + route: "/schema/list", + getLink: () => "/schema/list", + requireAuth: true, + }, + cred_def_list: { + Component: CredentialDefListPage, + route: "/cred-def/list", + getLink: () => "/cred-def/list", + requireAuth: true, + }, + credential_list: { + Component: CredentialListPage, + route: "/credential/list", + getLink: () => "/credential/list", + requireAuth: true, + }, + proof_list: { + Component: ProofListPage, + route: "/proof/list", + getLink: () => "/proof/list", + requireAuth: true, + }, + welcome: { + Component: WelcomePage, + route: "/", + getLink: () => "/", + requireAuth: false, + }, + createdDids: { + Component: CreatedDidListPage, + route: "/created-dids", + getLink: () => "/created-dids", + requireAuth: false, + }, + createdInvitations: { + Component: CreatedInvitationListPage, + route: "/created-invitations", + getLink: () => "/created-invitations", + requireAuth: false, + }, + login: { + Component: LoginPage, + route: "/login", + getLink: () => "/login", + requireAuth: false, + }, + resolveDid: { + Component: ResolveDidPage, + route: "/resolve-did", + getLink: () => "/resolve-did", + requireAuth: false, + }, + vcmSelfIssue: { + Component: VcmSelfIssuePage, + route: "/self-issued-creds-in-vcm", + getLink: () => "/self-issued-creds-in-vcm", + requireAuth: false, + }, + authToken: { + Component: RedirectWithTokenPage, + route: "/auth/:token", + getLink: (token: string) => `/auth/${token}`, + requireAuth: false, + }, +}; + +export default routes; diff --git a/apps/dashboard/src/routes/index.tsx b/apps/dashboard/src/routes/index.tsx new file mode 100644 index 00000000..369a730a --- /dev/null +++ b/apps/dashboard/src/routes/index.tsx @@ -0,0 +1,27 @@ +import RequireAuth from "@dashboard/components/RequireAuth"; +import React from "react"; +import { Routes, Route } from "react-router-dom"; +import config from "./config"; + +function PageRoutes() { + return ( + <Routes> + {Object.values(config).map((item) => { + let component; + if (item.requireAuth) { + component = ( + <RequireAuth> + <item.Component /> + </RequireAuth> + ); + } else { + component = <item.Component />; + } + + return <Route key={item.route} path={item.route} element={component} />; + })} + </Routes> + ); +} + +export default PageRoutes; diff --git a/apps/dashboard/src/routes/pages/ConnectionCreatePage/ConnectionCreatePageStore.ts b/apps/dashboard/src/routes/pages/ConnectionCreatePage/ConnectionCreatePageStore.ts new file mode 100644 index 00000000..158e7efc --- /dev/null +++ b/apps/dashboard/src/routes/pages/ConnectionCreatePage/ConnectionCreatePageStore.ts @@ -0,0 +1,42 @@ +import { makeAutoObservable } from "mobx"; +import api from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class ConnectionCreatePageStore { + public loading = false; + public invitationUrl: string | null | undefined = null; + public oob: string | null = null; + public oobId: string | null | undefined = null; + + constructor() { + makeAutoObservable(this); + } + + public async createConnection() { + this.loading = true; + try { + const { invitationUrl, outOfBandId } = await api.createInvitation({}); + this.invitationUrl = invitationUrl; + this.oobId = outOfBandId; + try { + if (invitationUrl) { + this.oob = JSON.stringify( + JSON.parse(atob(invitationUrl.split("oob=")[1])), + null, + 2, + ); + } + } catch (e) { + console.warn("Failed to parse invitationUrl"); + } + } catch (e: unknown) { + displayError(e, "Failed to create connection invitation"); + } + + this.loading = false; + } +} + +export type { ConnectionCreatePageStore }; + +export default ConnectionCreatePageStore; diff --git a/apps/dashboard/src/routes/pages/ConnectionCreatePage/index.tsx b/apps/dashboard/src/routes/pages/ConnectionCreatePage/index.tsx new file mode 100644 index 00000000..657bd6e7 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ConnectionCreatePage/index.tsx @@ -0,0 +1,68 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { QRCode, Spin } from "antd"; +import ConnectionCreatePageStore from "./ConnectionCreatePageStore"; +import s from "./styles.module.scss"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; + +const ConnectionCreatePage = observer(() => { + const [store] = useState(() => new ConnectionCreatePageStore()); + + useEffect(() => { + store.createConnection(); + }, [store]); + return ( + <PageWithSidebar> + <PageTitle>New Contact</PageTitle> + <div> + {store.loading && <Spin />} + {!store.loading && ( + <div className={s.info}> + <div> + <div> + <div className={s.urlTitle}>Invitation URL:</div> + <div className={s.url}> + <b>{store.invitationUrl}</b> + </div> + <div className={s.urlHint}> + Copy this URL and send it to the person you want to connect + with + </div> + + {store.oobId && ( + <> + <br /> + <div> + OutOfBandId: <b>{store.oobId}</b> + </div> + </> + )} + + <div className={s.qrCodeHint}> + Or scan this QR code with your mobile wallet + </div> + <div style={{ background: "white", padding: "16px" }}> + <QRCode + status={!store.invitationUrl ? "loading" : "active"} + value={store.invitationUrl || "loading"} + size={400} + /> + </div> + <br /> + {store.oob && ( + <div> + Details: + <pre>{store.oob}</pre> + </div> + )} + </div> + </div> + </div> + )} + </div> + </PageWithSidebar> + ); +}); + +export default ConnectionCreatePage; diff --git a/apps/dashboard/src/routes/pages/ConnectionCreatePage/styles.module.scss b/apps/dashboard/src/routes/pages/ConnectionCreatePage/styles.module.scss new file mode 100644 index 00000000..d68ef384 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ConnectionCreatePage/styles.module.scss @@ -0,0 +1,49 @@ +.netConnection { + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: column; + flex: 0 50%; + background: #ffffff; + border-radius: 20px; + padding: 20px; +} + +.info { + flex: 0 50%; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.invitationUrl { + word-break: break-all; +} + +.urlTitle { + margin-top: 12px; + font-weight: bold; +} + +.link { + color: white !important; + word-wrap: break-word; +} + +.url { + margin-top: 12px; + word-break: break-word; + border-right: 8px; + background-color: rgba(0,0,0, 0.04); + padding: 8px; +} + +.urlHint { + margin-top: 12px; + font-size: 16px; +} + +.qrCodeHint { + margin: 24px 0 12px 0; + font-size: 18px; +} \ No newline at end of file diff --git a/apps/dashboard/src/routes/pages/ConnectionListPage/ConnectionListStore.ts b/apps/dashboard/src/routes/pages/ConnectionListPage/ConnectionListStore.ts new file mode 100644 index 00000000..3a92054a --- /dev/null +++ b/apps/dashboard/src/routes/pages/ConnectionListPage/ConnectionListStore.ts @@ -0,0 +1,46 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { ConnectionRecordDto } from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class ConnectionListStore { + public loading = false; + public list: ConnectionRecordDto[] = []; + public searchQuery = ""; + public get filteredList() { + const query = this.searchQuery.trim().toLowerCase(); + if (query) { + return this.list.filter( + (p) => + (p.connectionName && + p.connectionName.toLowerCase().indexOf(query) >= 0) || + (p.id && p.id.indexOf(query) >= 0) || + (p.alias && p.alias.toLowerCase().indexOf(query) >= 0) || + (p.did && p.did.indexOf(query) >= 0) || + (p.outOfBandId && p.outOfBandId.indexOf(query) >= 0), + ); + } + return this.list; + } + + constructor() { + makeAutoObservable(this); + } + + public async getAll() { + runInAction(() => (this.loading = true)); + try { + const list = await api.fetchConnections(); + runInAction(() => { + this.list = list; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } +} + +export type { ConnectionListStore }; + +export default ConnectionListStore; diff --git a/apps/dashboard/src/routes/pages/ConnectionListPage/index.tsx b/apps/dashboard/src/routes/pages/ConnectionListPage/index.tsx new file mode 100644 index 00000000..bf3fddd0 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ConnectionListPage/index.tsx @@ -0,0 +1,73 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Button, Input, Space, Spin } from "antd"; +import { Link, useNavigate } from "react-router-dom"; +import ConnectionListStore from "./ConnectionListStore"; +import config from "@dashboard/routes/config"; +import ConnectionItem from "@dashboard/components/ConnectionItem"; +import modalStore from "@dashboard/store/modalStore"; +import NoRecordsMessage from "@dashboard/components/NoRecordsMessage"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; +import { runInAction } from "mobx"; +import s from "./styles.module.scss"; + +const ConnectionListPage = observer(() => { + const [store] = useState(() => new ConnectionListStore()); + + const navigate = useNavigate(); + + useEffect(() => { + store.getAll(); + }, [store]); + + return ( + <PageWithSidebar> + <h2>Actions</h2> + <Space> + <Link to={config.connection_create.getLink()}> + <Button type="primary">New contact</Button> + </Link> + <Button + onClick={() => { + modalStore.openReceiveInvitationDialog({ + onInvitationReceived: (connRecord) => { + navigate(config.connection_view.getLink(connRecord.id!)); + }, + }); + }} + > + Accept invitation + </Button> + </Space> + <PageTitle>Contacts</PageTitle> + <div> + <Space direction="horizontal"> + <div>Search:</div> + <Input + className={s.searchInput} + value={store.searchQuery} + onChange={(e) => { + runInAction(() => (store.searchQuery = e.target.value)); + }} + /> + </Space> + <div> + {store.filteredList.map((p) => ( + <ConnectionItem + key={p.id} + item={p} + onClick={() => navigate(config.connection_view.getLink(p.id!))} + /> + ))} + {!store.loading && store.filteredList.length === 0 && ( + <NoRecordsMessage /> + )} + {store.loading && <Spin />} + </div> + </div> + </PageWithSidebar> + ); +}); + +export default ConnectionListPage; diff --git a/apps/dashboard/src/routes/pages/ConnectionListPage/styles.module.scss b/apps/dashboard/src/routes/pages/ConnectionListPage/styles.module.scss new file mode 100644 index 00000000..03346e43 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ConnectionListPage/styles.module.scss @@ -0,0 +1,3 @@ +.searchInput { + width: 400px; +} diff --git a/apps/dashboard/src/routes/pages/ConnectionViewPage/ConnectionViewPageStore.ts b/apps/dashboard/src/routes/pages/ConnectionViewPage/ConnectionViewPageStore.ts new file mode 100644 index 00000000..fff1ede5 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ConnectionViewPage/ConnectionViewPageStore.ts @@ -0,0 +1,46 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import { toast } from "react-toastify"; +import api, { ConnectionRecordDto } from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class ConnectionViewPageStore { + public loading = false; + public connection: ConnectionRecordDto | null = null; + constructor() { + makeAutoObservable(this); + } + + public async load(id: string) { + runInAction(() => (this.loading = true)); + try { + const record = await api.getConnectionById(id); + runInAction(() => { + this.connection = record; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } + + public async deleteConnection(id: string) { + runInAction(() => (this.loading = true)); + try { + await api.deleteConnectionById(id); + runInAction(() => { + this.loading = false; + }); + toast.success("Contact deleted successfully"); + return true; + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + return false; + } + } +} + +export type { ConnectionViewPageStore }; + +export default ConnectionViewPageStore; diff --git a/apps/dashboard/src/routes/pages/ConnectionViewPage/index.tsx b/apps/dashboard/src/routes/pages/ConnectionViewPage/index.tsx new file mode 100644 index 00000000..a4ecedb5 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ConnectionViewPage/index.tsx @@ -0,0 +1,98 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { useNavigate, useParams } from "react-router-dom"; +import ConnectionViewPageStore from "./ConnectionViewPageStore"; +import ConnectionItem from "@dashboard/components/ConnectionItem"; +import { Button, Space, Spin } from "antd"; +import JsonDetails from "@dashboard/components/JsonDetails"; +import CredentialList from "@dashboard/components/CredentialList"; +import ProofList from "@dashboard/components/ProofList"; +import modalStore from "@dashboard/store/modalStore"; +import BasicMessageList from "@dashboard/components/BasicMessageList"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; +import route from "@dashboard/routes/config"; + +const ConnectionViewPage = observer(() => { + const { id } = useParams() as { id: string }; + const [store] = useState(() => new ConnectionViewPageStore()); + const navigate = useNavigate(); + + useEffect(() => { + store.load(id); + }, [store, id]); + return ( + <PageWithSidebar> + <h2>Actions</h2> + <Space direction="horizontal"> + <Button + onClick={() => { + modalStore.openOfferCredentialDialog({ + connectionId: id, + onCredentialOffered: (cred) => { + setTimeout(() => { + window.location.reload(); + }, 3000); + }, + }); + }} + > + Offer credential + </Button> + <Button + onClick={() => { + modalStore.openRequestProofDialog({ + connectionId: id, + onProofRequested: (proofRequest) => { + setTimeout(() => { + window.location.reload(); + }, 3000); + }, + }); + }} + > + Request proof + </Button> + <Button + danger + onClick={() => { + modalStore.openConfirmDialog({ + title: "Are you sure you want to delete this contact?", + dangerOk: true, + description: "", + onOk: async (e) => { + const result = await store.deleteConnection(id); + if (result) { + e.close(); + navigate(route.connection_list.getLink()); + } + }, + }); + }} + > + Delete contact + </Button> + </Space> + <PageTitle>Connection</PageTitle> + {store.loading && <Spin />} + {!store.loading && store.connection && ( + <div> + <ConnectionItem item={store.connection} /> + </div> + )} + + <h3>Credentials</h3> + <CredentialList connectionId={id} /> + + <h3>Proofs</h3> + <ProofList connectionId={id} /> + + <h3>Messages</h3> + <BasicMessageList connectionId={id} /> + + <JsonDetails object={store.connection} /> + </PageWithSidebar> + ); +}); + +export default ConnectionViewPage; diff --git a/apps/dashboard/src/routes/pages/ConnectionViewPage/styles.module.scss b/apps/dashboard/src/routes/pages/ConnectionViewPage/styles.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/apps/dashboard/src/routes/pages/CreatedDidListPage/CreatedDidListPageStore.ts b/apps/dashboard/src/routes/pages/CreatedDidListPage/CreatedDidListPageStore.ts new file mode 100644 index 00000000..df9eb10a --- /dev/null +++ b/apps/dashboard/src/routes/pages/CreatedDidListPage/CreatedDidListPageStore.ts @@ -0,0 +1,29 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { DidRecordDto } from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class CreatedDidListPageStore { + public loading = false; + public list: DidRecordDto[] = []; + constructor() { + makeAutoObservable(this); + } + + public async getAll() { + runInAction(() => (this.loading = true)); + try { + const list = await api.getCreatedDids(); + runInAction(() => { + this.list = list; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } +} + +export type { CreatedDidListPageStore }; + +export default CreatedDidListPageStore; diff --git a/apps/dashboard/src/routes/pages/CreatedDidListPage/index.tsx b/apps/dashboard/src/routes/pages/CreatedDidListPage/index.tsx new file mode 100644 index 00000000..cc8ebb6a --- /dev/null +++ b/apps/dashboard/src/routes/pages/CreatedDidListPage/index.tsx @@ -0,0 +1,31 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Spin } from "antd"; +import CreatedDidListPageStore from "./CreatedDidListPageStore"; +import NoRecordsMessage from "@dashboard/components/NoRecordsMessage"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; +import CreatedDidItem from "@dashboard/components/CreatedDidItem"; + +const CredentialDefListPage = observer(() => { + const [store] = useState(() => new CreatedDidListPageStore()); + + useEffect(() => { + store.getAll(); + }, [store]); + + return ( + <PageWithSidebar> + <PageTitle>Your DIDs</PageTitle> + <div> + {store.list.map((p) => ( + <CreatedDidItem key={p.did} item={p} /> + ))} + {!store.loading && store.list.length === 0 && <NoRecordsMessage />} + {store.loading && <Spin />} + </div> + </PageWithSidebar> + ); +}); + +export default CredentialDefListPage; diff --git a/apps/dashboard/src/routes/pages/CreatedDidListPage/styles.module.scss b/apps/dashboard/src/routes/pages/CreatedDidListPage/styles.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/apps/dashboard/src/routes/pages/CreatedInvitationListPage/CreatedInvitationListPageStore.ts b/apps/dashboard/src/routes/pages/CreatedInvitationListPage/CreatedInvitationListPageStore.ts new file mode 100644 index 00000000..186db239 --- /dev/null +++ b/apps/dashboard/src/routes/pages/CreatedInvitationListPage/CreatedInvitationListPageStore.ts @@ -0,0 +1,29 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { CreateInvitationResponseDto } from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class CreatedInvitationListPageStore { + public loading = false; + public list: CreateInvitationResponseDto[] = []; + constructor() { + makeAutoObservable(this); + } + + public async getAll() { + runInAction(() => (this.loading = true)); + try { + const list = await api.fetchInvitations(undefined, undefined); + runInAction(() => { + this.list = list; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } +} + +export type { CreatedInvitationListPageStore }; + +export default CreatedInvitationListPageStore; diff --git a/apps/dashboard/src/routes/pages/CreatedInvitationListPage/index.tsx b/apps/dashboard/src/routes/pages/CreatedInvitationListPage/index.tsx new file mode 100644 index 00000000..dc4efd67 --- /dev/null +++ b/apps/dashboard/src/routes/pages/CreatedInvitationListPage/index.tsx @@ -0,0 +1,31 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Spin } from "antd"; +import CreatedInvitationListPageStore from "./CreatedInvitationListPageStore"; +import NoRecordsMessage from "@dashboard/components/NoRecordsMessage"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; +import CreatedInvitationItem from "@dashboard/components/CreatedInvitationItem"; + +const CreatedInvitationListPage = observer(() => { + const [store] = useState(() => new CreatedInvitationListPageStore()); + + useEffect(() => { + store.getAll(); + }, [store]); + + return ( + <PageWithSidebar> + <PageTitle>Created Invitations</PageTitle> + <div> + {store.list.map((p) => ( + <CreatedInvitationItem key={p.did} item={p} /> + ))} + {!store.loading && store.list.length === 0 && <NoRecordsMessage />} + {store.loading && <Spin />} + </div> + </PageWithSidebar> + ); +}); + +export default CreatedInvitationListPage; diff --git a/apps/dashboard/src/routes/pages/CreatedInvitationListPage/styles.module.scss b/apps/dashboard/src/routes/pages/CreatedInvitationListPage/styles.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/apps/dashboard/src/routes/pages/CredentialDefListPage/CredentialDefListPageStore.ts b/apps/dashboard/src/routes/pages/CredentialDefListPage/CredentialDefListPageStore.ts new file mode 100644 index 00000000..b66ce5f3 --- /dev/null +++ b/apps/dashboard/src/routes/pages/CredentialDefListPage/CredentialDefListPageStore.ts @@ -0,0 +1,29 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { CreddefRecordDto } from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class CredentialDefListPageStore { + public loading = false; + public list: CreddefRecordDto[] = []; + constructor() { + makeAutoObservable(this); + } + + public async getAll() { + runInAction(() => (this.loading = true)); + try { + const list = await api.fetchCredentialDefinitions(); + runInAction(() => { + this.list = list; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } +} + +export type { CredentialDefListPageStore }; + +export default CredentialDefListPageStore; diff --git a/apps/dashboard/src/routes/pages/CredentialDefListPage/index.tsx b/apps/dashboard/src/routes/pages/CredentialDefListPage/index.tsx new file mode 100644 index 00000000..08015d19 --- /dev/null +++ b/apps/dashboard/src/routes/pages/CredentialDefListPage/index.tsx @@ -0,0 +1,47 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Button, Spin } from "antd"; +import CredentialDefinitionItem from "@dashboard/components/CredentialDefinitionItem"; +import CredentialDefListPageStore from "./CredentialDefListPageStore"; +import modalStore from "@dashboard/store/modalStore"; +import NoRecordsMessage from "@dashboard/components/NoRecordsMessage"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; + +const CredentialDefListPage = observer(() => { + const [store] = useState(() => new CredentialDefListPageStore()); + + useEffect(() => { + store.getAll(); + }, [store]); + + const handleCreateDef = () => { + modalStore.openNewCredentialDefDialog({ + onCredDefCreated: (credDef) => { + store.getAll(); + modalStore.openViewJsonDialog({ data: credDef }); + }, + }); + }; + + return ( + <PageWithSidebar> + <h2>Actions</h2> + <div> + <Button onClick={handleCreateDef}> + Create new credential definition + </Button> + </div> + <PageTitle>Credential definitions</PageTitle> + <div> + {store.list.map((p) => ( + <CredentialDefinitionItem key={p.credentialDefinitionId} item={p} /> + ))} + {!store.loading && store.list.length === 0 && <NoRecordsMessage />} + {store.loading && <Spin />} + </div> + </PageWithSidebar> + ); +}); + +export default CredentialDefListPage; diff --git a/apps/dashboard/src/routes/pages/CredentialDefListPage/styles.module.scss b/apps/dashboard/src/routes/pages/CredentialDefListPage/styles.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/apps/dashboard/src/routes/pages/CredentialListPage/index.tsx b/apps/dashboard/src/routes/pages/CredentialListPage/index.tsx new file mode 100644 index 00000000..7adf872d --- /dev/null +++ b/apps/dashboard/src/routes/pages/CredentialListPage/index.tsx @@ -0,0 +1,57 @@ +import React, { useState, useEffect } from "react"; +import { observer } from "mobx-react"; +import CredentialList from "@dashboard/components/CredentialList"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; +import { Button, Space } from "antd"; +import modalStore from "@dashboard/store/modalStore"; +import CredentialListStore from "@dashboard/components/CredentialList/CredentialListStore"; + +const CredentialListPage = observer(() => { + const [store] = useState(() => new CredentialListStore()); + + useEffect(() => { + store.loadAll(null); + }, [store]); + + return ( + <PageWithSidebar> + <h2>Actions</h2> + <Space direction="horizontal"> + <Button + onClick={() => { + modalStore.openOfferCredentialDialog({ + connectionId: undefined, + onCredentialOffered: (offer) => { + modalStore.openViewConnectionlessCredentialOffer({ + credentialUrl: offer.credentialUrl, + credentialUrlShort: offer.shortCredentialUrl, + credentialRecord: offer.credentialRecord, + }); + }, + }); + }} + > + Offer connectionless credential + </Button> + <Button + onClick={() => { + modalStore.openAcceptConnectionlessCredentialOfferDialog({ + onCredentialReceived: (credentialRecord) => { + modalStore.openViewJsonDialog({ data: credentialRecord }); + }, + }); + }} + > + Accept connectionless credential + </Button> + </Space> + <PageTitle>Credentials</PageTitle> + <div> + <CredentialList connectionId={null} /> + </div> + </PageWithSidebar> + ); +}); + +export default CredentialListPage; diff --git a/apps/dashboard/src/routes/pages/LoginPage/AuthForm/AuthFormStore.ts b/apps/dashboard/src/routes/pages/LoginPage/AuthForm/AuthFormStore.ts new file mode 100644 index 00000000..216ca223 --- /dev/null +++ b/apps/dashboard/src/routes/pages/LoginPage/AuthForm/AuthFormStore.ts @@ -0,0 +1,80 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import tsaApi from "@dashboard/tsa-api"; +import { toast } from "react-toastify"; +import displayError from "@dashboard/utils/displayError"; + +type SetToken = (token: string) => void; + +class AuthFormStore { + public loading = false; + public acceptanceAwaiting = false; + public acceptanceExpired = false; + public mode: "email" | "vc" = "email"; + public proofRecordId: string | null = null; + public proofUrlShort: string | null = null; + public proofUrl: string | null = null; + private _setToken: SetToken; + + constructor(setToken: SetToken) { + this._setToken = setToken; + makeAutoObservable(this); + } + + public requestTsaAuthEmail = async (email: string) => { + runInAction(() => (this.loading = true)); + try { + const { message } = await tsaApi.loginLogin({ email }); + toast(message); + + runInAction(() => { + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + }; + + public requestTsaProof = async () => { + runInAction(() => (this.loading = true)); + try { + const { proofRecordId, proofUrl, proofUrlShort } = + await tsaApi.loginLoginInvitation(); + runInAction(() => { + this.loading = false; + this.proofRecordId = proofRecordId; + this.proofUrl = proofUrl; + this.proofUrlShort = proofUrlShort; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + if (this.proofRecordId) { + this._awaitProofAcceptance(this.proofRecordId); + } + }; + + private _awaitProofAcceptance = async (proofRecordId: string) => { + runInAction(() => (this.acceptanceAwaiting = true)); + try { + const { token } = await tsaApi.loginLoginWithVC({ + proofRecordId, + }); + this._setToken(token); + runInAction(() => { + this.acceptanceAwaiting = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => { + this.acceptanceAwaiting = false; + this.acceptanceExpired = true; + }); + } + }; +} + +export type { AuthFormStore }; + +export default AuthFormStore; diff --git a/apps/dashboard/src/routes/pages/LoginPage/AuthForm/index.tsx b/apps/dashboard/src/routes/pages/LoginPage/AuthForm/index.tsx new file mode 100644 index 00000000..ce060719 --- /dev/null +++ b/apps/dashboard/src/routes/pages/LoginPage/AuthForm/index.tsx @@ -0,0 +1,99 @@ +import React, { useState } from "react"; +import { observer } from "mobx-react"; +import AuthFormStore from "./AuthFormStore"; +import { Button, Form, Input, QRCode } from "antd"; +import s from "./styles.module.scss"; +import useGlobalAuth from "@dashboard/hooks/useGlobalAuth"; + +const LoginPage = observer(() => { + const auth = useGlobalAuth(); + const [store] = useState(() => new AuthFormStore(auth.setToken)); + + const handleEnterEmail = ({ email }: { email: string }) => { + // TODO Functional deactivated. Auth will be implemented in another branch + // store.requestTsaAuthEmail(email); + }; + + return ( + <div className={s.registerForm}> + <div className={s.formTitle}> + {store.mode === "email" && "Login using trusted email"} + {store.mode === "vc" && "Scan this QR code"} + </div> + + {store.mode === "email" && ( + <> + <Form + layout="vertical" + initialValues={{ + email: "", + }} + onFinish={handleEnterEmail} + autoComplete="off" + > + <Form.Item + label="Email" + name="email" + rules={[{ required: true, message: "Please enter email" }]} + > + <Input /> + </Form.Item> + + <div className={s.footerActions}> + <Button + type="primary" + htmlType="submit" + disabled={store.loading} + loading={store.loading} + > + Send email + </Button> + </div> + </Form> + + <br /> + <Button + onClick={() => { + store.mode = "vc"; + // Functional deactivated + // store.requestTsaProof(); + }} + > + Login using VC + </Button> + </> + )} + + {store.mode === "vc" && ( + <> + <div className={s.qrWrapper}> + <QRCode + status={ + !store.proofUrlShort || store.loading ? "loading" : "active" + } + value={store.proofUrlShort || "loading"} + size={400} + icon={`${window.BASE_PATH}/assets/Vereign_Logo_ICON_BLACK.png}`} + /> + </div> + <div> + In case you have another OCM with VC. You can copy this url and + accept it + <br /> + <div>{store.proofUrl}</div> + </div> + <br /> + <Button + onClick={() => { + store.mode = "email"; + }} + > + Login using email + </Button> + </> + )} + </div> + ); +}); + +export default LoginPage; diff --git a/apps/dashboard/src/routes/pages/LoginPage/AuthForm/styles.module.scss b/apps/dashboard/src/routes/pages/LoginPage/AuthForm/styles.module.scss new file mode 100644 index 00000000..a04fe6e0 --- /dev/null +++ b/apps/dashboard/src/routes/pages/LoginPage/AuthForm/styles.module.scss @@ -0,0 +1,32 @@ +.registerForm { + width: 700px; + margin: 80px auto; + background: #fff 0 0 no-repeat padding-box; + box-shadow: 0 3px 40px rgba(0,0,0,.059); + border-radius: 30px; + opacity: 1; + padding: 30px; + flex: 1 1; + border: 3px solid transparent; + display: flex; + flex-direction: column; +} +.formTitle { + text-align: center; + font-size: 30px; + color: #00b3ca; + font-weight: bold; + margin-bottom: 12px; +} + +.qrWrapper { + display: flex; + align-items: center; + justify-content: center; + margin: 40px 0 20px 0; +} + +.goToLogin { + margin: 0 0 100px 0; + text-align: center; +} diff --git a/apps/dashboard/src/routes/pages/LoginPage/LoginPageStore.ts b/apps/dashboard/src/routes/pages/LoginPage/LoginPageStore.ts new file mode 100644 index 00000000..3bf24cd1 --- /dev/null +++ b/apps/dashboard/src/routes/pages/LoginPage/LoginPageStore.ts @@ -0,0 +1,71 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { + CreddefRecordDto, + ProofRecordDto, + SchemaRecordDto, +} from "@dashboard/engine-api"; +import { v4 } from "uuid"; +import displayError from "@dashboard/utils/displayError"; + +class LoginPageStore { + public loading = false; + public id = v4(); + public schemaId = + "did:indy:bcovrin:test:FcZ4aS728oRGVdNUKVaECP/anoncreds/v0/SCHEMA/Identity/1.0"; + public schema: SchemaRecordDto | null = null; + public creddef: CreddefRecordDto | null = null; + public shortProofUrl: string | null = null; + public proofUrl: string | null = null; + public proofRecord: ProofRecordDto | null = null; + + constructor() { + makeAutoObservable(this); + } + + public async initialize() { + runInAction(() => (this.loading = true)); + try { + const schema = await api.getSchemaById({ id: this.schemaId }); + const credDefs = await api.fetchCredentialDefinitions(); + let requiredCredDef = credDefs.find( + (credDef) => credDef.schemaId === this.schemaId, + ); + if (!requiredCredDef) { + requiredCredDef = await api.createCredentialDefinition({ + schemaId: this.schemaId, + tag: "Identity", + }); + } + + const { shortProofUrl, proofUrl, proofRecord } = await api.requestProof({ + attributes: [ + { + attributeName: "internal-id", + credentialDefinitionId: requiredCredDef.id!, + schemaId: this.schemaId, + }, + { + attributeName: "name", + credentialDefinitionId: requiredCredDef.id!, + schemaId: this.schemaId, + }, + ], + }); + runInAction(() => { + this.schema = schema; + this.creddef = requiredCredDef!; + this.shortProofUrl = shortProofUrl; + this.proofUrl = proofUrl; + this.proofRecord = proofRecord; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } +} + +export type { LoginPageStore }; + +export default LoginPageStore; diff --git a/apps/dashboard/src/routes/pages/LoginPage/index.tsx b/apps/dashboard/src/routes/pages/LoginPage/index.tsx new file mode 100644 index 00000000..308dccd9 --- /dev/null +++ b/apps/dashboard/src/routes/pages/LoginPage/index.tsx @@ -0,0 +1,61 @@ +import React from "react"; +import { observer } from "mobx-react"; +import Page from "@dashboard/components/Page"; +import VaultHeader from "@dashboard/components/VaultHeader"; +import AuthForm from "./AuthForm"; +import s from "./styles.module.scss"; + +const LoginPage = observer(() => { + return ( + <Page> + <VaultHeader hideTry /> + + <div className={s.topSpace} /> + + <div className={s.info}> + <div className={s.subTitle}>Secure Login with Your Credentials</div> + <ul> + <li> + <b>For New Users or Credential Recovery:</b> + <br /> + If you are a new user or need to recover your credentials, please + contact an administrator. The administrator will provide you with a + QR code that contains your login data. + </li> + + <li> + <b>Trusted Email Verification:</b> + <br /> + For users with a trusted email address, enter your email below. You + will receive an email containing a secure link. Following this link + will redirect you to the app and grant you access. + </li> + + <li> + <b>Returning Users with Mobile Credentials:</b> + <br /> + Open the Mobile App: Launch the mobile app you have previously set + up. + <br /> + Scan the QR Code Below: Use the app’s scanner to capture the QR code + displayed on this page. This step verifies that you hold valid + credentials from our system. + <br /> + Confirm and Login: After scanning, the app will request your + confirmation. Upon confirming, you will be logged into the system + automatically. + </li> + </ul> + <div> + We continue to provide a secure and efficient login process. By + utilizing these methods, we eliminate the need for traditional + passwords, ensuring your login is both safe and convenient. + </div> + </div> + + <AuthForm /> + </Page> + ); +}); + +export default LoginPage; diff --git a/apps/dashboard/src/routes/pages/LoginPage/styles.module.scss b/apps/dashboard/src/routes/pages/LoginPage/styles.module.scss new file mode 100644 index 00000000..5bff96ea --- /dev/null +++ b/apps/dashboard/src/routes/pages/LoginPage/styles.module.scss @@ -0,0 +1,16 @@ +.topSpace { + margin-top: 30px; +} + +.info { + margin: 0 auto; + max-width: 1000px; +} + +.subTitle { + text-align: center; + font-weight: bold; + font-size: 30px; + color: #00b3ca; + padding: 40px; +} diff --git a/apps/dashboard/src/routes/pages/ProofListPage/index.tsx b/apps/dashboard/src/routes/pages/ProofListPage/index.tsx new file mode 100644 index 00000000..1a0dc4a7 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ProofListPage/index.tsx @@ -0,0 +1,50 @@ +import React from "react"; +import { observer } from "mobx-react"; +import ProofList from "@dashboard/components/ProofList"; +import { Button, Space } from "antd"; +import modalStore from "@dashboard/store/modalStore"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; + +const ProofListPage = observer(() => { + return ( + <PageWithSidebar> + <h2>Actions</h2> + <Space direction="horizontal"> + <Button + onClick={() => { + modalStore.openRequestProofDialog({ + connectionId: undefined, + onProofRequested: (proofRequest) => { + modalStore.openViewConnectionlessProofRequest({ + proofUrl: proofRequest.proofUrl, + proofUrlShort: proofRequest.shortProofUrl, + proofRecord: proofRequest.proofRecord, + }); + }, + }); + }} + > + Create connectionless proof request + </Button> + <Button + onClick={() => { + modalStore.openAcceptConnectionlessProofRequestDialog({ + onProofReceived: (proofRecord) => { + window.location.reload(); + }, + }); + }} + > + Accept connectionless proof request + </Button> + </Space> + <PageTitle>Proof Requests</PageTitle> + <div> + <ProofList connectionId={null} /> + </div> + </PageWithSidebar> + ); +}); + +export default ProofListPage; diff --git a/apps/dashboard/src/routes/pages/RedirectWithTokenPage/index.tsx b/apps/dashboard/src/routes/pages/RedirectWithTokenPage/index.tsx new file mode 100644 index 00000000..0a0a6e21 --- /dev/null +++ b/apps/dashboard/src/routes/pages/RedirectWithTokenPage/index.tsx @@ -0,0 +1,37 @@ +import React, { useEffect } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { observer } from "mobx-react"; +import useGlobalAuth from "@dashboard/hooks/useGlobalAuth"; +import config from "@dashboard/routes/config"; +import Page from "@dashboard/components/Page"; +import PageTitle from "@dashboard/components/PageTitle"; +import { Spin } from "antd"; + +const RedirectWithTokenPage = observer(() => { + const { token } = useParams(); + const auth = useGlobalAuth(); + const navigate = useNavigate(); + + useEffect(() => { + async function signInWithToken(token: string | undefined) { + try { + await auth.setToken(token as string); + } catch (e) { + console.error(e); + } + navigate(config.connection_list.getLink(), { replace: true }); + } + + signInWithToken(token); + }, [token, auth, navigate]); + + return ( + <Page> + <PageTitle>Authenticating...</PageTitle> + <h3>You will shortly be redirected to the dashboard.</h3> + <Spin /> + </Page> + ); +}); + +export default RedirectWithTokenPage; diff --git a/apps/dashboard/src/routes/pages/RegisterPage/RegisterPageStore.ts b/apps/dashboard/src/routes/pages/RegisterPage/RegisterPageStore.ts new file mode 100644 index 00000000..1f02fe17 --- /dev/null +++ b/apps/dashboard/src/routes/pages/RegisterPage/RegisterPageStore.ts @@ -0,0 +1,71 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { + CreddefRecordDto, + CredentialRecordDto, + SchemaRecordDto, +} from "@dashboard/engine-api"; +import { v4 } from "uuid"; +import displayError from "@dashboard/utils/displayError"; + +class RegisterPageStore { + public loading = false; + public id = v4(); + public schemaId = + "did:indy:bcovrin:test:FcZ4aS728oRGVdNUKVaECP/anoncreds/v0/SCHEMA/Identity/1.0"; + public schema: SchemaRecordDto | null = null; + public creddef: CreddefRecordDto | null = null; + public shortCredentialUrl: string | null = null; + public credentialUrl: string | null = null; + public credentialRecord: CredentialRecordDto | null = null; + + constructor() { + makeAutoObservable(this); + } + + public async initializeQr(name: string) { + runInAction(() => (this.loading = true)); + try { + const schema = await api.getSchemaById({ id: this.schemaId }); + const credDefs = await api.fetchCredentialDefinitions(); + let requiredCredDef = credDefs.find( + (credDef) => credDef.schemaId === this.schemaId, + ); + if (!requiredCredDef) { + requiredCredDef = await api.createCredentialDefinition({ + schemaId: this.schemaId, + tag: "Identity", + }); + } + + const { shortCredentialUrl, credentialUrl, credentialRecord } = + await api.offerCredential({ + credentialDefinitionId: requiredCredDef.id!, + attributes: [ + { + name: "internal-id", + value: this.id, + }, + { + name: "name", + value: name, + }, + ], + }); + runInAction(() => { + this.schema = schema; + this.creddef = requiredCredDef!; + this.shortCredentialUrl = shortCredentialUrl; + this.credentialUrl = credentialUrl; + this.credentialRecord = credentialRecord; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } +} + +export type { RegisterPageStore }; + +export default RegisterPageStore; diff --git a/apps/dashboard/src/routes/pages/RegisterPage/index.tsx b/apps/dashboard/src/routes/pages/RegisterPage/index.tsx new file mode 100644 index 00000000..b67752e4 --- /dev/null +++ b/apps/dashboard/src/routes/pages/RegisterPage/index.tsx @@ -0,0 +1,118 @@ +import React, { useState } from "react"; +import { observer } from "mobx-react"; +import RegisterPageStore from "./RegisterPageStore"; +import { Button, Form, Input, QRCode } from "antd"; +import Page from "@dashboard/components/Page"; +import VaultHeader from "@dashboard/components/VaultHeader"; +import { Link } from "react-router-dom"; +import config from "@dashboard/routes/config"; +import s from "./styles.module.scss"; + +const RegisterPage = observer(() => { + const [store] = useState(() => new RegisterPageStore()); + + return ( + <Page> + <VaultHeader hideTry /> + <div className={s.topSpace} /> + <div className={s.info}> + <div className={s.subTitle}> + Welcome to the Organization Credential Manager Registration! + </div> + <div> + Start your journey with us by setting up your digital credentials. + It's quick, secure, and will streamline your future sign-ins. + </div> + <br /> + <div> + <b>Steps to Get Started:</b> + </div> + + <ul> + <li> + <b>Download Our Wallet App</b>: If you haven't installed our mobile + wallet application yet,{" "} + <a href="https://play.google.com/store/apps/details?id=com.vereign.vcm"> + click here + </a>{" "} + to download it for Android. + </li> + <li> + <b>Enter Your Details:</b> Fill in the form below with your name. + This name will be encrypted within your credentials, ensuring your + privacy and security. + </li> + <li> + <b>Scan the QR Code:</b> Use your mobile device to scan the QR code + displayed below. This will transfer your credentials directly to + your digital wallet. + </li> + </ul> + + <div> + Once registered, use your credentials to easily and securely sign in + to our application. Your digital identity is safe with us. + </div> + </div> + + <div className={s.registerForm}> + <div className={s.formTitle}>Registration</div> + <Form + layout="vertical" + initialValues={{ + name: "", + id: store.id, + }} + onFinish={({ name }) => { + store.initializeQr(name); + }} + autoComplete="off" + > + <Form.Item label="internal-id" name="id"> + <Input disabled /> + </Form.Item> + <Form.Item + label="Name" + name="name" + rules={[{ required: true, message: "Please enter your name" }]} + > + <Input /> + </Form.Item> + + <div className={s.footerActions}> + <Button + type="primary" + htmlType="submit" + disabled={store.loading} + loading={store.loading} + > + Generate QR code + </Button> + </div> + </Form> + + {(store.loading && !store.shortCredentialUrl) || + (store.shortCredentialUrl && ( + <div className={s.qrWrapper}> + <QRCode + status={ + !store.shortCredentialUrl || store.loading + ? "loading" + : "active" + } + value={store.shortCredentialUrl || "loading"} + size={400} + icon={`${window.BASE_PATH}/assets/Vereign_Logo_ICON_BLACK.png`} + /> + </div> + ))} + </div> + + <div className={s.goToLogin}> + <Link to={config.login.getLink()}>Go to login</Link> + </div> + </Page> + ); +}); + +export default RegisterPage; diff --git a/apps/dashboard/src/routes/pages/RegisterPage/styles.module.scss b/apps/dashboard/src/routes/pages/RegisterPage/styles.module.scss new file mode 100644 index 00000000..5aee29ca --- /dev/null +++ b/apps/dashboard/src/routes/pages/RegisterPage/styles.module.scss @@ -0,0 +1,48 @@ +.topSpace { + margin-top: 30px; +} + +.info { + margin: 0 auto; + max-width: 1000px; +} + +.subTitle { + text-align: center; + font-weight: bold; + font-size: 30px; + color: #00b3ca; + padding: 40px; +} + +.registerForm { + width: 700px; + margin: 80px auto; + background: #fff 0 0 no-repeat padding-box; + box-shadow: 0 3px 40px rgba(0,0,0,.059); + border-radius: 30px; + opacity: 1; + padding: 30px; + flex: 1 1; + border: 3px solid transparent; + display: flex; + flex-direction: column; +} +.formTitle { + font-size: 30px; + color: #00b3ca; + font-weight: bold; + margin-bottom: 12px; +} + +.qrWrapper { + display: flex; + align-items: center; + justify-content: center; + margin: 40px 0 20px 0; +} + +.goToLogin { + margin: 0 0 100px 0; + text-align: center; +} diff --git a/apps/dashboard/src/routes/pages/ResolveDidPage/ResolveDidPageStore.ts b/apps/dashboard/src/routes/pages/ResolveDidPage/ResolveDidPageStore.ts new file mode 100644 index 00000000..5638527b --- /dev/null +++ b/apps/dashboard/src/routes/pages/ResolveDidPage/ResolveDidPageStore.ts @@ -0,0 +1,37 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class ResolveDidPageStore { + public loading = false; + public did = ""; + public resolvedData: unknown = null; + + constructor() { + makeAutoObservable(this); + } + + public resolve = async () => { + runInAction(() => { + this.loading = true; + }); + try { + const response = await api.resolveDid({ id: this.did }); + runInAction(() => { + this.loading = false; + this.resolvedData = response; + }); + } catch (e: unknown) { + displayError(e, "Failed resolve did"); + runInAction(() => { + this.loading = false; + }); + } + + this.loading = false; + }; +} + +export type { ResolveDidPageStore }; + +export default ResolveDidPageStore; diff --git a/apps/dashboard/src/routes/pages/ResolveDidPage/index.tsx b/apps/dashboard/src/routes/pages/ResolveDidPage/index.tsx new file mode 100644 index 00000000..1241dde1 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ResolveDidPage/index.tsx @@ -0,0 +1,47 @@ +import React, { useState } from "react"; +import { observer } from "mobx-react"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; +import { Button, Input, Space } from "antd"; +import ResolveDidPageStore from "./ResolveDidPageStore"; +import { runInAction } from "mobx"; +import JsonDetails from "@dashboard/components/JsonDetails"; +import s from "./styles.module.scss"; + +const ResolveDidPage = observer(() => { + const [store] = useState(() => new ResolveDidPageStore()); + return ( + <PageWithSidebar> + <PageTitle>Resolve did</PageTitle> + <div> + <Space direction="horizontal"> + <Input + className={s.input} + placeholder="did:sov:WRfXPg8dantKVubE3HX8pw" + value={store.did} + onChange={(e) => { + runInAction(() => { + store.did = e.target.value; + }); + }} + /> + <Button + type="primary" + onClick={store.resolve} + loading={store.loading} + disabled={store.loading} + > + Resolve + </Button> + </Space> + </div> + <br /> + <div> + <h3>Resolved document</h3> + <JsonDetails object={store.resolvedData} /> + </div> + </PageWithSidebar> + ); +}); + +export default ResolveDidPage; diff --git a/apps/dashboard/src/routes/pages/ResolveDidPage/styles.module.scss b/apps/dashboard/src/routes/pages/ResolveDidPage/styles.module.scss new file mode 100644 index 00000000..7b67bbd5 --- /dev/null +++ b/apps/dashboard/src/routes/pages/ResolveDidPage/styles.module.scss @@ -0,0 +1,3 @@ +.input { + width: 400px; +} diff --git a/apps/dashboard/src/routes/pages/SchemaListPage/SchemaListPageStore.ts b/apps/dashboard/src/routes/pages/SchemaListPage/SchemaListPageStore.ts new file mode 100644 index 00000000..cf392300 --- /dev/null +++ b/apps/dashboard/src/routes/pages/SchemaListPage/SchemaListPageStore.ts @@ -0,0 +1,29 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { SchemaRecordDto } from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class SchemaListPageStore { + public loading = false; + public list: SchemaRecordDto[] = []; + constructor() { + makeAutoObservable(this); + } + + public async loadAll() { + runInAction(() => (this.loading = true)); + try { + const schemas = await api.fetchSchemas(); + runInAction(() => { + this.list = schemas; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } +} + +export type { SchemaListPageStore }; + +export default SchemaListPageStore; diff --git a/apps/dashboard/src/routes/pages/SchemaListPage/index.tsx b/apps/dashboard/src/routes/pages/SchemaListPage/index.tsx new file mode 100644 index 00000000..e5c3468b --- /dev/null +++ b/apps/dashboard/src/routes/pages/SchemaListPage/index.tsx @@ -0,0 +1,45 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { Button, Spin } from "antd"; +import SchemaListPageStore from "./SchemaListPageStore"; +import SchemaItem from "@dashboard/components/SchemaItem"; +import modalStore from "@dashboard/store/modalStore"; +import NoRecordsMessage from "@dashboard/components/NoRecordsMessage"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; + +const ConnectionListPage = observer(() => { + const [store] = useState(() => new SchemaListPageStore()); + + useEffect(() => { + store.loadAll(); + }, [store]); + return ( + <PageWithSidebar> + <h2>Actions</h2> + <div> + <Button + onClick={() => { + modalStore.openNewSchemaDialog({ + onSchemaCreated: () => { + store.loadAll(); + }, + }); + }} + > + Create new schema + </Button> + </div> + <PageTitle>Schemas</PageTitle> + <div> + {store.list.map((p) => ( + <SchemaItem key={p.id} item={p} /> + ))} + {!store.loading && store.list.length === 0 && <NoRecordsMessage />} + {store.loading && <Spin />} + </div> + </PageWithSidebar> + ); +}); + +export default ConnectionListPage; diff --git a/apps/dashboard/src/routes/pages/SchemaListPage/styles.module.scss b/apps/dashboard/src/routes/pages/SchemaListPage/styles.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/apps/dashboard/src/routes/pages/VcmSelfIssuePage/VcmSelfIssuePageStore.ts b/apps/dashboard/src/routes/pages/VcmSelfIssuePage/VcmSelfIssuePageStore.ts new file mode 100644 index 00000000..ce980f4d --- /dev/null +++ b/apps/dashboard/src/routes/pages/VcmSelfIssuePage/VcmSelfIssuePageStore.ts @@ -0,0 +1,33 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import api, { SchemaRecordDto } from "@dashboard/engine-api"; +import displayError from "@dashboard/utils/displayError"; + +class VcmSelfIssuePageStore { + public loading = false; + public schemas: SchemaRecordDto[] = []; + public selectedSchemaId: string | null = null; + public schemaUrl = ""; + + constructor() { + makeAutoObservable(this); + } + + public async initialize() { + runInAction(() => (this.loading = true)); + try { + const schemas = await api.fetchSchemas(); + + runInAction(() => { + this.schemas = schemas; + this.loading = false; + }); + } catch (e: unknown) { + displayError(e); + runInAction(() => (this.loading = false)); + } + } +} + +export type { VcmSelfIssuePageStore }; + +export default VcmSelfIssuePageStore; diff --git a/apps/dashboard/src/routes/pages/VcmSelfIssuePage/index.tsx b/apps/dashboard/src/routes/pages/VcmSelfIssuePage/index.tsx new file mode 100644 index 00000000..8d5beeac --- /dev/null +++ b/apps/dashboard/src/routes/pages/VcmSelfIssuePage/index.tsx @@ -0,0 +1,60 @@ +import React, { useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import VcmSelfIssuePageStore from "./VcmSelfIssuePageStore"; +import { QRCode, Select, Spin } from "antd"; +import { runInAction } from "mobx"; +import PageWithSidebar from "@dashboard/components/PageWithSidebar"; +import PageTitle from "@dashboard/components/PageTitle"; + +const VcmSelfIssuePage = observer(() => { + const [store] = useState(() => new VcmSelfIssuePageStore()); + useEffect(() => { + store.initialize(); + }, [store]); + + let url = ""; + let json = {}; + if (store.selectedSchemaId) { + json = { + "@type": "https://vereign.com/issue-credential/1.0/self-issue", + schemaId: store.selectedSchemaId, + }; + url = btoa(JSON.stringify(json)); + } + + return ( + <PageWithSidebar> + <PageTitle>VCM: self-issued credentials</PageTitle> + {store.loading && ( + <div> + <Spin /> + Loading... + </div> + )} + <p>Scan this QR code in order to create self-issued credentials</p> + <div> + <Select + placeholder="Select schema" + value={store.selectedSchemaId} + onChange={(val) => { + runInAction(() => { + store.selectedSchemaId = val; + }); + }} + options={store.schemas.map((p) => ({ + value: p.id, + label: p.name, + }))} + /> + </div> + {url && <QRCode value={url} size={256} />} + <br /> + <div>Technical information:</div> + <div> + <pre>{JSON.stringify(json || {}, null, 2)}</pre> + </div> + </PageWithSidebar> + ); +}); + +export default VcmSelfIssuePage; diff --git a/apps/dashboard/src/routes/pages/WelcomePage/index.tsx b/apps/dashboard/src/routes/pages/WelcomePage/index.tsx new file mode 100644 index 00000000..b3f0448d --- /dev/null +++ b/apps/dashboard/src/routes/pages/WelcomePage/index.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import Page from "@dashboard/components/Page"; +import VaultHeader from "@dashboard/components/VaultHeader"; + +const WelcomePage = () => { + return ( + <Page> + <VaultHeader /> + </Page> + ); +}; + +export default WelcomePage; diff --git a/apps/dashboard/src/routes/pages/WelcomePage/styles.module.scss b/apps/dashboard/src/routes/pages/WelcomePage/styles.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/apps/dashboard/src/store/modalStore.tsx b/apps/dashboard/src/store/modalStore.tsx new file mode 100644 index 00000000..e77cd3d5 --- /dev/null +++ b/apps/dashboard/src/store/modalStore.tsx @@ -0,0 +1,99 @@ +import React from "react"; +import { action, makeAutoObservable } from "mobx"; +import { v4 as uuidv4 } from "uuid"; +import Modal, { FcProps } from "@dashboard/components/Modal"; +import ConfirmDialog, { + ConfirmDialogProps, +} from "@dashboard/modals/ConfirmDialog"; +import ReceiveInvitationDialog, { + ReceiveInvitationDialogProps, +} from "@dashboard/modals/ReceiveInvitationDialog"; +import NewCredentialDefDialog, { + NewCredentialDefDialogProps, +} from "@dashboard/modals/NewCredentialDefDialog"; +import NewSchemaDialog, { + NewSchemaDialogProps, +} from "@dashboard/modals/NewSchemaDialog"; +import ViewJsonDialog, { + ViewJsonDialogProps, +} from "@dashboard/modals/ViewJsonDialog"; +import OfferCredentialDialog, { + OfferCredentialDialogProps, +} from "@dashboard/modals/OfferCredentialDialog"; +import RequestProofDialog, { + RequestProofDialogProps, +} from "@dashboard/modals/RequestProofDialog"; +import ViewConnectionlessProofRequest, { + ViewConnectionlessProofRequestProps, +} from "@dashboard/modals/ViewConnectionlessProofRequest"; +import AcceptConnectionlessProofRequestDialog, { + AcceptConnectionlessProofRequestDialogProps, +} from "@dashboard/modals/AcceptConnectionlessProofRequestDialog"; +import ViewConnectionlessCredentialOffer, { + ViewConnectionlessCredentialOfferProps, +} from "@dashboard/modals/ViewConnectionlessCredentialOffer"; +import AcceptConnectionlessCredentialOfferDialog, { + AcceptConnectionlessCredentialOfferDialogProps, +} from "@dashboard/modals/AcceptConnectionlessCredentialOfferDialog"; + +class ModalStore { + public modals: { id: string; modal: unknown }[] = []; + + constructor() { + makeAutoObservable(this); + } + + private removeModal = action((id: string) => { + const modalIndex = this.modals.findIndex((p) => p.id === id); + if (modalIndex >= 0) { + this.modals.splice(modalIndex, 1); + } + }); + + protected open<TData>(Component: React.FC<FcProps<TData>>, data: TData) { + const id = uuidv4(); + this.modals.push({ + id: id, + modal: ( + <Modal + Component={Component} + onClose={() => { + this.removeModal(id); + }} + data={data} + /> + ), + }); + } + + public openConfirmDialog = (data: ConfirmDialogProps) => + this.open(ConfirmDialog, data); + public openReceiveInvitationDialog = (data: ReceiveInvitationDialogProps) => + this.open(ReceiveInvitationDialog, data); + public openNewCredentialDefDialog = (data: NewCredentialDefDialogProps) => + this.open(NewCredentialDefDialog, data); + public openNewSchemaDialog = (data: NewSchemaDialogProps) => + this.open(NewSchemaDialog, data); + public openViewJsonDialog = (data: ViewJsonDialogProps) => + this.open(ViewJsonDialog, data); + public openOfferCredentialDialog = (data: OfferCredentialDialogProps) => + this.open(OfferCredentialDialog, data); + public openRequestProofDialog = (data: RequestProofDialogProps) => + this.open(RequestProofDialog, data); + public openViewConnectionlessProofRequest = ( + data: ViewConnectionlessProofRequestProps, + ) => this.open(ViewConnectionlessProofRequest, data); + public openAcceptConnectionlessProofRequestDialog = ( + data: AcceptConnectionlessProofRequestDialogProps, + ) => this.open(AcceptConnectionlessProofRequestDialog, data); + public openViewConnectionlessCredentialOffer = ( + data: ViewConnectionlessCredentialOfferProps, + ) => this.open(ViewConnectionlessCredentialOffer, data); + public openAcceptConnectionlessCredentialOfferDialog = ( + data: AcceptConnectionlessCredentialOfferDialogProps, + ) => this.open(AcceptConnectionlessCredentialOfferDialog, data); +} + +export type { ModalStore }; + +export default new ModalStore(); diff --git a/apps/dashboard/src/styles.scss b/apps/dashboard/src/styles.scss new file mode 100644 index 00000000..01298ac6 --- /dev/null +++ b/apps/dashboard/src/styles.scss @@ -0,0 +1,35 @@ +/* You can add global styles to this file, and also import other style files */ + +body { + font-family: "Roboto", "Helvetica", "Arial", sans-serif; +} + +a { + color: #00b3ca; +} +a:active, a:hover { + color: #00bbd4; +} + +ul { + list-style-type: none; + padding-inline-start: 12px; + + li { + position: relative; + padding-left: 26px; + margin: 12px 0; + + &::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 12px; + height: 12px; + background-color: #00b3ca; + border-radius: 50%; + } + } +} diff --git a/apps/dashboard/src/utils/displayError.tsx b/apps/dashboard/src/utils/displayError.tsx new file mode 100644 index 00000000..7f1e87d1 --- /dev/null +++ b/apps/dashboard/src/utils/displayError.tsx @@ -0,0 +1,56 @@ +import { ApiException } from "@dashboard/engine-api"; +import { toast } from "react-toastify"; + +function combine(msg1: undefined | string, msg2: string | string[]) { + let secondMsg = []; + if (Array.isArray(msg2)) { + secondMsg = msg2; + } else { + secondMsg.push(msg2); + } + return ( + <div> + {msg1} + {secondMsg.map((p, index) => ( + <> + {index === 0 && !!msg1 && <br />} + {index > 0 && <br />} + {p} + </> + ))} + </div> + ); +} + +const displayError = (e: unknown, msg?: string) => { + console.error(e); + + if (e instanceof ApiException) { + let serverResponse: { + message: string | string[]; + statusCode: number; + } | null; + try { + serverResponse = JSON.parse(e.response); + } catch (parseError: unknown) { + console.error("Can not parse the server response"); + toast.error(combine(msg, e.message)); + return; + } + + if (serverResponse && serverResponse.message) { + toast.error(combine(msg, serverResponse.message)); + } else { + toast.error(combine(msg, e.message)); + } + return; + } + + if (e instanceof Error) { + toast.error(combine(msg, e.message)); + } else { + toast.error(combine(msg, "Unknown error")); + } +}; + +export default displayError; diff --git a/apps/dashboard/src/utils/getConfig.ts b/apps/dashboard/src/utils/getConfig.ts new file mode 100644 index 00000000..835d16a7 --- /dev/null +++ b/apps/dashboard/src/utils/getConfig.ts @@ -0,0 +1,20 @@ +export interface Config { + OCMENGINE_HTTP_URL: string; + OCMENGINE_WS_URL: string; + TSA_URL: string; + BASE_PATH: string; +} + +const lsHttp = localStorage.getItem("OCMENGINE_HTTP_URL"); +const lsWs = localStorage.getItem("OCMENGINE_WS_URL"); +const tsaHttp = localStorage.getItem("TSA_URL"); +export const getConfig = (): Config => { + return { + OCMENGINE_HTTP_URL: lsHttp || window.OCMENGINE_HTTP_URL, + OCMENGINE_WS_URL: lsWs || window.OCMENGINE_WS_URL, + TSA_URL: tsaHttp || window.TSA_URL, + BASE_PATH: window.BASE_PATH, + }; +}; + +export default getConfig; diff --git a/apps/dashboard/tsconfig.app.json b/apps/dashboard/tsconfig.app.json new file mode 100644 index 00000000..4ec1130e --- /dev/null +++ b/apps/dashboard/tsconfig.app.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [ + "node", + + "@nx/react/typings/cssmodule.d.ts", + "@nx/react/typings/image.d.ts", + "./cssmodule.d.ts", + "./types.d.ts", + ] + }, + "files": [ + "./cssmodule.d.ts", + "./types.d.ts" + ], + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.spec.tsx", + "src/**/*.test.tsx", + "src/**/*.spec.js", + "src/**/*.test.js", + "src/**/*.spec.jsx", + "src/**/*.test.jsx" + ], + "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"] +} diff --git a/apps/dashboard/tsconfig.json b/apps/dashboard/tsconfig.json new file mode 100644 index 00000000..21b50710 --- /dev/null +++ b/apps/dashboard/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "extends": "../../tsconfig.base.json" +} diff --git a/apps/dashboard/tsconfig.spec.json b/apps/dashboard/tsconfig.spec.json new file mode 100644 index 00000000..6fc72887 --- /dev/null +++ b/apps/dashboard/tsconfig.spec.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ], + "types": ["@nx/react/typings/cssmodule.d.ts", "@nx/react/typings/image.d.ts"] +} diff --git a/apps/dashboard/types.d.ts b/apps/dashboard/types.d.ts new file mode 100644 index 00000000..fca3e2ad --- /dev/null +++ b/apps/dashboard/types.d.ts @@ -0,0 +1,9 @@ +export {}; +declare global { + interface Window { + BASE_PATH: string; + OCMENGINE_HTTP_URL: string; + OCMENGINE_WS_URL: string; + TSA_URL: string; + } +} diff --git a/apps/dashboard/webpack.config.js b/apps/dashboard/webpack.config.js new file mode 100644 index 00000000..c5605d22 --- /dev/null +++ b/apps/dashboard/webpack.config.js @@ -0,0 +1,9 @@ +const { composePlugins, withNx } = require("@nx/webpack"); +const { withReact } = require("@nx/react"); + +// Nx plugins for webpack +module.exports = composePlugins(withNx(), withReact(), (config) => { + // Update the webpack config as needed here. + // e.g. `config.plugins.push(new MyPlugin())` + return config; +}); diff --git a/client-generator.sh b/client-generator.sh new file mode 100755 index 00000000..c6e58c67 --- /dev/null +++ b/client-generator.sh @@ -0,0 +1,45 @@ +#!/bin/bash +set -e + +# This function represents an action for the 'tsa' command. +handle_tsa() { + echo "Generating TSA not implemented" + exit 1 + echo "Generating ts client for tsa..." + dotnet run --project server/TsClientGenerator ./login-code/gen/http/openapi3.json ./ocm-engine/libs/dashboard/tsa-api/src/tsa_gen.ts + + echo "patching tsa client..." + sed -i "" 's/login#/login/g' ./ocm-engine/libs/dashboard/tsa-api/src/tsa_gen.ts + sed -i "" 's/Login#/Login/g' ./ocm-engine/libs/dashboard/tsa-api/src/tsa_gen.ts + sed -i "" 's/health#/health/g' ./ocm-engine/libs/dashboard/tsa-api/src/tsa_gen.ts + sed -i "" 's/Health#/Health/g' ./ocm-engine/libs/dashboard/tsa-api/src/tsa_gen.ts +} + +handle_ocmengine_gen() { + echo "Generating ts client for agent..." + docker build -t ts-client-generator -f ./libs/ts-client-generator/Dockerfile . + docker run --rm -v ./libs/clients/src/frontend:/app/generated ts-client-generator +} + +# Check that exactly one argument is provided +if [ "$#" -ne 1 ]; then + echo "Usage: $0 {ocmengine|tsa}" + exit 1 +fi + +# Perform an action based on the argument. +case "$1" in + tsa) + handle_tsa + ;; + ocmengine) + handle_ocmengine_gen + ;; + *) + echo "Unknown command: $1" + echo "Usage: $0 {ocmengine|tsa}" + exit 2 + ;; +esac + +exit 0 diff --git a/gateway-swagger.json b/gateway-swagger.json index cc61721c..043dd7c1 100644 --- a/gateway-swagger.json +++ b/gateway-swagger.json @@ -1451,14 +1451,6 @@ "Credentials Proof" ], "parameters": [ - { - "name": "isVerified", - "required": false, - "in": "query", - "schema": { - "type": "boolean" - } - }, { "name": "states", "required": false, @@ -2130,9 +2122,6 @@ "ProofFilterDto": { "type": "object", "properties": { - "isVerified": { - "type": "boolean" - }, "states": { "type": "array", "items": { @@ -2497,19 +2486,7 @@ "type": "object", "properties": {} }, - "ConnectionNotFoundError": { - "type": "object", - "properties": {} - }, - "CredentialNotFoundError": { - "type": "object", - "properties": {} - }, - "CredentialDefinitionNotFoundError": { - "type": "object", - "properties": {} - }, - "ProofNotFoundError": { + "EntityNotFoundError": { "type": "object", "properties": {} }, @@ -2528,10 +2505,6 @@ "ConnectionUnsupportedTypeError": { "type": "object", "properties": {} - }, - "SchemaNotFoundError": { - "type": "object", - "properties": {} } } } diff --git a/libs/askar/src/askar/agent.service.ts b/libs/askar/src/askar/agent.service.ts index 11605cd6..464e9c4e 100644 --- a/libs/askar/src/askar/agent.service.ts +++ b/libs/askar/src/askar/agent.service.ts @@ -92,6 +92,7 @@ export class AgentService { response.invitationDid = connectionRecord.invitationDid; response.outOfBandId = connectionRecord.outOfBandId; response.createdAt = connectionRecord.createdAt; + response.updatedAt = connectionRecord.updatedAt; response.imageUrl = connectionRecord.imageUrl; return response; @@ -119,12 +120,20 @@ export class AgentService { query.push(roleQuery); } - const invitations = await this.askar.agent.oob.findAllByQuery({ + let invitations = await this.askar.agent.oob.findAllByQuery({ $and: query, }); + invitations = invitations.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), + ); const invitationsResponse = invitations.map((invitation) => { const response = new CreateInvitationResponseDto(); + response.invitationUrl = invitation.outOfBandInvitation.toUrl({ + domain: this.askar.agentConfig.agentPeerAddress, + }); + response.shortInvitationUrl = `${this.askar.agentConfig.agentPeerAddress}/invitations/${invitation.outOfBandInvitation.id}`; response.outOfBandId = invitation.id; response.createdAt = invitation.createdAt; response.updatedAt = invitation.updatedAt; @@ -140,6 +149,10 @@ export class AgentService { const invitation = await this.askar.agent.oob.getById(oobId); const response = new CreateInvitationResponseDto(); + response.invitationUrl = invitation.outOfBandInvitation.toUrl({ + domain: this.askar.agentConfig.agentPeerAddress, + }); + response.shortInvitationUrl = `${this.askar.agentConfig.agentPeerAddress}/invitations/${invitation.outOfBandInvitation.id}`; response.outOfBandId = invitation.id; response.createdAt = invitation.createdAt; response.updatedAt = invitation.updatedAt; @@ -149,7 +162,11 @@ export class AgentService { }; async fetchConnections(): Promise<ConnectionRecordDto[]> { - const agentResponse = await this.askar.agent.connections.getAll(); + //TODO: no ordering in findAllByQuery + const agentResponse = (await this.askar.agent.connections.getAll()).sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), + ); const connectionArray = agentResponse.map((singleConnectionRes) => { const connectionResponse = new ConnectionRecordDto(); @@ -161,6 +178,7 @@ export class AgentService { connectionResponse.invitationDid = singleConnectionRes.invitationDid; connectionResponse.outOfBandId = singleConnectionRes.outOfBandId; connectionResponse.createdAt = singleConnectionRes.createdAt; + connectionResponse.updatedAt = singleConnectionRes.updatedAt; connectionResponse.imageUrl = singleConnectionRes.imageUrl; return connectionResponse; @@ -183,6 +201,7 @@ export class AgentService { connectionResponse.invitationDid = singleConnectionRes.invitationDid; connectionResponse.outOfBandId = singleConnectionRes.outOfBandId; connectionResponse.createdAt = singleConnectionRes.createdAt; + connectionResponse.updatedAt = singleConnectionRes.updatedAt; connectionResponse.imageUrl = singleConnectionRes.imageUrl; return connectionResponse; @@ -207,6 +226,7 @@ export class AgentService { connectionResponse.invitationDid = agentResponse.invitationDid; connectionResponse.outOfBandId = agentResponse.outOfBandId; connectionResponse.createdAt = agentResponse.createdAt; + connectionResponse.updatedAt = agentResponse.updatedAt; connectionResponse.imageUrl = agentResponse.imageUrl; return connectionResponse; @@ -217,12 +237,18 @@ export class AgentService { }; fetchSchemas = async (): Promise<SchemaRecordDto[]> => { - const agentResponse = + let schemaRecords = await this.askar.agent.modules.anoncreds.getCreatedSchemas({}); + schemaRecords = schemaRecords.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), + ); - const schemaResponses = agentResponse.map((singleSchemaRes) => { + const schemaResponses = schemaRecords.map((singleSchemaRes) => { const schemaResponse = new SchemaRecordDto(); schemaResponse.id = singleSchemaRes.schemaId; + schemaResponse.createdAt = singleSchemaRes.createdAt; + schemaResponse.updatedAt = singleSchemaRes.updatedAt; schemaResponse.name = singleSchemaRes.schema.name; schemaResponse.attributes = singleSchemaRes.schema.attrNames; schemaResponse.version = singleSchemaRes.schema.version; @@ -286,15 +312,21 @@ export class AgentService { }; fetchCredentialDefinitions = async (): Promise<CreddefRecordDto[]> => { - const credentialDefinitions = + let credentialDefinitions = await this.askar.agent.modules.anoncreds.getCreatedCredentialDefinitions( {}, ); + credentialDefinitions = credentialDefinitions.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), + ); const response: Array<CreddefRecordDto> = []; for (const credDef of credentialDefinitions) { const cd = new CreddefRecordDto(); cd.id = credDef.credentialDefinitionId; + cd.createdAt = credDef.createdAt; + cd.updatedAt = credDef.updatedAt; cd.schemaId = credDef.credentialDefinition.schemaId; cd.issuerId = credDef.credentialDefinition.issuerId; cd.tag = credDef.credentialDefinition.tag; @@ -319,6 +351,8 @@ export class AgentService { const cd = new CreddefRecordDto(); cd.id = credDef.credentialDefinitionId; + cd.createdAt = credDef.createdAt; + cd.updatedAt = credDef.updatedAt; cd.schemaId = credDef.credentialDefinition.schemaId; cd.issuerId = credDef.credentialDefinition.issuerId; cd.tag = credDef.credentialDefinition.tag; @@ -537,9 +571,13 @@ export class AgentService { query.push(connectionQuery); } - const credentials = await this.askar.agent.credentials.findAllByQuery({ + let credentials = await this.askar.agent.credentials.findAllByQuery({ $and: query, }); + credentials = credentials.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), + ); const response: CredentialRecordDto[] = []; for (const offer of credentials) { @@ -713,9 +751,13 @@ export class AgentService { query.push(connectionQuery); } - const proofs = await this.askar.agent.proofs.findAllByQuery({ + let proofs = await this.askar.agent.proofs.findAllByQuery({ $and: query, }); + proofs = proofs.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), + ); const response: ProofRecordDto[] = []; for (const proof of proofs) { @@ -912,9 +954,13 @@ export class AgentService { query.push(connectionQuery); } - const messages = await this.askar.agent.basicMessages.findAllByQuery({ + let messages = await this.askar.agent.basicMessages.findAllByQuery({ $and: query, }); + messages = messages.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), + ); const connectionIds = messages.map((message) => message.connectionId); diff --git a/libs/clients/project.json b/libs/clients/project.json index ee70f779..c34a5828 100644 --- a/libs/clients/project.json +++ b/libs/clients/project.json @@ -11,7 +11,7 @@ "outputPath": "dist/libs/clients", "tsConfig": "libs/clients/tsconfig.lib.json", "packageJson": "libs/clients/package.json", - "main": "libs/clients/src/index.ts", + "main": "libs/clients/src/backend.ts", "assets": ["libs/clients/*.md"] } }, diff --git a/libs/clients/src/backend.ts b/libs/clients/src/backend.ts new file mode 100644 index 00000000..59ca4687 --- /dev/null +++ b/libs/clients/src/backend.ts @@ -0,0 +1,4 @@ +export * from "./backend/gateway.client"; +export * from "./backend/connection.manager.client"; +export * from "./backend/attestation.manager.client"; +export * from "./backend/proof.manager.client"; diff --git a/libs/clients/src/lib/attestation.manager.client.ts b/libs/clients/src/backend/attestation.manager.client.ts similarity index 100% rename from libs/clients/src/lib/attestation.manager.client.ts rename to libs/clients/src/backend/attestation.manager.client.ts diff --git a/libs/clients/src/lib/connection.manager.client.ts b/libs/clients/src/backend/connection.manager.client.ts similarity index 100% rename from libs/clients/src/lib/connection.manager.client.ts rename to libs/clients/src/backend/connection.manager.client.ts diff --git a/libs/clients/src/lib/gateway.client.ts b/libs/clients/src/backend/gateway.client.ts similarity index 100% rename from libs/clients/src/lib/gateway.client.ts rename to libs/clients/src/backend/gateway.client.ts diff --git a/libs/clients/src/lib/proof.manager.client.ts b/libs/clients/src/backend/proof.manager.client.ts similarity index 100% rename from libs/clients/src/lib/proof.manager.client.ts rename to libs/clients/src/backend/proof.manager.client.ts diff --git a/libs/clients/src/frontend/agent_gen.ts b/libs/clients/src/frontend/agent_gen.ts new file mode 100644 index 00000000..af5ab0b7 --- /dev/null +++ b/libs/clients/src/frontend/agent_gen.ts @@ -0,0 +1,1647 @@ +//---------------------- +// <auto-generated> +// Generated using the NSwag toolchain v13.20.0.0 (NJsonSchema v10.9.0.0 (Newtonsoft.Json v10.0.0.0)) (http://NSwag.org) +// </auto-generated> +//---------------------- + +/* tslint:disable */ +/* eslint-disable */ +// ReSharper disable InconsistentNaming + +export class RestControllerClient { + private http: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }; + private baseUrl: string; + public jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }) { + this.http = http ? http : window as any; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : ""; + } + + fetchInvitations(states: States[] | undefined, roles: Roles[] | undefined): Promise<CreateInvitationResponseDto[]> { + let url_ = this.baseUrl + "/api/v1/invitations?"; + if (states === null) + throw new Error("The parameter 'states' cannot be null."); + else if (states !== undefined) + states && states.forEach(item => { url_ += "states=" + encodeURIComponent("" + item) + "&"; }); + if (roles === null) + throw new Error("The parameter 'roles' cannot be null."); + else if (roles !== undefined) + roles && roles.forEach(item => { url_ += "roles=" + encodeURIComponent("" + item) + "&"; }); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processFetchInvitations(_response); + }); + } + + protected processFetchInvitations(response: Response): Promise<CreateInvitationResponseDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CreateInvitationResponseDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CreateInvitationResponseDto[]>(null as any); + } + + createInvitation(body: CreateInvitationRequestDto): Promise<CreateInvitationResponseDto> { + let url_ = this.baseUrl + "/api/v1/invitations"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processCreateInvitation(_response); + }); + } + + protected processCreateInvitation(response: Response): Promise<CreateInvitationResponseDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CreateInvitationResponseDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CreateInvitationResponseDto>(null as any); + } + + getInvitationById(id: string): Promise<CreateInvitationResponseDto> { + let url_ = this.baseUrl + "/api/v1/invitations/{id}"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetInvitationById(_response); + }); + } + + protected processGetInvitationById(response: Response): Promise<CreateInvitationResponseDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CreateInvitationResponseDto; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CreateInvitationResponseDto>(null as any); + } + + deleteInvitationById(id: string): Promise<void> { + let url_ = this.baseUrl + "/api/v1/invitations/{id}"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "DELETE", + headers: { + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processDeleteInvitationById(_response); + }); + } + + protected processDeleteInvitationById(response: Response): Promise<void> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + return; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<void>(null as any); + } + + acceptInvitation(body: AcceptInvitationRequestDto): Promise<ConnectionRecordDto> { + let url_ = this.baseUrl + "/api/v1/invitations/accept"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processAcceptInvitation(_response); + }); + } + + protected processAcceptInvitation(response: Response): Promise<ConnectionRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ConnectionRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ConnectionRecordDto>(null as any); + } + + fetchConnections(): Promise<ConnectionRecordDto[]> { + let url_ = this.baseUrl + "/api/v1/connections"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processFetchConnections(_response); + }); + } + + protected processFetchConnections(response: Response): Promise<ConnectionRecordDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ConnectionRecordDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ConnectionRecordDto[]>(null as any); + } + + getConnectionById(id: string): Promise<ConnectionRecordDto> { + let url_ = this.baseUrl + "/api/v1/connections/{id}"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetConnectionById(_response); + }); + } + + protected processGetConnectionById(response: Response): Promise<ConnectionRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ConnectionRecordDto; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ConnectionRecordDto>(null as any); + } + + deleteConnectionById(id: string): Promise<void> { + let url_ = this.baseUrl + "/api/v1/connections/{id}"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "DELETE", + headers: { + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processDeleteConnectionById(_response); + }); + } + + protected processDeleteConnectionById(response: Response): Promise<void> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + return; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<void>(null as any); + } + + getConnectionByOobId(id: string): Promise<ConnectionRecordDto[]> { + let url_ = this.baseUrl + "/api/v1/connections/oob/{id}"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetConnectionByOobId(_response); + }); + } + + protected processGetConnectionByOobId(response: Response): Promise<ConnectionRecordDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ConnectionRecordDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ConnectionRecordDto[]>(null as any); + } + + createSchema(body: CreateSchemaRequestDto): Promise<SchemaRecordDto> { + let url_ = this.baseUrl + "/api/v1/schemas"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processCreateSchema(_response); + }); + } + + protected processCreateSchema(response: Response): Promise<SchemaRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as SchemaRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<SchemaRecordDto>(null as any); + } + + fetchSchemas(): Promise<SchemaRecordDto[]> { + let url_ = this.baseUrl + "/api/v1/schemas"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processFetchSchemas(_response); + }); + } + + protected processFetchSchemas(response: Response): Promise<SchemaRecordDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as SchemaRecordDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<SchemaRecordDto[]>(null as any); + } + + getSchemaById(body: IdReqDto): Promise<SchemaRecordDto> { + let url_ = this.baseUrl + "/api/v1/schemas/get-by-id"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetSchemaById(_response); + }); + } + + protected processGetSchemaById(response: Response): Promise<SchemaRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as SchemaRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<SchemaRecordDto>(null as any); + } + + fetchCredentialDefinitions(): Promise<CreddefRecordDto[]> { + let url_ = this.baseUrl + "/api/v1/definitions"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processFetchCredentialDefinitions(_response); + }); + } + + protected processFetchCredentialDefinitions(response: Response): Promise<CreddefRecordDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CreddefRecordDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CreddefRecordDto[]>(null as any); + } + + createCredentialDefinition(body: CreateCredentialDefinitionRequestDto): Promise<CreddefRecordDto> { + let url_ = this.baseUrl + "/api/v1/definitions"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processCreateCredentialDefinition(_response); + }); + } + + protected processCreateCredentialDefinition(response: Response): Promise<CreddefRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CreddefRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CreddefRecordDto>(null as any); + } + + getCredentialDefinitionById(body: IdReqDto): Promise<CreddefRecordDto> { + let url_ = this.baseUrl + "/api/v1/definitions/get-by-id"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetCredentialDefinitionById(_response); + }); + } + + protected processGetCredentialDefinitionById(response: Response): Promise<CreddefRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CreddefRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CreddefRecordDto>(null as any); + } + + offerCredential(body: OfferCredentialRequestDto): Promise<CredentialOfferResponseDto> { + let url_ = this.baseUrl + "/api/v1/credentials/offers"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processOfferCredential(_response); + }); + } + + protected processOfferCredential(response: Response): Promise<CredentialOfferResponseDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CredentialOfferResponseDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CredentialOfferResponseDto>(null as any); + } + + fetchCredentials(states: States2[] | undefined, connectionId: string | undefined): Promise<CredentialRecordDto[]> { + let url_ = this.baseUrl + "/api/v1/credentials?"; + if (states === null) + throw new Error("The parameter 'states' cannot be null."); + else if (states !== undefined) + states && states.forEach(item => { url_ += "states=" + encodeURIComponent("" + item) + "&"; }); + if (connectionId === null) + throw new Error("The parameter 'connectionId' cannot be null."); + else if (connectionId !== undefined) + url_ += "connectionId=" + encodeURIComponent("" + connectionId) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processFetchCredentials(_response); + }); + } + + protected processFetchCredentials(response: Response): Promise<CredentialRecordDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CredentialRecordDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CredentialRecordDto[]>(null as any); + } + + getCredentialById(id: string): Promise<CredentialRecordDto> { + let url_ = this.baseUrl + "/api/v1/credentials/{id}"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetCredentialById(_response); + }); + } + + protected processGetCredentialById(response: Response): Promise<CredentialRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CredentialRecordDto; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CredentialRecordDto>(null as any); + } + + deleteCredentialById(id: string): Promise<void> { + let url_ = this.baseUrl + "/api/v1/credentials/{id}"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "DELETE", + headers: { + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processDeleteCredentialById(_response); + }); + } + + protected processDeleteCredentialById(response: Response): Promise<void> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + return; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<void>(null as any); + } + + getCredentialFormatDataById(id: string): Promise<CredentialFormatDataDto> { + let url_ = this.baseUrl + "/api/v1/credentials/{id}/format-data"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetCredentialFormatDataById(_response); + }); + } + + protected processGetCredentialFormatDataById(response: Response): Promise<CredentialFormatDataDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CredentialFormatDataDto; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CredentialFormatDataDto>(null as any); + } + + acceptCredential(body: AcceptCredentialDto): Promise<CredentialRecordDto> { + let url_ = this.baseUrl + "/api/v1/credentials/offers/accept"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processAcceptCredential(_response); + }); + } + + protected processAcceptCredential(response: Response): Promise<CredentialRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CredentialRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CredentialRecordDto>(null as any); + } + + declineCredential(credential_record_id: string): Promise<CredentialRecordDto> { + let url_ = this.baseUrl + "/api/v1/credentials/offers/{credential_record_id}/decline"; + if (credential_record_id === undefined || credential_record_id === null) + throw new Error("The parameter 'credential_record_id' must be defined."); + url_ = url_.replace("{credential_record_id}", encodeURIComponent("" + credential_record_id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processDeclineCredential(_response); + }); + } + + protected processDeclineCredential(response: Response): Promise<CredentialRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as CredentialRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<CredentialRecordDto>(null as any); + } + + sendMessage(body: MakeBasicMessageRequestDto): Promise<MessageRecordDto> { + let url_ = this.baseUrl + "/api/v1/messages"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processSendMessage(_response); + }); + } + + protected processSendMessage(response: Response): Promise<MessageRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as MessageRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<MessageRecordDto>(null as any); + } + + fetchBasicMessages(role: Role | undefined, connectionId: string | undefined): Promise<MessageRecordDto[]> { + let url_ = this.baseUrl + "/api/v1/messages?"; + if (role === null) + throw new Error("The parameter 'role' cannot be null."); + else if (role !== undefined) + url_ += "role=" + encodeURIComponent("" + role) + "&"; + if (connectionId === null) + throw new Error("The parameter 'connectionId' cannot be null."); + else if (connectionId !== undefined) + url_ += "connectionId=" + encodeURIComponent("" + connectionId) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processFetchBasicMessages(_response); + }); + } + + protected processFetchBasicMessages(response: Response): Promise<MessageRecordDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as MessageRecordDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<MessageRecordDto[]>(null as any); + } + + deleteBasicMessage(id: string): Promise<void> { + let url_ = this.baseUrl + "/api/v1/messages/{id}"; + if (id === undefined || id === null) + throw new Error("The parameter 'id' must be defined."); + url_ = url_.replace("{id}", encodeURIComponent("" + id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "DELETE", + headers: { + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processDeleteBasicMessage(_response); + }); + } + + protected processDeleteBasicMessage(response: Response): Promise<void> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + return; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<void>(null as any); + } + + fetchProofs(states: States3[] | undefined, connectionId: string | undefined): Promise<ProofRecordDto[]> { + let url_ = this.baseUrl + "/api/v1/proofs?"; + if (states === null) + throw new Error("The parameter 'states' cannot be null."); + else if (states !== undefined) + states && states.forEach(item => { url_ += "states=" + encodeURIComponent("" + item) + "&"; }); + if (connectionId === null) + throw new Error("The parameter 'connectionId' cannot be null."); + else if (connectionId !== undefined) + url_ += "connectionId=" + encodeURIComponent("" + connectionId) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processFetchProofs(_response); + }); + } + + protected processFetchProofs(response: Response): Promise<ProofRecordDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProofRecordDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ProofRecordDto[]>(null as any); + } + + getProofById(proof_record_id: string): Promise<ProofRecordDto> { + let url_ = this.baseUrl + "/api/v1/proofs/{proof_record_id}"; + if (proof_record_id === undefined || proof_record_id === null) + throw new Error("The parameter 'proof_record_id' must be defined."); + url_ = url_.replace("{proof_record_id}", encodeURIComponent("" + proof_record_id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetProofById(_response); + }); + } + + protected processGetProofById(response: Response): Promise<ProofRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProofRecordDto; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ProofRecordDto>(null as any); + } + + deleteProofById(proof_record_id: string): Promise<void> { + let url_ = this.baseUrl + "/api/v1/proofs/{proof_record_id}"; + if (proof_record_id === undefined || proof_record_id === null) + throw new Error("The parameter 'proof_record_id' must be defined."); + url_ = url_.replace("{proof_record_id}", encodeURIComponent("" + proof_record_id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "DELETE", + headers: { + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processDeleteProofById(_response); + }); + } + + protected processDeleteProofById(response: Response): Promise<void> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + return; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<void>(null as any); + } + + getProofFormatDataById(proof_record_id: string): Promise<ProofFormatDataDto> { + let url_ = this.baseUrl + "/api/v1/proofs/{proof_record_id}/format-data"; + if (proof_record_id === undefined || proof_record_id === null) + throw new Error("The parameter 'proof_record_id' must be defined."); + url_ = url_.replace("{proof_record_id}", encodeURIComponent("" + proof_record_id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetProofFormatDataById(_response); + }); + } + + protected processGetProofFormatDataById(response: Response): Promise<ProofFormatDataDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProofFormatDataDto; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ProofFormatDataDto>(null as any); + } + + proofAcceptanceWait(proof_record_id: string): Promise<ProofFormatDataDto> { + let url_ = this.baseUrl + "/api/v1/proofs/{proof_record_id}/acceptance-wait"; + if (proof_record_id === undefined || proof_record_id === null) + throw new Error("The parameter 'proof_record_id' must be defined."); + url_ = url_.replace("{proof_record_id}", encodeURIComponent("" + proof_record_id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processProofAcceptanceWait(_response); + }); + } + + protected processProofAcceptanceWait(response: Response): Promise<ProofFormatDataDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProofFormatDataDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ProofFormatDataDto>(null as any); + } + + requestProof(body: RequestProofDto): Promise<RequestProofResponseDto> { + let url_ = this.baseUrl + "/api/v1/proofs/request"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processRequestProof(_response); + }); + } + + protected processRequestProof(response: Response): Promise<RequestProofResponseDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as RequestProofResponseDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<RequestProofResponseDto>(null as any); + } + + acceptProof(body: AcceptProofDto): Promise<ProofRecordDto> { + let url_ = this.baseUrl + "/api/v1/proofs/accept"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processAcceptProof(_response); + }); + } + + protected processAcceptProof(response: Response): Promise<ProofRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProofRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ProofRecordDto>(null as any); + } + + declineProofRequest(proof_record_id: string): Promise<ProofRecordDto> { + let url_ = this.baseUrl + "/api/v1/proofs/{proof_record_id}/decline"; + if (proof_record_id === undefined || proof_record_id === null) + throw new Error("The parameter 'proof_record_id' must be defined."); + url_ = url_.replace("{proof_record_id}", encodeURIComponent("" + proof_record_id)); + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processDeclineProofRequest(_response); + }); + } + + protected processDeclineProofRequest(response: Response): Promise<ProofRecordDto> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProofRecordDto; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<ProofRecordDto>(null as any); + } + + getCreatedDids(): Promise<DidRecordDto[]> { + let url_ = this.baseUrl + "/api/v1/created-dids"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetCreatedDids(_response); + }); + } + + protected processGetCreatedDids(response: Response): Promise<DidRecordDto[]> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DidRecordDto[]; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<DidRecordDto[]>(null as any); + } + + resolveDid(body: IdReqDto): Promise<any> { + let url_ = this.baseUrl + "/api/v1/resolve-did"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processResolveDid(_response); + }); + } + + protected processResolveDid(response: Response): Promise<any> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 201) { + return response.text().then((_responseText) => { + let result201: any = null; + result201 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as any; + return result201; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<any>(null as any); + } +} + +export interface CreateInvitationResponseDto { + /** Example of long invitation url */ + invitationUrl?: string; + shortInvitationUrl?: string; + outOfBandId?: string; + role?: CreateInvitationResponseDtoRole; + state?: CreateInvitationResponseDtoState; + id?: string; + createdAt?: Date; + updatedAt?: Date; + + [key: string]: any; +} + +export interface CreateInvitationRequestDto { + goal?: string; + label?: string; + alias?: string; + imageUrl?: string; + multiUseInvitation?: boolean; + + [key: string]: any; +} + +export interface AcceptInvitationRequestDto { + /** Example of long invitation url */ + invitationUrl: string; + shortInvitationUrl: string; + + [key: string]: any; +} + +export interface ConnectionRecordDto { + state: ConnectionRecordDtoState; + connectionName?: string; + alias?: string; + did?: string; + invitationDid?: string; + outOfBandId?: string; + imageUrl?: string; + id?: string; + createdAt?: Date; + updatedAt?: Date; + + [key: string]: any; +} + +export interface CreateSchemaRequestDto { + name: string; + attributes: string[]; + version: string; + + [key: string]: any; +} + +export interface SchemaRecordDto { + name: string; + attributes: string[]; + version: string; + issuerId?: string; + methodName?: string; + id?: string; + createdAt?: Date; + updatedAt?: Date; + + [key: string]: any; +} + +export interface IdReqDto { + id: string; + + [key: string]: any; +} + +export interface CreddefRecordDto { + schemaId: string; + issuerId: string; + tag: string; + id?: string; + createdAt?: Date; + updatedAt?: Date; + + [key: string]: any; +} + +export interface CreateCredentialDefinitionRequestDto { + schemaId: string; + tag: string; + + [key: string]: any; +} + +export interface OfferCredentialAttributes { + name: string; + value: string; + + [key: string]: any; +} + +export interface OfferCredentialRequestDto { + connectionId?: string; + credentialDefinitionId: string; + attributes: OfferCredentialAttributes[]; + + [key: string]: any; +} + +export interface CredentialRecordDto { + state: CredentialRecordDtoState; + credentialRecordType: string; + connectionId?: string; + attributes?: OfferCredentialAttributes[]; + tags: any; + id?: string; + createdAt?: Date; + updatedAt?: Date; + + [key: string]: any; +} + +export interface CredentialOfferResponseDto { + credentialUrl: string | null; + shortCredentialUrl: string | null; + credentialRecord: CredentialRecordDto; + + [key: string]: any; +} + +export interface CredentialFormatDataDto { + proposalAttributes?: any[]; + offerAttributes?: any[]; + anoncredsProposal?: any; + anoncredsOffer?: any; + anoncredsRequest?: any; + anoncredsCredential?: any; + + [key: string]: any; +} + +export interface AcceptCredentialDto { + credentialId: string; + credentialUrl: string; + + [key: string]: any; +} + +export interface MakeBasicMessageRequestDto { + connectionId: string; + message: string; + + [key: string]: any; +} + +export interface MessageRecordDto { + connectionId: string; + role: MessageRecordDtoRole; + sentTime: string; + from?: string; + to?: string; + content: string; + id?: string; + createdAt?: Date; + updatedAt?: Date; + + [key: string]: any; +} + +export interface ProofRecordDto { + connectionId?: string; + state: ProofRecordDtoState; + tags: any; + id?: string; + createdAt?: Date; + updatedAt?: Date; + + [key: string]: any; +} + +export interface ProofFormatDataDto { + anoncredsProposal?: any; + anoncredsRequest?: any; + anoncredsPresentation?: any; + + [key: string]: any; +} + +export interface RequestProofAttribute { + attributeName: string; + credentialDefinitionId: string; + schemaId: string; + + [key: string]: any; +} + +export interface RequestProofDto { + connectionId?: string; + attributes: RequestProofAttribute[]; + + [key: string]: any; +} + +export interface RequestProofResponseDto { + proofUrl: string | null; + shortProofUrl: string | null; + proofRecord: ProofRecordDto; + + [key: string]: any; +} + +export interface AcceptProofDto { + proofId: string; + proofUrl: string; + + [key: string]: any; +} + +export interface DidRecordDto { + did: string; + role: DidRecordDtoRole; + method: string; + tags: any; + id?: string; + createdAt?: Date; + updatedAt?: Date; + + [key: string]: any; +} + +export enum States { + Initial = "initial", + AwaitResponse = "await-response", + PrepareResponse = "prepare-response", + Done = "done", +} + +export enum Roles { + Sender = "sender", + Receiver = "receiver", +} + +export enum States2 { + ProposalSent = "proposal-sent", + ProposalReceived = "proposal-received", + OfferSent = "offer-sent", + OfferReceived = "offer-received", + Declined = "declined", + RequestSent = "request-sent", + RequestReceived = "request-received", + CredentialIssued = "credential-issued", + CredentialReceived = "credential-received", + Done = "done", + Abandoned = "abandoned", +} + +export enum Role { + Sender = "sender", + Receiver = "receiver", +} + +export enum States3 { + ProposalSent = "proposal-sent", + ProposalReceived = "proposal-received", + RequestSent = "request-sent", + RequestReceived = "request-received", + PresentationSent = "presentation-sent", + PresentationReceived = "presentation-received", + Declined = "declined", + Abandoned = "abandoned", + Done = "done", +} + +export enum CreateInvitationResponseDtoRole { + Sender = "sender", + Receiver = "receiver", +} + +export enum CreateInvitationResponseDtoState { + Initial = "initial", + AwaitResponse = "await-response", + PrepareResponse = "prepare-response", + Done = "done", +} + +export enum ConnectionRecordDtoState { + Start = "start", + InvitationSent = "invitation-sent", + InvitationReceived = "invitation-received", + RequestSent = "request-sent", + RequestReceived = "request-received", + ResponseSent = "response-sent", + ResponseReceived = "response-received", + Abandoned = "abandoned", + Completed = "completed", +} + +export enum CredentialRecordDtoState { + ProposalSent = "proposal-sent", + ProposalReceived = "proposal-received", + OfferSent = "offer-sent", + OfferReceived = "offer-received", + Declined = "declined", + RequestSent = "request-sent", + RequestReceived = "request-received", + CredentialIssued = "credential-issued", + CredentialReceived = "credential-received", + Done = "done", + Abandoned = "abandoned", +} + +export enum MessageRecordDtoRole { + Sender = "sender", + Receiver = "receiver", +} + +export enum ProofRecordDtoState { + ProposalSent = "proposal-sent", + ProposalReceived = "proposal-received", + RequestSent = "request-sent", + RequestReceived = "request-received", + PresentationSent = "presentation-sent", + PresentationReceived = "presentation-received", + Declined = "declined", + Abandoned = "abandoned", + Done = "done", +} + +export enum DidRecordDtoRole { + Created = "created", + Received = "received", +} + +export class ApiException extends Error { + override message: string; + status: number; + response: string; + headers: { [key: string]: any; }; + result: any; + + constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) { + super(); + + this.message = message; + this.status = status; + this.response = response; + this.headers = headers; + this.result = result; + } + + protected isApiException = true; + + static isApiException(obj: any): obj is ApiException { + return obj.isApiException === true; + } +} + +function throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any { + if (result !== null && result !== undefined) + throw result; + else + throw new ApiException(message, status, response, headers, null); +} \ No newline at end of file diff --git a/libs/clients/src/frontend/tsa_gen.ts b/libs/clients/src/frontend/tsa_gen.ts new file mode 100644 index 00000000..d0bab5d0 --- /dev/null +++ b/libs/clients/src/frontend/tsa_gen.ts @@ -0,0 +1,342 @@ +//---------------------- +// <auto-generated> +// Generated using the NSwag toolchain v13.20.0.0 (NJsonSchema v10.9.0.0 (Newtonsoft.Json v10.0.0.0)) (http://NSwag.org) +// </auto-generated> +//---------------------- + +/* tslint:disable */ +/* eslint-disable */ +// ReSharper disable InconsistentNaming + +export class Client { + private http: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }; + private baseUrl: string; + public jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }) { + this.http = http ? http : window as any; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "http://localhost:8087"; + } + + /** + * Keys login + * @return OK response. + */ + loginKeys(): Promise<KeysResult> { + let url_ = this.baseUrl + "/keys"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processLoginKeys(_response); + }); + } + + protected processLoginKeys(response: Response): Promise<KeysResult> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as KeysResult; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<KeysResult>(null as any); + } + + /** + * Liveness health + * @return OK response. + */ + healthLiveness(): Promise<FileResponse> { + let url_ = this.baseUrl + "/liveness"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processHealthLiveness(_response); + }); + } + + protected processHealthLiveness(response: Response): Promise<FileResponse> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200 || status === 206) { + const contentDisposition = response.headers ? response.headers.get("content-disposition") : undefined; + let fileNameMatch = contentDisposition ? /filename\*=(?:(\\?['"])(.*?)\1|(?:[^\s]+'.*?')?([^;\n]*))/g.exec(contentDisposition) : undefined; + let fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[3] || fileNameMatch[2] : undefined; + if (fileName) { + fileName = decodeURIComponent(fileName); + } else { + fileNameMatch = contentDisposition ? /filename="?([^"]*?)"?(;|$)/g.exec(contentDisposition) : undefined; + fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined; + } + return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<FileResponse>(null as any); + } + + /** + * Readiness health + * @return OK response. + */ + healthReadiness(): Promise<FileResponse> { + let url_ = this.baseUrl + "/readiness"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processHealthReadiness(_response); + }); + } + + protected processHealthReadiness(response: Response): Promise<FileResponse> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200 || status === 206) { + const contentDisposition = response.headers ? response.headers.get("content-disposition") : undefined; + let fileNameMatch = contentDisposition ? /filename\*=(?:(\\?['"])(.*?)\1|(?:[^\s]+'.*?')?([^;\n]*))/g.exec(contentDisposition) : undefined; + let fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[3] || fileNameMatch[2] : undefined; + if (fileName) { + fileName = decodeURIComponent(fileName); + } else { + fileNameMatch = contentDisposition ? /filename="?([^"]*?)"?(;|$)/g.exec(contentDisposition) : undefined; + fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined; + } + return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<FileResponse>(null as any); + } + + /** + * Login login + * @return OK response. + */ + loginLogin(body: LoginRequestBody): Promise<LoginResult> { + let url_ = this.baseUrl + "/v1/login"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processLoginLogin(_response); + }); + } + + protected processLoginLogin(response: Response): Promise<LoginResult> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as LoginResult; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<LoginResult>(null as any); + } + + /** + * LoginWithVC login + * @return OK response. + */ + loginLoginWithVC(body: LoginWithVCRequestBody): Promise<LoginVCResult> { + let url_ = this.baseUrl + "/v1/login-vc"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_: RequestInit = { + body: content_, + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processLoginLoginWithVC(_response); + }); + } + + protected processLoginLoginWithVC(response: Response): Promise<LoginVCResult> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as LoginVCResult; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<LoginVCResult>(null as any); + } + + /** + * LoginInvitation login + * @return OK response. + */ + loginLoginInvitation(): Promise<LoginInvitationResult> { + let url_ = this.baseUrl + "/v1/login-vc-invitation"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processLoginLoginInvitation(_response); + }); + } + + protected processLoginLoginInvitation(response: Response): Promise<LoginInvitationResult> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as LoginInvitationResult; + return result200; + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<LoginInvitationResult>(null as any); + } +} + +export interface KeysResult { + /** List of public keys. */ + keys: string[]; + + [key: string]: any; +} + +export interface LoginInvitationResult { + /** Identifier of the proof invitation request. */ + proofRecordId: string; + /** Link containing the invitation proof request which the VCM can scan to login. */ + proofUrl: string; + /** Shortened URL link which the VCM can scan to login. */ + proofUrlShort: string; + + [key: string]: any; +} + +export interface LoginRequestBody { + email: string; + + [key: string]: any; +} + +export interface LoginResult { + /** Status message response. */ + message: string; + + [key: string]: any; +} + +export interface LoginVCResult { + /** Token in JWT format after successful login. */ + token: string; + + [key: string]: any; +} + +export interface LoginWithVCRequestBody { + proofRecordId: string; + + [key: string]: any; +} + +export interface FileResponse { + data: Blob; + status: number; + fileName?: string; + headers?: { [name: string]: any }; +} + +export class ApiException extends Error { + override message: string; + status: number; + response: string; + headers: { [key: string]: any; }; + result: any; + + constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) { + super(); + + this.message = message; + this.status = status; + this.response = response; + this.headers = headers; + this.result = result; + } + + protected isApiException = true; + + static isApiException(obj: any): obj is ApiException { + return obj.isApiException === true; + } +} + +function throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any { + if (result !== null && result !== undefined) + throw result; + else + throw new ApiException(message, status, response, headers, null); +} \ No newline at end of file diff --git a/libs/clients/src/index.ts b/libs/clients/src/index.ts deleted file mode 100644 index 7413a831..00000000 --- a/libs/clients/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./lib/gateway.client"; -export * from "./lib/connection.manager.client"; -export * from "./lib/attestation.manager.client"; -export * from "./lib/proof.manager.client"; diff --git a/libs/clients/src/ocmengine-client.ts b/libs/clients/src/ocmengine-client.ts new file mode 100644 index 00000000..d3ae8f16 --- /dev/null +++ b/libs/clients/src/ocmengine-client.ts @@ -0,0 +1,167 @@ +import { + AcceptCredentialDto, + AcceptProofDto, + ConnectionRecordDto, + CreateCredentialDefinitionRequestDto, + CreateInvitationRequestDto, + CreateInvitationResponseDto, + CreateSchemaRequestDto, + CreddefRecordDto, + CredentialFormatDataDto, + CredentialOfferResponseDto, + CredentialRecordDto, + IdReqDto, + MakeBasicMessageRequestDto, + MessageRecordDto, + OfferCredentialRequestDto, + ProofFormatDataDto, + ProofRecordDto, + RequestProofDto, + RequestProofResponseDto, + RestControllerClient, + Role, + Roles, + SchemaRecordDto, + States, + States2, + States3, + AcceptInvitationRequestDto +} from "./frontend/agent_gen"; + +export * from "./frontend/agent_gen"; + +export interface Config { + wsUrl: string; + httpUrl: string; + getToken: () => Promise<string>; +} + +let config: Config | null = null; + +export const setConfig = (cfg: Config) => (config = cfg); + +class ApiClient { + private _ws!: WebSocket; + private _rest!: RestControllerClient; + + public fetchInvitations = (states: States[] | undefined, roles: Roles[] | undefined) => this._rest.fetchInvitations(states, roles); + public createInvitation = (body: CreateInvitationRequestDto) => this._rest.createInvitation(body); + public getInvitationById = (id: string) => this._rest.getInvitationById(id); + public deleteInvitationById = (id: string) => this._rest.deleteInvitationById(id); + public acceptInvitation = (body: AcceptInvitationRequestDto) => this._rest.acceptInvitation(body); + public fetchConnections = () => this._rest.fetchConnections(); + public getConnectionById = (id: string) => this._rest.getConnectionById(id); + public deleteConnectionById = (id: string) => this._rest.deleteConnectionById(id); + public getConnectionByOobId = (id: string) => this._rest.getConnectionByOobId(id); + public createSchema = (body: CreateSchemaRequestDto) => this._rest.createSchema(body); + public fetchSchemas = () => this._rest.fetchSchemas(); + public getSchemaById = (body: IdReqDto) => this._rest.getSchemaById(body); + public fetchCredentialDefinitions = () => this._rest.fetchCredentialDefinitions(); + public createCredentialDefinition = (body: CreateCredentialDefinitionRequestDto) => this._rest.createCredentialDefinition(body); + public getCredentialDefinitionById = (body: IdReqDto) => this._rest.getCredentialDefinitionById(body); + public offerCredential = (body: OfferCredentialRequestDto) => this._rest.offerCredential(body); + public fetchCredentials = (states: States2[] | undefined, connectionId: string | undefined) => this._rest.fetchCredentials(states, connectionId); + public getCredentialById = (id: string) => this._rest.getCredentialById(id); + public deleteCredentialById = (id: string) => this._rest.deleteCredentialById(id); + public getCredentialFormatDataById = (id: string) => this._rest.getCredentialFormatDataById(id); + public acceptCredential = (body: AcceptCredentialDto) => this._rest.acceptCredential(body); + public declineCredential = (credential_record_id: string) => this._rest.declineCredential(credential_record_id); + public sendMessage = (body: MakeBasicMessageRequestDto) => this._rest.sendMessage(body); + public fetchBasicMessages = (role: Role | undefined, connectionId: string | undefined) => this._rest.fetchBasicMessages(role, connectionId); + public deleteBasicMessage = (id: string) => this._rest.deleteBasicMessage(id); + public fetchProofs = (states: States3[] | undefined, connectionId: string | undefined) => this._rest.fetchProofs(states, connectionId); + public getProofById = (proof_record_id: string) => this._rest.getProofById(proof_record_id); + public deleteProofById = (proof_record_id: string) => this._rest.deleteProofById(proof_record_id); + public getProofFormatDataById = (proof_record_id: string) => this._rest.getProofFormatDataById(proof_record_id); + public proofAcceptanceWait = (proof_record_id: string) => this._rest.proofAcceptanceWait(proof_record_id); + public requestProof = (body: RequestProofDto) => this._rest.requestProof(body); + public acceptProof = (body: AcceptProofDto) => this._rest.acceptProof(body); + public declineProofRequest = (proof_record_id: string) => this._rest.declineProofRequest(proof_record_id); + public resolveDid = (body: IdReqDto) => this._rest.resolveDid(body); + public getCreatedDids = () => this._rest.getCreatedDids(); + + public initialize() { + const _config = config as Config; + + this._rest = new RestControllerClient(_config.httpUrl, { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + fetch: this._fetch.bind(this), + }); + this._rest.jsonParseReviver = this.jsonParseReviver; + + // this._listen(); + } + + public async getToken(): Promise<string> { + if (!config) { + throw new Error("ApiClient: Please call setConfig before calling api"); + } + + return config.getToken(); + } + + private async _fetch(url: RequestInfo, init?: RequestInit): Promise<unknown> { + if (!config) { + throw new Error("ApiClient: Please call setConfig before calling api"); + } + + init = Object.assign({}, init, { + headers: { + ...(init?.headers || {}), + Authorization: `Bearer ${await config.getToken()}`, + }, + }); + + return fetch(url, init); + } + + public jsonParseReviver = (key: string, value: unknown): unknown => { + if (typeof value === "string") { + const a = + /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z?$/.exec( + value, + ); + if (a) { + return new Date(value); + } + } + return value; + }; + + private async _listen() { + console.log("Opening connection to " + config!.wsUrl); + const ws = new WebSocket(config!.wsUrl); + this._ws = ws; + // Connection opened + ws.addEventListener("open", (event) => { + console.log("Connected to the WebSocket"); + }); + + // Listen for messages + ws.addEventListener("message", (event) => { + console.log("Message from server: ", event.data); + const data = JSON.parse(event.data, this.jsonParseReviver); + + console.warn("Message not processed. No handler"); + }); + + // Connection closed + ws.addEventListener("close", (event) => { + if (event.wasClean) { + console.log( + `Closed cleanly, code=${event.code}, reason=${event.reason}`, + ); + } else { + console.log("Connection died"); + } + }); + + // Connection errors + ws.addEventListener("error", (error) => { + console.error(`WebSocket Error: ${error}`); + }); + } +} + +export default new ApiClient(); diff --git a/libs/clients/src/tsa-client.ts b/libs/clients/src/tsa-client.ts new file mode 100644 index 00000000..783904c1 --- /dev/null +++ b/libs/clients/src/tsa-client.ts @@ -0,0 +1,73 @@ +import { + Client as TSAClient, + FileResponse, + KeysResult, + LoginInvitationResult, + LoginRequestBody, + LoginResult, + LoginVCResult, + LoginWithVCRequestBody, +} from "./frontend/tsa_gen"; + +export * from "./frontend/tsa_gen"; + +export interface Config { + tsaUrl: string; +} + +let config: Config | null = null; + +export const setConfig = (cfg: Config) => (config = cfg); + +class ApiClient { + private _rest!: TSAClient; + + /* rest api methods */ + + public loginKeys = (): Promise<KeysResult> => this._rest.loginKeys(); + public healthLiveness = (): Promise<FileResponse> => + this._rest.healthLiveness(); + public healthReadiness = (): Promise<FileResponse> => + this._rest.healthReadiness(); + public loginLogin = (body: LoginRequestBody): Promise<LoginResult> => + this._rest.loginLogin(body); + public loginLoginWithVC = ( + body: LoginWithVCRequestBody, + ): Promise<LoginVCResult> => this._rest.loginLoginWithVC(body); + public loginLoginInvitation = (): Promise<LoginInvitationResult> => + this._rest.loginLoginInvitation(); + + public initialize() { + const _config = config as Config; + + this._rest = new TSAClient(_config.tsaUrl, { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + fetch: this._fetch.bind(this), + }); + this._rest.jsonParseReviver = this.jsonParseReviver; + } + + private async _fetch(url: RequestInfo, init?: RequestInit): Promise<unknown> { + if (!config) { + throw new Error("ApiClient: Please call setConfig before calling api"); + } + + return fetch(url, init); + } + + public jsonParseReviver = (key: string, value: unknown): unknown => { + if (typeof value === "string") { + const a = + /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z?$/.exec( + value, + ); + if (a) { + return new Date(value); + } + } + return value; + }; +} + +export default new ApiClient(); diff --git a/libs/ts-client-generator/.gitignore b/libs/ts-client-generator/.gitignore new file mode 100644 index 00000000..d45db4db --- /dev/null +++ b/libs/ts-client-generator/.gitignore @@ -0,0 +1,2 @@ +[Bb]in/ +[Oo]bj/ \ No newline at end of file diff --git a/libs/ts-client-generator/Dockerfile b/libs/ts-client-generator/Dockerfile new file mode 100644 index 00000000..08074dbb --- /dev/null +++ b/libs/ts-client-generator/Dockerfile @@ -0,0 +1,17 @@ +# Use the official image as a parent image +FROM mcr.microsoft.com/dotnet/sdk:7.0 + +# Set the working directory +WORKDIR /app + +# Copy the C# project and other necessary files into the container +COPY ./libs/ts-client-generator /app + +COPY ./agent-swagger.json /app/agent-swagger.json + +RUN dotnet restore + +RUN mkdir /app/generated + +# Set the entry point +ENTRYPOINT ["dotnet", "run", "--project", "/app", "/app/agent-swagger.json", "/app/generated/agent_gen.ts"] diff --git a/libs/ts-client-generator/Program.cs b/libs/ts-client-generator/Program.cs new file mode 100644 index 00000000..ed8956bf --- /dev/null +++ b/libs/ts-client-generator/Program.cs @@ -0,0 +1,42 @@ +using NJsonSchema.CodeGeneration.TypeScript; +using NSwag; +using NSwag.CodeGeneration.TypeScript; + +if (args.Length != 2) + throw new ArgumentException("Expecting 2 arguments: path, generatePath"); + +var path = args[0]; +var generatePath = Path.Combine(Directory.GetCurrentDirectory(), args[1]); + + +async static Task GenerateTypeScriptClient(string path, string generatePath) => + await GenerateClient( + document: await OpenApiDocument.FromFileAsync(path), + generatePath: generatePath, + generateCode: (OpenApiDocument document) => + { + var settings = new TypeScriptClientGeneratorSettings(); + + settings.TypeScriptGeneratorSettings.NullValue = TypeScriptNullValue.Null; + settings.TypeScriptGeneratorSettings.TypeStyle = TypeScriptTypeStyle.Interface; + settings.TypeScriptGeneratorSettings.TypeScriptVersion = 5.1M; + settings.TypeScriptGeneratorSettings.DateTimeType = TypeScriptDateTimeType.Date; + + var generator = new TypeScriptClientGenerator(document, settings); + var code = generator.GenerateFile(); + + code = code.Replace("protected jsonParseReviver", "public jsonParseReviver"); + return code; + } + ); + +await GenerateTypeScriptClient(path, generatePath); + +async static Task GenerateClient(OpenApiDocument document, string generatePath, Func<OpenApiDocument, string> generateCode) +{ + Console.WriteLine($"Generating {generatePath}..."); + + var code = generateCode(document); + + await System.IO.File.WriteAllTextAsync(generatePath, code); +} diff --git a/libs/ts-client-generator/TsClientGenerator.csproj b/libs/ts-client-generator/TsClientGenerator.csproj new file mode 100644 index 00000000..52068a88 --- /dev/null +++ b/libs/ts-client-generator/TsClientGenerator.csproj @@ -0,0 +1,14 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net7.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="NSwag.CodeGeneration.TypeScript" Version="13.20.0" /> + <PackageReference Include="NSwag.Core" Version="13.20.0" /> + </ItemGroup> +</Project> diff --git a/nx.json b/nx.json index 35a020d3..9450bdea 100644 --- a/nx.json +++ b/nx.json @@ -38,5 +38,23 @@ "!{projectRoot}/.eslintrc.json" ], "sharedGlobals": [] + }, + "generators": { + "@nx/react": { + "application": { + "style": "scss", + "linter": "eslint", + "bundler": "webpack", + "babel": true + }, + "component": { + "style": "scss" + }, + "library": { + "style": "scss", + "linter": "eslint", + "unitTestRunner": "none" + } + } } } diff --git a/package.json b/package.json index 9979d29e..377e36f2 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "license": "Apache-2.0", "scripts": { - "build:all": "yarn build:agent && yarn build:cm && yarn build:am && yarn build:pm && yarn build:gw", + "build:all": "yarn build:agent && yarn build:cm && yarn build:am && yarn build:pm && yarn build:gw && yarn build:dashboard", "build:agent": "nx run agent:build:development --parallel=3", "build:agent:production": "nx run agent:build:production", "build:cm": "nx run connection-manager:build:development --parallel=3", @@ -14,12 +14,15 @@ "build:pm:production": "nx run proof-manager:build:production", "build:gw": "nx run gateway:build:development --parallel=3", "build:gw:production": "nx run gateway:build:production", - "serve:all": "concurrently \"yarn serve:agent\" \"yarn serve:cm\" \"yarn serve:am\" \"yarn serve:pm\" \"yarn serve:gw\"", + "build:dashboard": "nx run dashboard:build:development --parallel=3", + "build:dashboard:production": "nx run dashboard:build:production", + "serve:all": "concurrently \"yarn serve:agent\" \"yarn serve:cm\" \"yarn serve:am\" \"yarn serve:pm\" \"yarn serve:gw\" \"yarn serve:dashboard\"", "serve:agent": "nx run agent:serve:development", "serve:cm": "nx run connection-manager:serve:development", "serve:am": "nx run attestation-manager:serve:development", "serve:pm": "nx run proof-manager:serve:development", "serve:gw": "nx run gateway:serve:development", + "serve:dashboard": "nx run dashboard:serve:development", "infra": "cd compose && docker-compose --profile issuer --profile holder up -d --build", "infra:down": "cd compose && docker-compose --profile issuer --profile holder down", "infra:status": "cd compose && docker-compose ps -a", @@ -29,10 +32,12 @@ "infra:holder:stop": "cd compose && docker-compose --profile holder stop", "infra:local": "cd compose && docker-compose -f docker-compose.infra.yml up -d", "infra:local:stop": "cd compose && docker-compose -f docker-compose.infra.yml stop", - "infra:simple": "cd compose && docker-compose -f docker-compose.simple.yml up -d" + "infra:simple": "cd compose && docker-compose -f docker-compose.simple.yml up -d", + "generate-ocmengine-client": "./client-generator.sh ocmengine" }, "private": true, "dependencies": { + "@fontsource/roboto": "^5.0.8", "@hyperledger/anoncreds-nodejs": "^0.1.0", "@hyperledger/aries-askar-nodejs": "^0.1.0", "@hyperledger/aries-askar-shared": "^0.1.0", @@ -45,16 +50,27 @@ "@nestjs/platform-express": "^9.0.0", "@nestjs/platform-ws": "^10.1.3", "@nestjs/websockets": "^9.4.2", + "@swc/helpers": "~0.5.2", + "antd": "^5.10.1", "async-retry": "^1.3.3", "axios": "^1.0.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "classnames": "^2.3.2", "cloudevents": "^7.0.0", + "date-fns": "^2.30.0", "joi": "^17.9.2", + "mobx": "^6.10.2", + "mobx-react": "^9.0.1", "nats": "^2.14.0", + "normalize.css": "^8.0.1", "passport": "^0.6.0", "passport-http": "^0.3.0", "passport-local": "^1.0.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-router-dom": "6.11.2", + "react-toastify": "^9.1.3", "reflect-metadata": "^0.1.13", "rxjs": "^7.0.0", "tslib": "^2.3.0", @@ -67,44 +83,64 @@ "@aries-framework/core": "^0.4.0", "@aries-framework/indy-vdr": "^0.4.0", "@aries-framework/node": "^0.4.0", + "@babel/core": "^7.14.5", + "@babel/preset-react": "^7.14.5", "@commitlint/config-conventional": "^17.6.1", "@nestjs/schematics": "^9.0.0", "@nestjs/swagger": "^6.3.0", "@nestjs/testing": "^9.0.0", - "@nx/eslint-plugin": "16.0.1", - "@nx/jest": "16.0.1", - "@nx/js": "16.0.1", - "@nx/linter": "16.0.1", - "@nx/nest": "16.0.1", - "@nx/node": "16.0.1", - "@nx/webpack": "16.0.1", - "@nx/workspace": "16.0.1", + "@nx/eslint-plugin": "16.10.0", + "@nx/jest": "16.10.0", + "@nx/js": "16.10.0", + "@nx/linter": "16.10.0", + "@nx/nest": "16.10.0", + "@nx/node": "16.10.0", + "@nx/react": "^16.10.0", + "@nx/webpack": "16.10.0", + "@nx/workspace": "16.10.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/git": "^10.0.1", "@semantic-release/gitlab": "^12.0.1", "@semantic-release/release-notes-generator": "^11.0.1", + "@svgr/webpack": "^8.0.1", + "@swc-node/register": "^1.6.8", + "@swc/cli": "~0.1.62", + "@swc/core": "^1.3.99", + "@testing-library/react": "14.0.0", "@types/async-retry": "^1.4.5", "@types/jest": "^29.4.0", - "@types/node": "~18.7.1", + "@types/node": "18.14.2", "@types/passport-http": "^0.3.9", "@types/passport-local": "^1.0.35", + "@types/react": "18.2.24", + "@types/react-dom": "18.2.9", + "@types/uuid": "^9.0.6", "@typescript-eslint/eslint-plugin": "^5.58.0", "@typescript-eslint/parser": "^5.58.0", + "babel-jest": "^29.4.1", "concurrently": "^8.2.0", "conventional-changelog-conventionalcommits": "^5.0.0", "eslint": "~8.15.0", "eslint-config-prettier": "8.1.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-jsx-a11y": "6.7.1", "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "7.32.2", + "eslint-plugin-react-hooks": "4.6.0", "jest": "^29.4.1", + "jest-environment-jsdom": "^29.4.1", "jest-environment-node": "^29.4.1", - "nx": "16.0.1", + "nx": "16.10.0", "prettier": "^2.6.2", + "react-refresh": "^0.10.0", "semantic-release": "^21.0.2", "standard-changelog": "^2.0.27", "ts-jest": "^29.1.0", "ts-node": "10.9.1", - "typescript": "~4.9.5" + "typescript": "~4.9.5", + "url-loader": "^4.1.1" }, "resolutions": { "ref-napi": "npm:@2060.io/ref-napi" diff --git a/tsconfig.base.json b/tsconfig.base.json index 17ada647..d59b4c94 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -19,8 +19,11 @@ "strictPropertyInitialization": false, "baseUrl": ".", "paths": { + "@dashboard/*": ["apps/dashboard/src/*"], + "@dashboard/engine-api": ["libs/clients/src/ocmengine-client.ts"], + "@dashboard/tsa-api": ["libs/clients/src/tsa-client.ts"], "@ocm-engine/askar": ["libs/askar/src/index.ts"], - "@ocm-engine/clients": ["libs/clients/src/index.ts"], + "@ocm-engine/clients": ["libs/clients/src/backend.ts"], "@ocm-engine/config": ["libs/config/src/index.ts"], "@ocm-engine/dtos": ["libs/dtos/src/index.ts"], "@ocm-engine/ledgers": ["libs/ledgers/src/index.ts"], diff --git a/yarn.lock b/yarn.lock index ef7e807f..c7ef67c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,11 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@adobe/css-tools@^4.0.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" + integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -37,6 +42,53 @@ ora "5.4.1" rxjs "7.8.1" +"@ant-design/colors@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-7.0.0.tgz#eb7eecead124c3533aea05d61254f0a17f2b61b3" + integrity sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg== + dependencies: + "@ctrl/tinycolor" "^3.4.0" + +"@ant-design/cssinjs@^1.17.5": + version "1.17.5" + resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.17.5.tgz#be5bbfbf4c857e7df6e3650c9bccf7e527da7ef2" + integrity sha512-Ed2rruHMxZTVYGPec6QBZkrh00Df5K1FAufmBpONai5iGYxoxIkg1sRD8YdCw0NvPRAa4r1nJP5LbwICGHzGiQ== + dependencies: + "@babel/runtime" "^7.11.1" + "@emotion/hash" "^0.8.0" + "@emotion/unitless" "^0.7.5" + classnames "^2.3.1" + csstype "^3.0.10" + rc-util "^5.35.0" + stylis "^4.0.13" + +"@ant-design/icons-svg@^4.3.0": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz#4b2f65a17d4d32b526baa6414aca2117382bf8da" + integrity sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g== + +"@ant-design/icons@^5.2.6": + version "5.2.6" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.2.6.tgz#2d4a9a37f531eb2a20cebec01d6fb69cf593900d" + integrity sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/icons-svg" "^4.3.0" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.31.1" + +"@ant-design/react-slick@~1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.0.2.tgz#241bb412aeacf7ff5d50c61fa5db66773fde6b56" + integrity sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ== + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + resize-observer-polyfill "^1.5.1" + throttle-debounce "^5.0.0" + "@aries-framework/anoncreds-rs@^0.4.0": version "0.4.2" resolved "https://registry.yarnpkg.com/@aries-framework/anoncreds-rs/-/anoncreds-rs-0.4.2.tgz#accce59154083dadc91d6a9c8333af8cb10f2188" @@ -126,46 +178,46 @@ ref-napi "^3.0.3" ws "^8.13.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.4.tgz#03ae5af150be94392cb5c7ccd97db5a19a5da6aa" + integrity sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA== dependencies: - "@babel/highlight" "^7.22.13" + "@babel/highlight" "^7.23.4" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" + integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.15.0": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.5", "@babel/core@^7.21.3", "@babel/core@^7.22.9": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" + integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/generator" "^7.23.3" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" + "@babel/parser" "^7.23.3" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.3" + "@babel/types" "^7.23.3" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.23.3", "@babel/generator@^7.23.4", "@babel/generator@^7.7.2": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.4.tgz#4a41377d8566ec18f807f42962a7f3551de83d1c" + integrity sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.23.4" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -177,14 +229,14 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== @@ -195,7 +247,7 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== @@ -210,7 +262,7 @@ "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== @@ -257,17 +309,17 @@ dependencies: "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": +"@babel/helper-module-imports@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -287,7 +339,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": +"@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== @@ -296,7 +348,7 @@ "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": +"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.9": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== @@ -326,10 +378,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" @@ -351,45 +403,53 @@ "@babel/types" "^7.22.19" "@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.4.tgz#7d2cfb969aa43222032193accd7329851facf3c1" + integrity sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.4" + "@babel/types" "^7.23.4" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3", "@babel/parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.4.tgz#409fbe690c333bb70187e2de4021e1e47a026661" + integrity sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" - integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" - integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-optional-chaining" "^7.23.3" -"@babel/plugin-proposal-class-properties@^7.14.5": +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz#20c60d4639d18f7da8602548512e9d3a4c8d7098" + integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -397,16 +457,16 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-decorators@^7.14.5": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz#0b345a5754f48309fa50b7cd99075ef0295b12c8" - integrity sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg== +"@babel/plugin-proposal-decorators@^7.22.7": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.3.tgz#c609ca70be908d187ee36ff49f1250c56cc98f15" + integrity sha512-u8SwzOcP0DYSsa++nHd/9exlHb0NAlHCb890qtZZbSwPX2bFv8LBEztxwN7Xg/dS8oAFFidhrI9PBcLBJSkGRQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-replace-supers" "^7.22.20" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/plugin-syntax-decorators" "^7.22.10" + "@babel/plugin-syntax-decorators" "^7.23.3" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -441,10 +501,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff" - integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== +"@babel/plugin-syntax-decorators@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz#a1d351d6c25bfdcf2e16f99b039101bc0ffcb0ca" + integrity sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -462,17 +522,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -490,10 +550,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== +"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -553,10 +613,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.3.3", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== +"@babel/plugin-syntax-typescript@^7.23.3", "@babel/plugin-syntax-typescript@^7.3.3", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -568,211 +628,211 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== +"@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" - integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== +"@babel/plugin-transform-async-generator-functions@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz#93ac8e3531f347fba519b4703f9ff2a75c6ae27a" + integrity sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== +"@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== dependencies: - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== +"@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" - integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== +"@babel/plugin-transform-block-scoping@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-static-block@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" - integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== +"@babel/plugin-transform-class-static-block@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" - integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== +"@babel/plugin-transform-classes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz#73380c632c095b03e8503c24fd38f95ad41ffacb" + integrity sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.22.20" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== +"@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" + "@babel/template" "^7.22.15" -"@babel/plugin-transform-destructuring@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" - integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== +"@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== +"@babel/plugin-transform-dotall-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== +"@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dynamic-import@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" - integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== +"@babel/plugin-transform-dynamic-import@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== +"@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-export-namespace-from@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" - integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== +"@babel/plugin-transform-export-namespace-from@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" - integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== +"@babel/plugin-transform-for-of@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz#afe115ff0fbce735e02868d41489093c63e15559" + integrity sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== +"@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-json-strings@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" - integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== +"@babel/plugin-transform-json-strings@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== +"@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-logical-assignment-operators@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" - integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== +"@babel/plugin-transform-logical-assignment-operators@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== +"@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" - integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== +"@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== dependencies: - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== +"@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== dependencies: - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" - integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== +"@babel/plugin-transform-modules-systemjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" + integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== +"@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": @@ -783,116 +843,156 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== +"@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" - integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" - integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== +"@babel/plugin-transform-numeric-separator@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" - integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== +"@babel/plugin-transform-object-rest-spread@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== dependencies: - "@babel/compat-data" "^7.22.9" + "@babel/compat-data" "^7.23.3" "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.23.3" -"@babel/plugin-transform-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== +"@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" -"@babel/plugin-transform-optional-catch-binding@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" - integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== +"@babel/plugin-transform-optional-catch-binding@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" - integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== +"@babel/plugin-transform-optional-chaining@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" - integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== +"@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-property-in-object@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" - integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== +"@babel/plugin-transform-private-property-in-object@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.22.5": +"@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz#5efc001d07ef0f7da0d73c3a86c132f73d28e43c" + integrity sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/plugin-transform-react-pure-annotations@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" + integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" - integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== +"@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== +"@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-runtime@^7.15.0": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990" - integrity sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA== +"@babel/plugin-transform-runtime@^7.22.9": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz#5132b388580002fc5cb7c84eccfb968acdc231cb" + integrity sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw== dependencies: "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" @@ -901,102 +1001,103 @@ babel-plugin-polyfill-regenerator "^0.5.3" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== +"@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== +"@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== +"@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== +"@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== +"@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" - integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== +"@babel/plugin-transform-typescript@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.4.tgz#da12914d17b3c4b307f32c5fd91fbfdf17d56f86" + integrity sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.23.3" -"@babel/plugin-transform-unicode-escapes@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" - integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== +"@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== +"@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.15.0": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" - integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== +"@babel/preset-env@^7.20.2", "@babel/preset-env@^7.22.9": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.3.tgz#d299e0140a7650684b95c62be2db0ef8c975143e" + integrity sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q== dependencies: - "@babel/compat-data" "^7.23.2" + "@babel/compat-data" "^7.23.3" "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1008,56 +1109,55 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.23.2" - "@babel/plugin-transform-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.23.0" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.11" - "@babel/plugin-transform-classes" "^7.22.15" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.23.0" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.11" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-for-of" "^7.22.15" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.11" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.23.0" - "@babel/plugin-transform-modules-commonjs" "^7.23.0" - "@babel/plugin-transform-modules-systemjs" "^7.23.0" - "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.3" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.3" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.3" + "@babel/plugin-transform-classes" "^7.23.3" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.3" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.3" + "@babel/plugin-transform-for-of" "^7.23.3" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.3" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.3" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" - "@babel/plugin-transform-numeric-separator" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.22.15" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.23.0" - "@babel/plugin-transform-parameters" "^7.22.15" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.10" - "@babel/plugin-transform-reserved-words" "^7.22.5" - "@babel/plugin-transform-shorthand-properties" "^7.22.5" - "@babel/plugin-transform-spread" "^7.22.5" - "@babel/plugin-transform-sticky-regex" "^7.22.5" - "@babel/plugin-transform-template-literals" "^7.22.5" - "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.10" - "@babel/plugin-transform-unicode-property-regex" "^7.22.5" - "@babel/plugin-transform-unicode-regex" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.3" + "@babel/plugin-transform-numeric-separator" "^7.23.3" + "@babel/plugin-transform-object-rest-spread" "^7.23.3" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.3" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.3" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.23.0" babel-plugin-polyfill-corejs2 "^0.4.6" babel-plugin-polyfill-corejs3 "^0.8.5" babel-plugin-polyfill-regenerator "^0.5.3" @@ -1073,30 +1173,42 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-typescript@^7.15.0": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" - integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== +"@babel/preset-react@^7.14.5", "@babel/preset-react@^7.18.6": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" + integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.23.3" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.23.3" + +"@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" + integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.23.0" - "@babel/plugin-transform-typescript" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-typescript" "^7.23.3" "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.14.8", "@babel/runtime@^7.21.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" - integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== +"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.4.tgz#36fa1d2b36db873d25ec631dcc4923fdc1cf2e2e" + integrity sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": +"@babel/template@^7.22.15", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== @@ -1105,28 +1217,28 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.16.0", "@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.16.0", "@babel/traverse@^7.23.3", "@babel/traverse@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.4.tgz#c2790f7edf106d059a0098770fe70801417f3f85" + integrity sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/code-frame" "^7.23.4" + "@babel/generator" "^7.23.4" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/parser" "^7.23.4" + "@babel/types" "^7.23.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.23.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.4.tgz#7206a1810fc512a7f7f7d4dace4cb4c1c9dbfb8e" + integrity sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ== dependencies: - "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" @@ -1154,6 +1266,11 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@ctrl/tinycolor@^3.4.0", "@ctrl/tinycolor@^3.6.0", "@ctrl/tinycolor@^3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" + integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== + "@digitalbazaar/security-context@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@digitalbazaar/security-context/-/security-context-1.0.1.tgz#badc4b8da03411a32d4e7321ce7c4b355776b410" @@ -1215,6 +1332,16 @@ "@digitalcredentials/jsonld-signatures" "^9.3.1" credentials-context "^2.0.0" +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@emotion/unitless@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1223,9 +1350,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" - integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^1.2.3": version "1.4.1" @@ -1242,6 +1369,16 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@fontsource/roboto@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-5.0.8.tgz#613b477a56f21b5705db1a67e995c033ef317f76" + integrity sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA== + +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1627,6 +1764,20 @@ semver "^7.3.5" tar "^6.1.11" +"@mole-inc/bin-wrapper@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz#d7fd0ceb1cfa8a855293a3ed9d7d135f4d442f0e" + integrity sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA== + dependencies: + bin-check "^4.1.0" + bin-version-check "^5.0.0" + content-disposition "^0.5.4" + ext-name "^5.0.0" + file-type "^17.1.6" + filenamify "^5.0.2" + got "^11.8.5" + os-filter-obj "^2.0.0" + "@multiformats/base-x@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" @@ -1693,14 +1844,14 @@ tslib "2.5.3" "@nestjs/platform-ws@^10.1.3": - version "10.2.7" - resolved "https://registry.yarnpkg.com/@nestjs/platform-ws/-/platform-ws-10.2.7.tgz#287fab0ec5c070c22b3cdbe3633012616b3c63ac" - integrity sha512-4H4AeCQgM29Dju+zQb70Jt0JgWhQssOB8mh9n9icsSJ4B/joa+X7OiBBSjn72HZelj0tvX1gal6PaAhEaOdmGQ== + version "10.2.10" + resolved "https://registry.yarnpkg.com/@nestjs/platform-ws/-/platform-ws-10.2.10.tgz#d6a4df6bebcf85e27fd437cf764d29921a924889" + integrity sha512-x9L7jixAEtbNjP9hIm9Fmx+kL9ruFQLu2cUb0EdSNtwK/efAJZ3+Taz9T8g/Nm5DG4k0356X6hmRk74ChJHg9g== dependencies: tslib "2.6.2" ws "8.14.2" -"@nestjs/schematics@^9.0.0": +"@nestjs/schematics@^9.0.0", "@nestjs/schematics@^9.1.0": version "9.2.0" resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-9.2.0.tgz#f840054b5ae4b0b4e70aa9f72c09c3cf388f2512" integrity sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw== @@ -1818,6 +1969,14 @@ dependencies: ansi-styles "^4.3.0" +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + "@npmcli/fs@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" @@ -1867,6 +2026,14 @@ pacote "^15.0.0" semver "^7.3.5" +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@npmcli/name-from-folder@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" @@ -1915,75 +2082,90 @@ read-package-json-fast "^3.0.0" which "^3.0.0" -"@nrwl/devkit@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.0.1.tgz#9d41e6b5724b5fc72ba23c4036775e8aa06eedcc" - integrity sha512-UtyzIdYpi6pJfqbxUAb37MUisa5k9bcmd9Saqf1E34PmfFF3Ix6CTm19C29BgDfd8XHW3LRRtsdJhRirqmLmcw== +"@nrwl/devkit@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.10.0.tgz#ac8c5b4db00f12c4b817c937be2f7c4eb8f2593c" + integrity sha512-fRloARtsDQoQgQ7HKEy0RJiusg/HSygnmg4gX/0n/Z+SUS+4KoZzvHjXc6T5ZdEiSjvLypJ+HBM8dQzIcVACPQ== dependencies: - "@nx/devkit" "16.0.1" + "@nx/devkit" "16.10.0" -"@nrwl/eslint-plugin-nx@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-16.0.1.tgz#ca4bef3d4e89a121fb388a114959eb4dbf29c6ff" - integrity sha512-XbS4FlTOvtg5ElJu1zseQr+p1RyJjOaYvVXa+CgTISha/x0kFuOwGMX29zcGq4shJ2AyizMaeWrq6odJqSdWVg== +"@nrwl/eslint-plugin-nx@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-16.10.0.tgz#8a98e5a8408fecf0185649bb15c1568a1b233aeb" + integrity sha512-w8fHXEatdPHQeP/Yompsdrgz4BJ2BSVaaaulcovzTNJ9KrCCtDyTGY7sihU7qLVcbZtUVq9xoAsSeuTQuOCTDw== dependencies: - "@nx/eslint-plugin" "16.0.1" + "@nx/eslint-plugin" "16.10.0" -"@nrwl/jest@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-16.0.1.tgz#230a2b267c7af6b4b0b3ae19967457ab710f5fae" - integrity sha512-RCTEziX6PKsAAd95FevcWoRfb1cR6i5494nuRY9Krc9AAFYTz6YGaaGgRgKvHaTIfNY3Nl2Hgojhq5v5FzXaUA== +"@nrwl/jest@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-16.10.0.tgz#5c7cd692e7aacba43687271bb3528568c14c1239" + integrity sha512-hZuIK3xXh4HaE6/Ny8hGidjkJ4aLZjnQtPDxKD/423gznQe2FdHx3avoSlbOEOx5Oc6sJ9QGGZLcvckKQ5uWww== dependencies: - "@nx/jest" "16.0.1" + "@nx/jest" "16.10.0" -"@nrwl/js@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-16.0.1.tgz#c556ffa4711d7b4d0f0562210e2d662812379689" - integrity sha512-CCpOFstP3A+LYHA1HxxsVInToxZHRV3r5fSPBTli6N0ry+f8gID2RQS3hK/kl6U948kNDl4gGWVsocLPFYefow== +"@nrwl/js@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-16.10.0.tgz#2938144cfb5de1dc6b6b231e12cdd86858d31c62" + integrity sha512-asybPpyPrxLLDWWdYzFqbgubLmDKLEhoMz8x9MPOm3CH8v2vlIE6hD0JT19GdJArBPxRB33nhjtu8wmJGz5czw== dependencies: - "@nx/js" "16.0.1" + "@nx/js" "16.10.0" -"@nrwl/linter@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-16.0.1.tgz#e540325eb7346f8e8112c4712e72644bd37fc2b0" - integrity sha512-1z3czeyBJlm3JMPLD8l8W6wAPli6/xr8AnzowFH8UhuB6sXmozztM49RlFP4BbU1AqwYW9kxxgFKQB0Pu84Pew== +"@nrwl/linter@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-16.10.0.tgz#9f42df54431bb4194ede32e6b8254d2bec29a358" + integrity sha512-XvMuTeIc2I3630iaqhlV4w3qgABQIo+kv8mT0DbT1HfjjZDm4ST8hrvkdWSf9mCl24vShNL8GDVQVNOX0bZY5A== dependencies: - "@nx/linter" "16.0.1" + "@nx/linter" "16.10.0" -"@nrwl/nest@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-16.0.1.tgz#0007bf5e00f91595576c205c59c8ed0ef8228d8d" - integrity sha512-xKPkSWygEuQvwP70vlKDmpUUzGyr+nAIWguKfz96cKPGcrvY6ANkvgjn6lVTpQ6Z85D2+Uii8oyGww83osKjog== +"@nrwl/nest@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-16.10.0.tgz#638895e6b6ea8178f8994974d7fc27875ff15a96" + integrity sha512-ImIXV8bPhKq34xdfdz1kHnRZQ7QnbKqLB2pU9kfHDhbOfQUvy1L1UXAasBzS5qSsJtPljaXAe+nOxNu1nOlaZg== dependencies: - "@nx/nest" "16.0.1" + "@nx/nest" "16.10.0" -"@nrwl/node@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-16.0.1.tgz#6b779583cae951f7c4983e20a44bac6cba035aec" - integrity sha512-vg1EDdmCdbgyAPah9mcmS06uy2E1w9PGflmCh3R3S4MjhX2cnRGiGynIgTD/KCs98nrciRwdMcPmSu9FZb80xA== +"@nrwl/node@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-16.10.0.tgz#730e4a9d0fd41f48ea999ccd2a4c2fc9b721096b" + integrity sha512-UZ1s02f2IpFRXzVZIBuDLXXB+obyP280RFHV9smYruhOHrj8iA5wXNSXcJJGorwpKP3WCUS/+KS49oVSHOkLUA== dependencies: - "@nx/node" "16.0.1" + "@nx/node" "16.10.0" -"@nrwl/tao@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.0.1.tgz#9a00aa9b5312181f7a2630ee68ed3f5c53d7ba2d" - integrity sha512-mvY+hKJwismbZY9WIfyO8wAOm1xtHn7ibUgiP/mazJv5OM3lnDoSfE83YlCVuhW+KgNq9OHQwIiAU+Y+hFQvEQ== +"@nrwl/react@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/react/-/react-16.10.0.tgz#cac88dd29474681b8f3d062484abeac8dec7712e" + integrity sha512-00JmHuA97K7t2Z22fGvNqMZuhmRO/IpceLPdUhQOeAY/lb+e3ffVf+CDOBnTC/ISjrIoIyYcfmbAl4ZxxvvN7w== dependencies: - nx "16.0.1" + "@nx/react" "16.10.0" -"@nrwl/webpack@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-16.0.1.tgz#75b8b6c8953ea10305b50e32c4eb4ee06a5bc94e" - integrity sha512-f/GkkaosPdwTjFt3wCI3fE16SODWr3fR2/czHGwZDy0comSR7iqgmGfIqrhb8wOlv1pUbcJcW2xBq9xD6EABeA== +"@nrwl/tao@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.10.0.tgz#94642a0380709b8e387e1e33705a5a9624933375" + integrity sha512-QNAanpINbr+Pod6e1xNgFbzK1x5wmZl+jMocgiEFXZ67KHvmbD6MAQQr0MMz+GPhIu7EE4QCTLTyCEMlAG+K5Q== dependencies: - "@nx/webpack" "16.0.1" + nx "16.10.0" + tslib "^2.3.0" -"@nrwl/workspace@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-16.0.1.tgz#c808f130195b6695592e1378138542135f0f9d8f" - integrity sha512-jsnLcx/WVI/9ZkWx1iASu9s7YYAzXYRy5XEL2hiNEZGoM2pXoSe9IlmTeho6FAtImMOCFFbP2e51RSu8oOC9IA== +"@nrwl/web@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-16.10.0.tgz#f88d798ef7a24cc37c75ad36cd266998e4bd5dbc" + integrity sha512-BRQGOHiuEptVhjmXnlqM47epUL00RoUMjhcsfMNjyZ7WpdY0JjwJaNx4afylt3h28mSXVi4t008oE5FEC+YfYw== + dependencies: + "@nx/web" "16.10.0" + +"@nrwl/webpack@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-16.10.0.tgz#ba84f34f36499bdf176e7b71259150c1789a057c" + integrity sha512-oh/8jzytaU2YM6DOvEOt2CysKWpru+fc+M31JGj6gdq1c1wr4feSs1c/rmJ4jAfvYqejrJwyZK96XX1uRo+3RQ== + dependencies: + "@nx/webpack" "16.10.0" + +"@nrwl/workspace@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-16.10.0.tgz#0b75465c1887ef3953df32f0c234a9568c1504be" + integrity sha512-fZeNxhFs/2cm326NebfJIgSI3W4KZN94WGS46wlIBrUUGP5/vwHYsi09Kx6sG1kRkAuZVtgJ33uU2F6xcAWzUA== dependencies: - "@nx/workspace" "16.0.1" + "@nx/workspace" "16.10.0" "@nuxtjs/opencollective@0.3.2": version "0.3.2" @@ -1994,44 +2176,47 @@ consola "^2.15.0" node-fetch "^2.6.1" -"@nx/devkit@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.0.1.tgz#f6c580ab5e78812a6c970c2200998008d0937e21" - integrity sha512-6/cWPR9Y3qPPN7YGw64dB3gCLetLqUko+6G2VOUpBY4aqDI4oY3FXV/12DvXl343/pJi4ou64JfMDOpFq53wIA== +"@nx/devkit@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.10.0.tgz#7e466be2dee2dcb1ccaf286786ca2a0a639aa007" + integrity sha512-IvKQqRJFDDiaj33SPfGd3ckNHhHi6ceEoqCbAP4UuMXOPPVOX6H0KVk+9tknkPb48B7jWIw6/AgOeWkBxPRO5w== dependencies: - "@nrwl/devkit" "16.0.1" + "@nrwl/devkit" "16.10.0" ejs "^3.1.7" + enquirer "~2.3.6" ignore "^5.0.4" - semver "7.3.4" + semver "7.5.3" tmp "~0.2.1" tslib "^2.3.0" -"@nx/eslint-plugin@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-16.0.1.tgz#2c5eb552cffd9784ff6c24e45ce5119bdee77db6" - integrity sha512-55ORLmqmaqzDU5hu4B/DU648lMN4ap+XCIuiosyJ7Zw4yUX8ioABkrm+bMzgiZPCy/GXEACTMh9PVraBzkTsNg== +"@nx/eslint-plugin@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-16.10.0.tgz#da8aae489f10e13a30a184e1d4825e8541d27105" + integrity sha512-fdOlCrSJK6HfCs+FVXUxzS5gobnGymTU85B3vXPYkVpJwKmq9voX7HBhx9euScRGgXdO9335DIixc/QV6zGpKA== dependencies: - "@nrwl/eslint-plugin-nx" "16.0.1" - "@nx/devkit" "16.0.1" - "@nx/js" "16.0.1" - "@typescript-eslint/utils" "^5.58.0" + "@nrwl/eslint-plugin-nx" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/js" "16.10.0" + "@typescript-eslint/type-utils" "^5.60.1" + "@typescript-eslint/utils" "^5.60.1" chalk "^4.1.0" confusing-browser-globals "^1.0.9" - semver "7.3.4" + jsonc-eslint-parser "^2.1.0" + semver "7.5.3" + tslib "^2.3.0" -"@nx/jest@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-16.0.1.tgz#94b5bae1b6eeaa41c9a8f89b204445dd0d28670a" - integrity sha512-7WtNioN3+GMAv57zIncgnjMev/8dEIO1AiDYmwD7FtseZ8NZ1ndDDM0XZt/7NsWC1YiTJY3S3Ggr7yf4vYh3ug== +"@nx/jest@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-16.10.0.tgz#f3f15e777035877b5c37172c5611b53af9917310" + integrity sha512-QseeLjDrl4c9q9Dd/057SXYqd47JVLhD2VQlQDraYwjsHz3lWkzlGaaHy0ZrVu8LSzY7lUUhJMPyYO3qo8wT6A== dependencies: "@jest/reporters" "^29.4.1" "@jest/test-result" "^29.4.1" - "@nrwl/jest" "16.0.1" - "@nx/devkit" "16.0.1" - "@nx/js" "16.0.1" + "@nrwl/jest" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/js" "16.10.0" "@phenomnomnominal/tsquery" "~5.0.1" chalk "^4.1.0" - dotenv "~10.0.0" identity-obj-proxy "3.0.0" jest-config "^29.4.1" jest-resolve "^29.4.1" @@ -2039,138 +2224,181 @@ resolve.exports "1.1.0" tslib "^2.3.0" -"@nx/js@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-16.0.1.tgz#db4f8997f0ce170fbdc009fc5368c6056a49b5ba" - integrity sha512-n+ynbihIX6NC0o+kYdI3TdJhItlQwPxnX19+Fd3ZcvZVQVbzN5EN3ZHkVVaUtgJURZtjpXM6CAnNP2jRqe6dAA== - dependencies: - "@babel/core" "^7.15.0" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-decorators" "^7.14.5" - "@babel/plugin-transform-runtime" "^7.15.0" - "@babel/preset-env" "^7.15.0" - "@babel/preset-typescript" "^7.15.0" - "@babel/runtime" "^7.14.8" - "@nrwl/js" "16.0.1" - "@nx/devkit" "16.0.1" - "@nx/workspace" "16.0.1" +"@nx/js@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-16.10.0.tgz#cf74fc8b8b1d958d4706f0ebba56ec6642e2bfc9" + integrity sha512-27AH0/+XTMzOxVS6oV8Zl7/Rr1UDMYsnCVqoCU9CXp087uxcD4VnBOEjsEUlJKh1RdwGE3K0hBkk7NC1LP+vYQ== + dependencies: + "@babel/core" "^7.22.9" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-decorators" "^7.22.7" + "@babel/plugin-transform-runtime" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/preset-typescript" "^7.22.5" + "@babel/runtime" "^7.22.6" + "@nrwl/js" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/workspace" "16.10.0" "@phenomnomnominal/tsquery" "~5.0.1" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" babel-plugin-transform-typescript-metadata "^0.3.1" chalk "^4.1.0" + columnify "^1.6.0" + detect-port "^1.5.1" fast-glob "3.2.7" fs-extra "^11.1.0" ignore "^5.0.4" js-tokens "^4.0.0" minimatch "3.0.5" + npm-package-arg "11.0.1" + npm-run-path "^4.0.1" + ora "5.3.0" + semver "7.5.3" source-map-support "0.5.19" - tree-kill "1.2.2" + ts-node "10.9.1" + tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/linter@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-16.0.1.tgz#ad8bee5628b50d740b696acd3c1907e7a5c30aef" - integrity sha512-Yr49aAgYCL8LfTtiQITaBCg8TE3OQWIhoRAclIRTjZl/MTyvtbLwCL4IfJMH+x0Isd1SMBQtAfmXRJdKnFa9GA== +"@nx/linter@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-16.10.0.tgz#6bfd4cf9b69f97a3630708482638e6a01a343b75" + integrity sha512-G6XBfuMHNHoJDc4n2Gip4fsa9KssT91V5PF2Rd4hILkg4YU8B8mlmHN71stpzwbEyUJtyhyJc5SGgVLrSpRQew== dependencies: - "@nrwl/linter" "16.0.1" - "@nx/devkit" "16.0.1" - "@nx/js" "16.0.1" + "@nrwl/linter" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/js" "16.10.0" "@phenomnomnominal/tsquery" "~5.0.1" tmp "~0.2.1" tslib "^2.3.0" - -"@nx/nest@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-16.0.1.tgz#98ec40c334f7e995b65812ee77daa4b4a9953412" - integrity sha512-eOdfubrp18d8V6j3auqFIvNGCmaO3ldHJHEA09gdA1giNNVEmh2gcQpD0gLot7ytZaBox0tuzslvfohQZZSCQw== - dependencies: - "@nestjs/schematics" "^9.0.0" - "@nrwl/nest" "16.0.1" - "@nx/devkit" "16.0.1" - "@nx/js" "16.0.1" - "@nx/linter" "16.0.1" - "@nx/node" "16.0.1" + typescript "~5.1.3" + +"@nx/nest@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-16.10.0.tgz#eea8bc58af0e200f9aaadacd4114f1a8d668678d" + integrity sha512-nrUDtzSmRU1qV8jboBdi+HzQ/bfwqfz7EhKtsP1fXKkQH8uicKsdzP6ToC+9qG6C+hd8v3Vhu1lDoJr5dyrHqQ== + dependencies: + "@nestjs/schematics" "^9.1.0" + "@nrwl/nest" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/js" "16.10.0" + "@nx/linter" "16.10.0" + "@nx/node" "16.10.0" + "@phenomnomnominal/tsquery" "~5.0.1" enquirer "~2.3.6" - -"@nx/node@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-16.0.1.tgz#265c21ec415590d3a3efff8c91fddc85f7cf2a15" - integrity sha512-3ZAT9WVLKsrpd3mqvsQq4NwJLK0Ojr7myKhzgKAUP2WwqHkb12XEkLSkc+VIxipvF1jBiNyq53VAtiq45VY6dQ== - dependencies: - "@nrwl/node" "16.0.1" - "@nx/devkit" "16.0.1" - "@nx/jest" "16.0.1" - "@nx/js" "16.0.1" - "@nx/linter" "16.0.1" - "@nx/workspace" "16.0.1" + semver "7.5.3" tslib "^2.3.0" -"@nx/nx-darwin-arm64@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.0.1.tgz#8961b507d0423c118dcf6c67c02af7d561827132" - integrity sha512-ezBykAa6etDIQdh0Rvl8AysJV7lU+/4Grxh0DYMWlVw9EsdJXh5ELr2NepnacdzML411cVSuo6m3SIT5NvMw2Q== - -"@nx/nx-darwin-x64@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.0.1.tgz#d54f0eb02e7fddea6812dbe1b6d7b646d5b37c8a" - integrity sha512-ZTFVN0E+02EeWvToyKu1lQWdKHzPbks4R90Pw0cdDgnOaaYj2Z9GQ1rBo+3hq6K2xQb8ONOtsV3uWvrLKoQKww== - -"@nx/nx-linux-arm-gnueabihf@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.0.1.tgz#325f124d8aa3c857a423a447db668f602afcdffa" - integrity sha512-WmmVXv5HBNRzn/vWUYapJC5+CPUBaIXo6O8Iz+bniiHtsXeV5W5aYwveF1QOkHePLwUtkE18V1LDIkYksOEHOQ== - -"@nx/nx-linux-arm64-gnu@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.0.1.tgz#9e0ed994e508c5b5dc453a96f9d940d3c481d1e3" - integrity sha512-G8tOXwi5qmeBcwDah/FB7ge25Iimyu6jXuB+zL/IBXgE98Q0JtWJF/VRI5x3eo7xGq0XWH1V7msgIXN17/RNbQ== - -"@nx/nx-linux-arm64-musl@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.0.1.tgz#9697f25bcef1d3c7d0888b88e17a61f437f8c1b0" - integrity sha512-wokwHMtvTzisw8G9VHgKAfPLtPsKlkJqOXJJpHkbxKXDZvwf/AQs03xDWCSV2P7B277VIPWJxuZ7pFqne0nRfw== - -"@nx/nx-linux-x64-gnu@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.0.1.tgz#2d0cb6f994ec7f0227dc82827d5036a11780d056" - integrity sha512-9GUs45JmqpGz14ZXt4636rxj6mul0UO9S6dJpJND7M3KPFbPELg0Urj9BUtXz4vhwL2lhKMcz6XvBpQSjyE2bg== - -"@nx/nx-linux-x64-musl@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.0.1.tgz#677ec1b91b6a7f24329f9c67adb428910c7d62d4" - integrity sha512-vGq6e6/v+/YiKZeyKNyTmYNavOFTSHRAyze9I4UGB0aRouYrEuuemBSdCff+IXtwvUZEgYkEW5vTJainRBG+ig== +"@nx/node@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-16.10.0.tgz#117490d96a8e1460cace475c78e6fbd3ec55a7b7" + integrity sha512-mOGxsZzLNg9kMy/FDkCQfhb/ig3WsttHxzG9+ynCHBV5svKOIqA3F+EUp1gre6wgRyi/qrEUhk6GER5ZTX2ygw== + dependencies: + "@nrwl/node" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/jest" "16.10.0" + "@nx/js" "16.10.0" + "@nx/linter" "16.10.0" + "@nx/workspace" "16.10.0" + tslib "^2.3.0" -"@nx/nx-win32-arm64-msvc@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.0.1.tgz#c619326a1e18dc728d1103ce876e2b245f5a38ee" - integrity sha512-3xROoV57qq6ibzmeTNcx8j7Rdj3hmSryzge2ynh9Zr+4dFT4WrsF72WRYQg/kbgNRhV+IfDNq5SMM2mPDl+aRw== +"@nx/nx-darwin-arm64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.10.0.tgz#0c73010cac7a502549483b12bad347da9014e6f1" + integrity sha512-YF+MIpeuwFkyvM5OwgY/rTNRpgVAI/YiR0yTYCZR+X3AAvP775IVlusNgQ3oedTBRUzyRnI4Tknj1WniENFsvQ== + +"@nx/nx-darwin-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.10.0.tgz#2ccf270418d552fd0a8e0d6089aee4944315adaa" + integrity sha512-ypi6YxwXgb0kg2ixKXE3pwf5myVNUgWf1CsV5OzVccCM8NzheMO51KDXTDmEpXdzUsfT0AkO1sk5GZeCjhVONg== + +"@nx/nx-freebsd-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.10.0.tgz#c3ee6914256e69493fed9355b0d6661d0e86da44" + integrity sha512-UeEYFDmdbbDkTQamqvtU8ibgu5jQLgFF1ruNb/U4Ywvwutw2d4ruOMl2e0u9hiNja9NFFAnDbvzrDcMo7jYqYw== + +"@nx/nx-linux-arm-gnueabihf@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.10.0.tgz#a961eccbb38acb2da7fc125b29d1fead0b39152f" + integrity sha512-WV3XUC2DB6/+bz1sx+d1Ai9q2Cdr+kTZRN50SOkfmZUQyEBaF6DRYpx/a4ahhxH3ktpNfyY8Maa9OEYxGCBkQA== + +"@nx/nx-linux-arm64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.10.0.tgz#795f20072549d03822b5c4639ef438e473dbb541" + integrity sha512-aWIkOUw995V3ItfpAi5FuxQ+1e9EWLS1cjWM1jmeuo+5WtaKToJn5itgQOkvSlPz+HSLgM3VfXMvOFALNk125g== + +"@nx/nx-linux-arm64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.10.0.tgz#f2428ee6dbe2b2c326e8973f76c97666def33607" + integrity sha512-uO6Gg+irqpVcCKMcEPIQcTFZ+tDI02AZkqkP7koQAjniLEappd8DnUBSQdcn53T086pHpdc264X/ZEpXFfrKWQ== + +"@nx/nx-linux-x64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.10.0.tgz#d36c2bcf94d49eaa24e3880ddaf6f1f617de539b" + integrity sha512-134PW/u/arNFAQKpqMJniC7irbChMPz+W+qtyKPAUXE0XFKPa7c1GtlI/wK2dvP9qJDZ6bKf0KtA0U/m2HMUOA== + +"@nx/nx-linux-x64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.10.0.tgz#78bd2ab97a583b3d4ea3387b67fd7b136907493c" + integrity sha512-q8sINYLdIJxK/iUx9vRk5jWAWb/2O0PAbOJFwv4qkxBv4rLoN7y+otgCZ5v0xfx/zztFgk/oNY4lg5xYjIso2Q== + +"@nx/nx-win32-arm64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.10.0.tgz#ef20ec8d0c83d66e73e20df12d2c788b8f866396" + integrity sha512-moJkL9kcqxUdJSRpG7dET3UeLIciwrfP08mzBQ12ewo8K8FzxU8ZUsTIVVdNrwt01CXOdXoweGfdQLjJ4qTURA== + +"@nx/nx-win32-x64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.10.0.tgz#7410a51d0f8be631eec9552f01b2e5946285927c" + integrity sha512-5iV2NKZnzxJwZZ4DM5JVbRG/nkhAbzEskKaLBB82PmYGKzaDHuMHP1lcPoD/rtYMlowZgNA/RQndfKvPBPwmXA== + +"@nx/react@16.10.0", "@nx/react@^16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/react/-/react-16.10.0.tgz#37f23f58f524fbfeb6b50714638aaefa8cfd8cb9" + integrity sha512-WjiXImZWqXDXguHHONO/ANWl3BzqLt6pEvN+uhrRbJGBUWKJz95z8PQfZXeiK6UVY8RFHZXkHtklV3TvTvQ64w== + dependencies: + "@nrwl/react" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/js" "16.10.0" + "@nx/linter" "16.10.0" + "@nx/web" "16.10.0" + "@phenomnomnominal/tsquery" "~5.0.1" + "@svgr/webpack" "^8.0.1" + chalk "^4.1.0" + file-loader "^6.2.0" + minimatch "3.0.5" + tslib "^2.3.0" -"@nx/nx-win32-x64-msvc@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.0.1.tgz#ccdc365c0b5a2b1006ae546c4c1fec0ae3a7e061" - integrity sha512-7jkC3kukEBnV/1+YMFY0VjbGGlGihpQEj3LrgjVdM8+Uf1qcyKhmHlVV3iJ87Bix+wVG7TmsSJ+XPchh0FJlsw== +"@nx/web@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-16.10.0.tgz#b242a6403df8e54bdd22f6c19adff497bee2a726" + integrity sha512-UMGL7BOPyy6flJLePSG8JhEbfI9W4Y6oVqOziLbQODduU3HGr6woJCI38txnOX4nddbyEnL9tRuKkQ8u0YAYnw== + dependencies: + "@nrwl/web" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/js" "16.10.0" + chalk "^4.1.0" + detect-port "^1.5.1" + http-server "^14.1.0" + tslib "^2.3.0" -"@nx/webpack@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-16.0.1.tgz#97547e5e4cd13c2c47c0781c79bcb2a5814fcd8e" - integrity sha512-qArqDAc08EggonVKncYtN1X56G+QhkEKaz9mb1TFXVGj2VE5p0SY9uXd1b8I3mVG4iczs/zUXedvbIgbdexDYQ== +"@nx/webpack@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-16.10.0.tgz#13368e822b694c24f43e60035aa875724c40e49e" + integrity sha512-rKftYWh4kW6A7svMx73Zg3fJFDS3618cKTZsCkuQWeSE+RMQXjcefeCxYhwvHXc/ehoakCIIBx7jDCR+6NIlzQ== dependencies: - "@babel/core" "^7.15.0" - "@nrwl/webpack" "16.0.1" - "@nx/devkit" "16.0.1" - "@nx/js" "16.0.1" + "@babel/core" "^7.22.9" + "@nrwl/webpack" "16.10.0" + "@nx/devkit" "16.10.0" + "@nx/js" "16.10.0" autoprefixer "^10.4.9" babel-loader "^9.1.2" + browserslist "^4.21.4" chalk "^4.1.0" - chokidar "^3.5.1" copy-webpack-plugin "^10.2.4" css-loader "^6.4.0" - css-minimizer-webpack-plugin "^3.4.1" - dotenv "~10.0.0" - file-loader "^6.2.0" + css-minimizer-webpack-plugin "^5.0.0" fork-ts-checker-webpack-plugin "7.2.13" - ignore "^5.0.4" less "4.1.3" less-loader "11.1.0" license-webpack-plugin "^4.0.2" @@ -2180,48 +2408,35 @@ postcss "^8.4.14" postcss-import "~14.1.0" postcss-loader "^6.1.1" - rxjs "^6.5.4" + rxjs "^7.8.0" sass "^1.42.1" sass-loader "^12.2.0" source-map-loader "^3.0.0" style-loader "^3.3.0" - stylus "^0.55.0" + stylus "^0.59.0" stylus-loader "^7.1.0" terser-webpack-plugin "^5.3.3" ts-loader "^9.3.1" - ts-node "10.9.1" - tsconfig-paths "^4.1.2" tsconfig-paths-webpack-plugin "4.0.0" tslib "^2.3.0" - webpack "^5.75.0" + webpack "^5.80.0" webpack-dev-server "^4.9.3" webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nx/workspace@16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-16.0.1.tgz#1e309f8e4b1999b34e135f4f44302f52268ad5ab" - integrity sha512-meN3VBJt4HCmNCGhroea0v8QhqV0X1UIE5hjHISvYcPRXcmYxhD3QwkhR0zuI8EeZyzX5MmyAZEispHNDTPZ+w== +"@nx/workspace@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-16.10.0.tgz#01d8679949b9a7637b756876e3a1f4853a94c230" + integrity sha512-95Eq36bzq2hb095Zvg+Ru8o9oIeOE62tNGGpohBkZPKoK2CUTYEq0AZtdj1suXS82ukCFCyyZ/c/fwxL62HRZA== dependencies: - "@nrwl/workspace" "16.0.1" - "@nx/devkit" "16.0.1" - "@parcel/watcher" "2.0.4" + "@nrwl/workspace" "16.10.0" + "@nx/devkit" "16.10.0" chalk "^4.1.0" - chokidar "^3.5.1" - cli-cursor "3.1.0" - cli-spinners "2.6.1" - dotenv "~10.0.0" - figures "3.2.0" - flat "^5.0.2" + enquirer "~2.3.6" ignore "^5.0.4" - minimatch "3.0.5" - npm-run-path "^4.0.1" - nx "16.0.1" - open "^8.4.0" - rxjs "^6.5.4" - tmp "~0.2.1" + nx "16.10.0" + rxjs "^7.8.0" tslib "^2.3.0" - yargs "^17.6.2" yargs-parser "21.1.1" "@octokit/auth-token@^4.0.0": @@ -2230,9 +2445,9 @@ integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== "@octokit/core@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.1.tgz#865da2b30d54354cccb6e30861ddfa0e24494780" - integrity sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.2.tgz#ae7c5d61fdd98ba348a27c3cc510879a130b1234" + integrity sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg== dependencies: "@octokit/auth-token" "^4.0.0" "@octokit/graphql" "^7.0.0" @@ -2243,12 +2458,11 @@ universal-user-agent "^6.0.0" "@octokit/endpoint@^9.0.0": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.1.tgz#c3f69d27accddcb04a3199fcef541804288149d2" - integrity sha512-hRlOKAovtINHQPYHZlfyFwaM8OyetxeoC81lAkBy34uLb8exrZB50SQdeW3EROqiY9G9yxQTpp5OHTV54QD+vA== + version "9.0.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.3.tgz#2a38b92766bd535775b1adc7b731458497433613" + integrity sha512-TXVX57fJV7SA6LvRkeXPIOBr8AKvKDlhwNVBP/26O9DjIFi+CkYZGFLP9WtPdVOicRIhqGHxBCC6Fdj5AWWGgQ== dependencies: "@octokit/types" "^12.0.0" - is-plain-object "^5.0.0" universal-user-agent "^6.0.0" "@octokit/graphql@^7.0.0": @@ -2260,17 +2474,17 @@ "@octokit/types" "^12.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.0.0.tgz#0101bf62ab14c1946149a0f8385440963e1253c4" - integrity sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw== +"@octokit/openapi-types@^19.0.2": + version "19.0.2" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.0.2.tgz#d72778fe2f6151314b6f0201fbc771bb741276fc" + integrity sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ== "@octokit/plugin-paginate-rest@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.0.0.tgz#21fd12816c2dc158a775ed20be5abcbc61052a46" - integrity sha512-oIJzCpttmBTlEhBmRvb+b9rlnGpmFgDtZ0bB6nq39qIod6A5DP+7RkVLMOixIgRCYSHDTeayWqmiJ2SZ6xgfdw== + version "9.1.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.4.tgz#9eca55e3e88f15b574e072732769e933bfa88d8b" + integrity sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ== dependencies: - "@octokit/types" "^12.0.0" + "@octokit/types" "^12.3.0" "@octokit/plugin-retry@^6.0.0": version "6.0.1" @@ -2282,11 +2496,11 @@ bottleneck "^2.15.3" "@octokit/plugin-throttling@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-8.0.1.tgz#df2df59d0be8ca8e4f30cc38e6b2bd3ccef5606c" - integrity sha512-i373s7TgaoAOlzOepjUTvyMXqjBu9b26SvLyLD5onBdgexIOeu43yOH1e3z3VPAzbEyRfKDHcqfAsOyKl7Jtxg== + version "8.1.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz#7fb0e001c0cb9383c6be07740b8ec326ed990f6b" + integrity sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A== dependencies: - "@octokit/types" "^12.0.0" + "@octokit/types" "^12.2.0" bottleneck "^2.15.3" "@octokit/request-error@^5.0.0": @@ -2299,22 +2513,21 @@ once "^1.4.0" "@octokit/request@^8.0.1", "@octokit/request@^8.0.2": - version "8.1.4" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.4.tgz#12dfaebdb2ea375eaabb41d39d45182531ac2857" - integrity sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA== + version "8.1.6" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.6.tgz#a76a859c30421737a3918b40973c2ff369009571" + integrity sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ== dependencies: "@octokit/endpoint" "^9.0.0" "@octokit/request-error" "^5.0.0" "@octokit/types" "^12.0.0" - is-plain-object "^5.0.0" universal-user-agent "^6.0.0" -"@octokit/types@^12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.0.0.tgz#6b34309288b6f5ac9761d2589e3165cde1b95fee" - integrity sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg== +"@octokit/types@^12.0.0", "@octokit/types@^12.2.0", "@octokit/types@^12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.3.0.tgz#e3f8bc53f65ef551e19cc1a0fea15adadec17d2d" + integrity sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ== dependencies: - "@octokit/openapi-types" "^19.0.0" + "@octokit/openapi-types" "^19.0.2" "@parcel/watcher@2.0.4": version "2.0.4" @@ -2363,6 +2576,21 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@pmmmwh/react-refresh-webpack-plugin@^0.5.7": + version "0.5.11" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#7c2268cedaa0644d677e8c4f377bc8fb304f714a" + integrity sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.23.3" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.4" + schema-utils "^3.0.0" + source-map "^0.7.3" + "@pnpm/config.env-replace@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" @@ -2384,6 +2612,77 @@ "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" +"@rc-component/color-picker@~1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@rc-component/color-picker/-/color-picker-1.4.1.tgz#dcab0b660e9c4ed63a7582db68ed4a77c862cb93" + integrity sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw== + dependencies: + "@babel/runtime" "^7.10.1" + "@ctrl/tinycolor" "^3.6.0" + classnames "^2.2.6" + rc-util "^5.30.0" + +"@rc-component/context@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@rc-component/context/-/context-1.4.0.tgz#dc6fb021d6773546af8f016ae4ce9aea088395e8" + integrity sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w== + dependencies: + "@babel/runtime" "^7.10.1" + rc-util "^5.27.0" + +"@rc-component/mini-decimal@^1.0.1": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz#7b7a362b14a0a54cb5bc6fd2b82731f29f11d9b0" + integrity sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ== + dependencies: + "@babel/runtime" "^7.18.0" + +"@rc-component/mutate-observer@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz#ee53cc88b78aade3cd0653609215a44779386fd8" + integrity sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0", "@rc-component/portal@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-1.1.2.tgz#55db1e51d784e034442e9700536faaa6ab63fc71" + integrity sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/tour@~1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.10.0.tgz#b05bc327438f1c583439e2d2dcc10ec0530aea19" + integrity sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A== + dependencies: + "@babel/runtime" "^7.18.0" + "@rc-component/portal" "^1.0.0-9" + "@rc-component/trigger" "^1.3.6" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/trigger@^1.17.0", "@rc-component/trigger@^1.18.0", "@rc-component/trigger@^1.18.2", "@rc-component/trigger@^1.3.6", "@rc-component/trigger@^1.5.0", "@rc-component/trigger@^1.7.0": + version "1.18.2" + resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-1.18.2.tgz#dc52c4c66fa8aaccaf0710498f2429fc05454e3b" + integrity sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA== + dependencies: + "@babel/runtime" "^7.23.2" + "@rc-component/portal" "^1.1.0" + classnames "^2.3.2" + rc-motion "^2.0.0" + rc-resize-observer "^1.3.1" + rc-util "^5.38.0" + +"@remix-run/router@1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.2.tgz#bbe75f8c59e0b7077584920ce2cc76f8f354934d" + integrity sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA== + "@semantic-release/changelog@^6.0.3": version "6.0.3" resolved "https://registry.yarnpkg.com/@semantic-release/changelog/-/changelog-6.0.3.tgz#6195630ecbeccad174461de727d5f975abc23eeb" @@ -2445,9 +2744,9 @@ p-reduce "^2.0.0" "@semantic-release/github@^9.0.0": - version "9.2.1" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-9.2.1.tgz#031a617d55f9a78ef5fc2dab4bb6e84d84b8cd37" - integrity sha512-fEn9uOe6jwWR6ro2Wh6YNBCBuZ5lRi8Myz+1j3KDTSt8OuUGlpVM4lFac/0bDrql2NOKrIEAMGCfWb9WMIdzIg== + version "9.2.3" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-9.2.3.tgz#d8eeba7c00bf3145cee1bb9b60940d475af3e9f9" + integrity sha512-FAjXb1F84CVI6IG8fWi+XS9ErYD+s3MHkP03zBa3+GyUrV4kqwYu/WPppIciHxujGFR51SAWPkOY5rnH6ZlrxA== dependencies: "@octokit/core" "^5.0.0" "@octokit/plugin-paginate-rest" "^9.0.0" @@ -2457,7 +2756,7 @@ aggregate-error "^5.0.0" debug "^4.3.4" dir-glob "^3.0.1" - globby "^13.1.4" + globby "^14.0.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.0" issue-parser "^6.0.0" @@ -2467,9 +2766,9 @@ url-join "^5.0.0" "@semantic-release/gitlab@^12.0.1": - version "12.0.6" - resolved "https://registry.yarnpkg.com/@semantic-release/gitlab/-/gitlab-12.0.6.tgz#00c9c1cf9e8781f88c39359b757c3b8c91957d59" - integrity sha512-NjGq+6cA64bQIyAjFSxzXxUJCS94fAtw8QMQSvuUycqhbQqXvjTKuknm9fS327leZURqslDMMKwEMuj0cHy31g== + version "12.1.1" + resolved "https://registry.yarnpkg.com/@semantic-release/gitlab/-/gitlab-12.1.1.tgz#00cbd31eddd512a7643c45745b61135e0534358c" + integrity sha512-vM8mqMmegRJB4+9MJCYeCt5Gn4C2rpF0bNOzKOHq1IaI4FleIV5sss0fn55jVCuVVztTnoPQylnti5Tkdg3uaw== dependencies: "@semantic-release/error" "^4.0.0" aggregate-error "^5.0.0" @@ -2478,7 +2777,7 @@ escape-string-regexp "^5.0.0" form-data "^4.0.0" fs-extra "^11.0.0" - globby "^11.0.0" + globby "^14.0.0" got "^13.0.0" hpagent "^1.0.0" lodash-es "^4.17.21" @@ -2571,11 +2870,21 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + "@sindresorhus/is@^5.2.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== +"@sindresorhus/merge-streams@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz#9cd84cc15bc865a5ca35fcaae198eb899f7b5c90" + integrity sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw== + "@sinonjs/commons@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" @@ -2652,22 +2961,280 @@ resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" + +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== + dependencies: + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" + +"@svgr/webpack@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== + dependencies: + "@babel/core" "^7.21.3" + "@babel/plugin-transform-react-constant-elements" "^7.21.3" + "@babel/preset-env" "^7.20.2" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.21.0" + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" + +"@swc-node/core@^1.10.6": + version "1.10.6" + resolved "https://registry.yarnpkg.com/@swc-node/core/-/core-1.10.6.tgz#5c2af68bd4c9c8f5d91178a724af341a4402f5b6" + integrity sha512-lDIi/rPosmKIknWzvs2/Fi9zWRtbkx8OJ9pQaevhsoGzJSal8Pd315k1W5AIrnknfdAB4HqRN12fk6AhqnrEEw== + +"@swc-node/register@^1.6.8": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@swc-node/register/-/register-1.6.8.tgz#4e2402b42ae5b538d5041e0c4d86d9c3c8d5b323" + integrity sha512-74ijy7J9CWr1Z88yO+ykXphV29giCrSpANQPQRooE0bObpkTO1g4RzQovIfbIaniBiGDDVsYwDoQ3FIrCE8HcQ== + dependencies: + "@swc-node/core" "^1.10.6" + "@swc-node/sourcemap-support" "^0.3.0" + colorette "^2.0.19" + debug "^4.3.4" + pirates "^4.0.5" + tslib "^2.5.0" + +"@swc-node/sourcemap-support@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@swc-node/sourcemap-support/-/sourcemap-support-0.3.0.tgz#e8a0d139bd3e8db39635f63fde43dbe6c39237cc" + integrity sha512-gqBJSmJMWomZFxlppaKea7NeAqFrDrrS0RMt24No92M3nJWcyI9YKGEQKl+EyJqZ5gh6w1s0cTklMHMzRwA1NA== + dependencies: + source-map-support "^0.5.21" + tslib "^2.5.0" + +"@swc/cli@~0.1.62": + version "0.1.63" + resolved "https://registry.yarnpkg.com/@swc/cli/-/cli-0.1.63.tgz#b4ab850f8c285d06d593428b14ffa3df782adcbb" + integrity sha512-EM9oxxHzmmsprYRbGqsS2M4M/Gr5Gkcl0ROYYIdlUyTkhOiX822EQiRCpPCwdutdnzH2GyaTN7wc6i0Y+CKd3A== + dependencies: + "@mole-inc/bin-wrapper" "^8.0.1" + commander "^7.1.0" + fast-glob "^3.2.5" + semver "^7.3.8" + slash "3.0.0" + source-map "^0.7.3" + +"@swc/core-darwin-arm64@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.99.tgz#def204349ac645b8de21a800fa784907642a6c91" + integrity sha512-Qj7Jct68q3ZKeuJrjPx7k8SxzWN6PqLh+VFxzA+KwLDpQDPzOlKRZwkIMzuFjLhITO4RHgSnXoDk/Syz0ZeN+Q== + +"@swc/core-darwin-x64@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.99.tgz#2633f1ac1668ec569f34f86eb5250d56fcacd952" + integrity sha512-wR7m9QVJjgiBu1PSOHy7s66uJPa45Kf9bZExXUL+JAa9OQxt5y+XVzr+n+F045VXQOwdGWplgPnWjgbUUHEVyw== + +"@swc/core-linux-arm64-gnu@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.99.tgz#871c2f049a3a5d88bcc7317ac004230517a08ba4" + integrity sha512-gcGv1l5t0DScEONmw5OhdVmEI/o49HCe9Ik38zzH0NtDkc+PDYaCcXU5rvfZP2qJFaAAr8cua8iJcOunOSLmnA== + +"@swc/core-linux-arm64-musl@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.99.tgz#28ed1622e92bc13aab4b650f2af695af8695289b" + integrity sha512-XL1/eUsTO8BiKsWq9i3iWh7H99iPO61+9HYiWVKhSavknfj4Plbn+XyajDpxsauln5o8t+BRGitymtnAWJM4UQ== + +"@swc/core-linux-x64-gnu@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.99.tgz#8e07add9cc8b76d542959e3240340effa6c6e446" + integrity sha512-fGrXYE6DbTfGNIGQmBefYxSk3rp/1lgbD0nVg4rl4mfFRQPi7CgGhrrqSuqZ/ezXInUIgoCyvYGWFSwjLXt/Qg== + +"@swc/core-linux-x64-musl@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.99.tgz#677eb82d6862605cb0a81ec5b732bef2a9861b16" + integrity sha512-kvgZp/mqf3IJ806gUOL6gN6VU15+DfzM1Zv4Udn8GqgXiUAvbQehrtruid4Snn5pZTLj4PEpSCBbxgxK1jbssA== + +"@swc/core-win32-arm64-msvc@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.99.tgz#6c9bf96dd4cb81b5960884906766dc47a49efb0d" + integrity sha512-yt8RtZ4W/QgFF+JUemOUQAkVW58cCST7mbfKFZ1v16w3pl3NcWd9OrtppFIXpbjU1rrUX2zp2R7HZZzZ2Zk/aQ== + +"@swc/core-win32-ia32-msvc@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.99.tgz#6940a602b65137eee30f09ced7cd9fcb6e162b88" + integrity sha512-62p5fWnOJR/rlbmbUIpQEVRconICy5KDScWVuJg1v3GPLBrmacjphyHiJC1mp6dYvvoEWCk/77c/jcQwlXrDXw== + +"@swc/core-win32-x64-msvc@1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.99.tgz#7fcdfe6577f015604f7e69f71dda99822e946385" + integrity sha512-PdppWhkoS45VGdMBxvClVgF1hVjqamtvYd82Gab1i4IV45OSym2KinoDCKE1b6j3LwBLOn2J9fvChGSgGfDCHQ== + +"@swc/core@^1.3.99": + version "1.3.99" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.99.tgz#24a2ff0aaa1096b31046c8099b043936db0c4ca6" + integrity sha512-8O996RfuPC4ieb4zbYMfbyCU9k4gSOpyCNnr7qBQ+o7IEmh8JCV6B8wwu+fT/Om/6Lp34KJe1IpJ/24axKS6TQ== + dependencies: + "@swc/counter" "^0.1.1" + "@swc/types" "^0.1.5" + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.99" + "@swc/core-darwin-x64" "1.3.99" + "@swc/core-linux-arm64-gnu" "1.3.99" + "@swc/core-linux-arm64-musl" "1.3.99" + "@swc/core-linux-x64-gnu" "1.3.99" + "@swc/core-linux-x64-musl" "1.3.99" + "@swc/core-win32-arm64-msvc" "1.3.99" + "@swc/core-win32-ia32-msvc" "1.3.99" + "@swc/core-win32-x64-msvc" "1.3.99" + +"@swc/counter@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.2.tgz#bf06d0770e47c6f1102270b744e17b934586985e" + integrity sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw== + +"@swc/helpers@~0.5.2": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f" + integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A== + dependencies: + tslib "^2.4.0" + +"@swc/types@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a" + integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw== + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@testing-library/dom@^9.0.0": + version "9.3.3" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.3.tgz#108c23a5b0ef51121c26ae92eb3179416b0434f5" + integrity sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/react@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c" + integrity sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^9.0.0" + "@types/react-dom" "^18.0.0" + +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@tsconfig/node10@^1.0.7": version "1.0.9" @@ -2702,17 +3269,22 @@ "@tufjs/canonical-json" "1.0.0" minimatch "^9.0.0" +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + "@types/async-retry@^1.4.5": - version "1.4.7" - resolved "https://registry.yarnpkg.com/@types/async-retry/-/async-retry-1.4.7.tgz#2b2bbb44f6755f28eba367a6593d198f5e2cb45b" - integrity sha512-4NH5wuf9x7LZWD23/knI6RBywD1qCmLm7wNaqq0riy7hdDrCGGfkPOUvx0Cb78lVrFrEnCvocoL8+UcvSQlBDw== + version "1.4.8" + resolved "https://registry.yarnpkg.com/@types/async-retry/-/async-retry-1.4.8.tgz#eb32df13aceb9ba1a8a80e7fe518ff4e3fe46bb3" + integrity sha512-Qup/B5PWLe86yI5I3av6ePGaeQrIHNKCwbsQotD6aHQ6YkHsMUxVZkZsmx/Ry3VZQ6uysHwTjQ7666+k6UjVJA== dependencies: "@types/retry" "*" "@types/babel__core@^7.1.14": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" - integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2721,82 +3293,92 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.6" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8" - integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w== + version "7.6.7" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" + integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f" - integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058" - integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw== + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" + integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== dependencies: "@babel/types" "^7.20.7" "@types/body-parser@*": - version "1.19.4" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" - integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.12" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.12.tgz#49badafb988e6c433ca675a5fd769b93b7649fc8" - integrity sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg== + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" "@types/node" "*" + "@types/responselike" "^1.0.0" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" - integrity sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.37" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" - integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/eslint-scope@^3.7.3": - version "3.7.6" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz#585578b368ed170e67de8aae7b93f54a1b2fdc26" - integrity sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ== + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.6" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.6.tgz#60e564551966dd255f4c01c459f0b4fb87068603" - integrity sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw== + version "8.44.7" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5" + integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" - integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.39" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz#2107afc0a4b035e6cb00accac3bdf2d76ae408c8" - integrity sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ== + version "4.17.41" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2804,9 +3386,9 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.15": - version "4.17.20" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" - integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -2814,75 +3396,96 @@ "@types/serve-static" "*" "@types/graceful-fs@^4.1.3": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" - integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" -"@types/http-cache-semantics@^4.0.2": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#a3ff232bf7d5c55f38e4e45693eda2ebb545794d" - integrity sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA== +"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/http-errors@*": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" - integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": - version "1.17.13" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.13.tgz#dd3a4da550580eb0557d4c7128a2ff1d1a38d465" - integrity sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw== + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" - integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1" - integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7" - integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.4.0": - version "29.5.6" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.6.tgz#f4cf7ef1b5b0bfc1aa744e41b24d9cc52533130b" - integrity sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w== + version "29.5.10" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.10.tgz#a10fc5bab9e426081c12b2ef73d24d4f0c9b7f50" + integrity sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.14" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" - integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" "@types/mime@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.3.tgz#886674659ce55fe7c6c06ec5ca7c0eb276a08f91" - integrity sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== "@types/mime@^1": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" - integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/minimist@^1.2.0": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.4.tgz#81f886786411c45bba3f33e781ab48bd56bfca2e" - integrity sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node-fetch@2.6.2": version "2.6.2" @@ -2892,156 +3495,222 @@ "@types/node" "*" form-data "^3.0.0" +"@types/node-forge@^1.3.0": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.10.tgz#62a19d4f75a8b03290578c2b04f294b1a5a71b07" + integrity sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw== + dependencies: + "@types/node" "*" + "@types/node@*": - version "20.8.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" - integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + version "20.10.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617" + integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== dependencies: - undici-types "~5.25.1" + undici-types "~5.26.4" -"@types/node@~18.7.1": - version "18.7.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.23.tgz#75c580983846181ebe5f4abc40fe9dfb2d65665f" - integrity sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg== +"@types/node@18.14.2": + version "18.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.2.tgz#c076ed1d7b6095078ad3cf21dfeea951842778b1" + integrity sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA== "@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.1": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" - integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/parse-json@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.1.tgz#27f7559836ad796cea31acb63163b203756a5b4e" - integrity sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/passport-http@^0.3.9": - version "0.3.10" - resolved "https://registry.yarnpkg.com/@types/passport-http/-/passport-http-0.3.10.tgz#dede6cbf9d75c853134a026d879f6bededb7faba" - integrity sha512-/QvcXAyamDdIohnZ8bqZtrpl9RhvEjDqVx0tDudDXf8eZCHH9yzYYmTiFDb7qIyK2Ae3Ke2yNbf8h7dwwGbuQQ== + version "0.3.11" + resolved "https://registry.yarnpkg.com/@types/passport-http/-/passport-http-0.3.11.tgz#6977ed7f6f734f8887966ef3d7e52d828d927412" + integrity sha512-FO0rDRYtuha9m2ZgRx5+jrgrrkAnUzgzdItFI0dwKBC6k9pArK677Gtan67u6+Qah2nXVP3M1uZ5p90SpBT5Zg== dependencies: "@types/express" "*" "@types/passport" "*" "@types/passport-local@^1.0.35": - version "1.0.37" - resolved "https://registry.yarnpkg.com/@types/passport-local/-/passport-local-1.0.37.tgz#97f6a60873b551f08c3a251043eb1662ecc546f7" - integrity sha512-c57CwMHhMP2BBiOLyQZGRP43F8JtC84H976YVJdiU4EIWvqRCZ3F7QtsEgksOEIgMOk1Kz3EEKGA93OiDPQtRQ== + version "1.0.38" + resolved "https://registry.yarnpkg.com/@types/passport-local/-/passport-local-1.0.38.tgz#8073758188645dde3515808999b1c218a6fe7141" + integrity sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg== dependencies: "@types/express" "*" "@types/passport" "*" "@types/passport-strategy" "*" "@types/passport-strategy@*": - version "0.2.37" - resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.37.tgz#c1f2bc6c24c79a22ddd4693904b544837908a9eb" - integrity sha512-ltgwLnwHVfpjK7/66lpv43hiz90nIVb36JmeB0iF3FAZoHX6+LbkY5Ey97Bm8Jr0uGhQyDFEsSOOfejp5PJehg== + version "0.2.38" + resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.38.tgz#482abba0b165cd4553ec8b748f30b022bd6c04d3" + integrity sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA== dependencies: "@types/express" "*" "@types/passport" "*" "@types/passport@*": - version "1.0.14" - resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.14.tgz#7ca891b04ae08d7ca4dbf30fece7c86174a16db9" - integrity sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw== + version "1.0.16" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.16.tgz#5a2918b180a16924c4d75c31254c31cdca5ce6cf" + integrity sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A== dependencies: "@types/express" "*" +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + "@types/qs@*": - version "6.9.9" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" - integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== + version "6.9.10" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.10.tgz#0af26845b5067e1c9a622658a51f60a3934d51e8" + integrity sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw== "@types/range-parser@*": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" - integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/react-dom@18.2.9": + version "18.2.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.9.tgz#c4ce3c7c91a134e1bff58692aa2d2f2f4029c38b" + integrity sha512-6nNhVzZ9joQ6F7lozrASuQKC0Kf6ArYMU+DqA2ZrUbB+d+9lC6ZLn1GxiEBI1edmAwvTULtuJ6uPZpv3XudwUg== + dependencies: + "@types/react" "*" + +"@types/react-dom@^18.0.0": + version "18.2.17" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.17.tgz#375c55fab4ae671bd98448dcfa153268d01d6f64" + integrity sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "18.2.38" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.38.tgz#3605ca41d3daff2c434e0b98d79a2469d4c2dd52" + integrity sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@18.2.24": + version "18.2.24" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.24.tgz#3c7d68c02e0205a472f04abe4a0c1df35d995c05" + integrity sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" "@types/ref-array-di@^1.2.5": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/ref-array-di/-/ref-array-di-1.2.7.tgz#83f0cdade1fe3b0c4b66e908097f6372489ed080" - integrity sha512-gqvEQaQwlud0A5/prOH6Sn4woq8GMZSosfD2+ES5QstRW4+v/6gzG3mRTtMzT7do5W9EWXrwCQUF+bl9FMCtlw== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@types/ref-array-di/-/ref-array-di-1.2.8.tgz#2b44567b8eaae72c59db68a482f5d26297e955be" + integrity sha512-+re5xrhRXDUR3sicMvN9N3C+6mklq5kd7FkN3ciRWio3BAvUDh2OEUTTG+619r10dqc6de25LIDtgpHtXCKGbA== dependencies: "@types/ref-napi" "*" "@types/ref-napi@*": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@types/ref-napi/-/ref-napi-3.0.9.tgz#abab7c6e66107e041340ccac1ee2d372b2f89bdc" - integrity sha512-1bkJnz0UTmqvh0IsLUoNhqZkurO+mShFwybDoQ2pXHe74ypvNIVEXzLFgkpXxYBt3PEDy757eX+z/MtakzN1QQ== + version "3.0.12" + resolved "https://registry.yarnpkg.com/@types/ref-napi/-/ref-napi-3.0.12.tgz#2ddde995ecf769f1e5da01604e468348949c72c3" + integrity sha512-UZPKghRaLlWx2lPAphpdtYe62TbGBaPeqUM6gF1vI6FPRIu/Tff/WMAzpJRFU3jJIiD8HiXpVt2RjcFHtA6YRg== + dependencies: + "@types/node" "*" + +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== dependencies: "@types/node" "*" "@types/retry@*": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.4.tgz#67d65e2df7a82b0b0ec0ba7fb2711c50c2adf1f4" - integrity sha512-l1YzFLj8Y6OhLdt7HKXlz56DoEmksB7qR8KVk+MpFsS4duwnoszLgDlLxJB0vgSqtg/rAS5gmYg5Bjw2sMJ8Ew== + version "0.12.5" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.5.tgz#f090ff4bd8d2e5b940ff270ab39fd5ca1834a07e" + integrity sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw== "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + "@types/semver@^7.3.12": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" - integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== "@types/send@*": - version "0.17.3" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" - integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.3.tgz#af9403916eb6fbf7d6ec6f47b2a4c46eb3222cc9" - integrity sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg== + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.4" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" - integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": - version "0.3.35" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.35.tgz#f4a568c73d2a8071944bd6ffdca0d4e66810cd21" - integrity sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw== + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" "@types/stack-utils@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b" - integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + +"@types/uuid@^9.0.6": + version "9.0.7" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.7.tgz#b14cebc75455eeeb160d5fe23c2fcc0c64f724d8" + integrity sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g== "@types/validator@^13.7.10": - version "13.11.5" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.5.tgz#1911964fd5556b08d3479d1ded977c06f89a44a7" - integrity sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q== + version "13.11.7" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.7.tgz#99e19760297667ae46b7069ec8b96cbfe0a08b98" + integrity sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q== "@types/ws@^8.5.4", "@types/ws@^8.5.5": - version "8.5.8" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.8.tgz#13efec7bd439d0bdf2af93030804a94f163b1430" - integrity sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg== + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.2" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b" - integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.29" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf" - integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA== + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" @@ -3079,7 +3748,7 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.62.0": +"@typescript-eslint/type-utils@5.62.0", "@typescript-eslint/type-utils@^5.60.1": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== @@ -3107,7 +3776,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.60.1": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== @@ -3280,10 +3949,10 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -"@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0.tgz#a43136f094bca5dcc1ae784c296446a85211cc62" - integrity sha512-jVZa3njBv6tcOUw34nlUdUM/40wwtm/gnVF8rtk0tA6vNcokqYI8CFU1BZjlpFwUSZaXxYkrtuPE/f2MMFlTxQ== +"@yarnpkg/parsers@3.0.0-rc.46": + version "3.0.0-rc.46" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz#03f8363111efc0ea670e53b0282cd3ef62de4e01" + integrity sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" @@ -3303,7 +3972,7 @@ JSONStream@^1.0.4, JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.5: +abab@^2.0.5, abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== @@ -3333,6 +4002,14 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-import-assertions@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" @@ -3343,21 +4020,26 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== +acorn-walk@^8.0.2, acorn-walk@^8.1.1: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== -acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== +acorn@^8.1.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== +address@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3505,6 +4187,60 @@ ansicolors@~0.3.2: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== +antd@^5.10.1: + version "5.11.4" + resolved "https://registry.yarnpkg.com/antd/-/antd-5.11.4.tgz#7c4c7254a0424573c095d20d997d2e34763e67f2" + integrity sha512-FuaV/viyZiMlCL1JzdQpSlzPcWcBlGYDAbtj3FM4BgwAso+ge3d4tXkZZG4yZkktUoLvWrcaJObs3Nk32Oiwuw== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/cssinjs" "^1.17.5" + "@ant-design/icons" "^5.2.6" + "@ant-design/react-slick" "~1.0.2" + "@babel/runtime" "^7.18.3" + "@ctrl/tinycolor" "^3.6.1" + "@rc-component/color-picker" "~1.4.1" + "@rc-component/mutate-observer" "^1.1.0" + "@rc-component/tour" "~1.10.0" + "@rc-component/trigger" "^1.18.2" + classnames "^2.3.2" + copy-to-clipboard "^3.3.3" + dayjs "^1.11.1" + qrcode.react "^3.1.0" + rc-cascader "~3.20.0" + rc-checkbox "~3.1.0" + rc-collapse "~3.7.1" + rc-dialog "~9.3.4" + rc-drawer "~6.5.2" + rc-dropdown "~4.1.0" + rc-field-form "~1.40.0" + rc-image "~7.5.1" + rc-input "~1.3.6" + rc-input-number "~8.4.0" + rc-mentions "~2.9.1" + rc-menu "~9.12.2" + rc-motion "^2.9.0" + rc-notification "~5.3.0" + rc-pagination "~3.7.0" + rc-picker "~3.14.6" + rc-progress "~3.5.1" + rc-rate "~2.12.0" + rc-resize-observer "^1.4.0" + rc-segmented "~2.2.2" + rc-select "~14.10.0" + rc-slider "~10.4.0" + rc-steps "~6.0.1" + rc-switch "~4.1.0" + rc-table "~7.36.0" + rc-tabs "~12.13.1" + rc-textarea "~1.5.3" + rc-tooltip "~6.1.2" + rc-tree "~5.8.2" + rc-tree-select "~5.15.0" + rc-upload "~4.3.5" + rc-util "^5.38.1" + scroll-into-view-if-needed "^3.1.0" + throttle-debounce "^5.0.0" + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -3523,6 +4259,11 @@ append-field@^1.0.0: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +arch@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -3574,6 +4315,28 @@ argv-formatter@~1.0.0: resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" integrity sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw== +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +aria-query@^5.1.3: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3589,6 +4352,17 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== +array-includes@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + array-index@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" @@ -3597,6 +4371,11 @@ array-index@^1.0.0: debug "^2.2.0" es6-symbol "^3.0.2" +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -3607,6 +4386,50 @@ array-union@^3.0.1: resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3626,6 +4449,11 @@ asn1js@^3.0.1, asn1js@^3.0.5: pvutils "^1.1.3" tslib "^2.4.0" +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + async-retry@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" @@ -3633,10 +4461,22 @@ async-retry@^1.3.3: dependencies: retry "0.13.1" +async-validator@^4.1.0: + version "4.2.5" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" + integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== + +async@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== asynckit@^0.4.0: version "0.4.0" @@ -3648,11 +4488,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - autoprefixer@^10.4.9: version "10.4.16" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" @@ -3670,15 +4505,27 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +axe-core@^4.6.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" + integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== + axios@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" - integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" proxy-from-env "^1.1.0" +axobject-query@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + b64-lite@^1.3.1, b64-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/b64-lite/-/b64-lite-1.4.0.tgz#e62442de11f1f21c60e38b74f111ac0242283d3d" @@ -3693,7 +4540,7 @@ b64u-lite@^1.0.1: dependencies: b64-lite "^1.4.0" -babel-jest@^29.7.0: +babel-jest@^29.4.1, babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== @@ -3763,12 +4610,12 @@ babel-plugin-polyfill-corejs2@^0.4.6: semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz#a75fa1b0c3fc5bd6837f9ec465c0f48031b8cab1" - integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== + version "0.8.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" + integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.3" - core-js-compat "^3.32.2" + core-js-compat "^3.33.1" babel-plugin-polyfill-regenerator@^0.5.3: version "0.5.3" @@ -3825,6 +4672,13 @@ base64-js@*, base64-js@^1.3.0, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +basic-auth@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -3836,9 +4690,9 @@ before-after-hook@^2.2.0: integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== big-integer@^1.6.51: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== big.js@^5.2.2: version "5.2.2" @@ -3850,6 +4704,14 @@ bignumber.js@^9.0.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== +bin-check@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" + integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA== + dependencies: + execa "^0.7.0" + executable "^4.1.0" + bin-links@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.3.tgz#9e4a3c5900830aee3d7f52178b65e01dcdde64a5" @@ -3860,6 +4722,23 @@ bin-links@^4.0.1: read-cmd-shim "^4.0.0" write-file-atomic "^5.0.0" +bin-version-check@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-5.1.0.tgz#788e80e036a87313f8be7908bc20e5abe43f0837" + integrity sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g== + dependencies: + bin-version "^6.0.0" + semver "^7.5.3" + semver-truncate "^3.0.0" + +bin-version@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-6.0.0.tgz#08ecbe5fc87898b441425e145f9e105064d00315" + integrity sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw== + dependencies: + execa "^5.0.0" + find-versions "^5.0.0" + binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -4039,6 +4918,30 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + cacache@^17.0.0, cacache@^17.0.4, cacache@^17.1.3: version "17.1.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" @@ -4057,6 +4960,11 @@ cacache@^17.0.0, cacache@^17.0.4, cacache@^17.1.3: tar "^6.1.11" unique-filename "^3.0.0" +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + cacheable-lookup@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" @@ -4075,7 +4983,20 @@ cacheable-request@^10.2.8: normalize-url "^8.0.0" responselike "^3.0.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4: +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== @@ -4119,9 +5040,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001553" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz#e64e7dc8fd4885cd246bb476471420beb5e474b5" - integrity sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A== + version "1.0.30001565" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz#a528b253c8a2d95d2b415e11d8b9942acc100c4f" + integrity sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w== canonicalize@^1.0.1: version "1.0.8" @@ -4163,7 +5084,7 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.1, chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -4219,6 +5140,11 @@ class-validator@0.14.0, class-validator@^0.14.0: libphonenumber-js "^1.10.14" validator "^13.7.0" +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -4259,9 +5185,9 @@ cli-spinners@2.6.1: integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== cli-spinners@^2.5.0: - version "2.9.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" - integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-table3@^0.6.3: version "0.6.3" @@ -4290,6 +5216,13 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + clone@2.x: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" @@ -4312,6 +5245,11 @@ cloudevents@^7.0.0: util "^0.12.4" uuid "^8.3.2" +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + cmd-shim@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.2.tgz#435fd9e5c95340e61715e19f90209ed6fcd9e0a4" @@ -4361,7 +5299,7 @@ colord@^2.9.1: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10: +colorette@^2.0.10, colorette@^2.0.19: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -4386,7 +5324,7 @@ commander@^2.15.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^7.2.0: +commander@^7.1.0, commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -4434,6 +5372,11 @@ compression@^1.7.4: safe-buffer "5.1.2" vary "~1.1.2" +compute-scroll-into-view@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" + integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -4492,7 +5435,7 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -content-disposition@0.5.4: +content-disposition@0.5.4, content-disposition@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -4648,6 +5591,13 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" +copy-to-clipboard@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + copy-webpack-plugin@^10.2.4: version "10.2.4" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" @@ -4660,13 +5610,18 @@ copy-webpack-plugin@^10.2.4: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.31.0, core-js-compat@^3.32.2: - version "3.33.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.1.tgz#debe80464107d75419e00c2ee29f35982118ff84" - integrity sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ== +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.33.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.3.tgz#ec678b772c5a2d8a7c60a91c3a81869aa704ae01" + integrity sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow== dependencies: browserslist "^4.22.1" +core-js-pure@^3.23.3: + version "3.33.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.3.tgz#cbf9180ac4c4653823d784862bfb5c77eac0bf98" + integrity sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -4680,6 +5635,11 @@ cors@2.8.5: object-assign "^4" vary "^1" +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -4702,7 +5662,7 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^8.0.0: +cosmiconfig@^8.0.0, cosmiconfig@^8.1.3: version "8.3.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== @@ -4742,6 +5702,15 @@ cross-fetch@^4.0.0: dependencies: node-fetch "^2.6.12" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4777,111 +5746,131 @@ css-loader@^6.4.0: postcss-value-parser "^4.2.0" semver "^7.3.8" -css-minimizer-webpack-plugin@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" - integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== +css-minimizer-webpack-plugin@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz#33effe662edb1a0bf08ad633c32fa75d0f7ec565" + integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - postcss "^8.3.5" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + cssnano "^6.0.1" + jest-worker "^29.4.3" + postcss "^8.4.24" + schema-utils "^4.0.1" + serialize-javascript "^6.0.1" -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" nth-check "^2.0.1" -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== +css-tree@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" + mdn-data "2.0.30" + source-map-js "^1.0.1" -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -css@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" - integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== dependencies: - inherits "^2.0.4" - source-map "^0.6.1" - source-map-resolve "^0.6.0" + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== +cssnano-preset-default@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz#2a93247140d214ddb9f46bc6a3562fa9177fe301" + integrity sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ== dependencies: css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + cssnano-utils "^4.0.0" + postcss-calc "^9.0.0" + postcss-colormin "^6.0.0" + postcss-convert-values "^6.0.0" + postcss-discard-comments "^6.0.0" + postcss-discard-duplicates "^6.0.0" + postcss-discard-empty "^6.0.0" + postcss-discard-overridden "^6.0.0" + postcss-merge-longhand "^6.0.0" + postcss-merge-rules "^6.0.1" + postcss-minify-font-values "^6.0.0" + postcss-minify-gradients "^6.0.0" + postcss-minify-params "^6.0.0" + postcss-minify-selectors "^6.0.0" + postcss-normalize-charset "^6.0.0" + postcss-normalize-display-values "^6.0.0" + postcss-normalize-positions "^6.0.0" + postcss-normalize-repeat-style "^6.0.0" + postcss-normalize-string "^6.0.0" + postcss-normalize-timing-functions "^6.0.0" + postcss-normalize-unicode "^6.0.0" + postcss-normalize-url "^6.0.0" + postcss-normalize-whitespace "^6.0.0" + postcss-ordered-values "^6.0.0" + postcss-reduce-initial "^6.0.0" + postcss-reduce-transforms "^6.0.0" + postcss-svgo "^6.0.0" + postcss-unique-selectors "^6.0.0" + +cssnano-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.0.tgz#d1da885ec04003ab19505ff0e62e029708d36b08" + integrity sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw== -cssnano@^5.0.6: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== +cssnano@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.1.tgz#87c38c4cd47049c735ab756d7e77ac3ca855c008" + integrity sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg== dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" + cssnano-preset-default "^6.0.1" + lilconfig "^2.1.0" -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== +csso@5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: - css-tree "^1.1.2" + cssom "~0.3.6" + +csstype@^3.0.10, csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== d@1, d@^1.0.1: version "1.0.1" @@ -4891,6 +5880,11 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -4901,6 +5895,15 @@ data-uri-to-buffer@^3.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + date-fns@^2.30.0: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -4913,6 +5916,11 @@ dateformat@^3.0.0, dateformat@^3.0.3: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +dayjs@^1.11.1: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -4927,20 +5935,13 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, d dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.6: +debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -4954,7 +5955,12 @@ decamelize@^1.1.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -4971,6 +5977,30 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -4981,7 +6011,7 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.2.2: +deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -5000,12 +6030,12 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^2.0.1: +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-data-property@^1.1.1: +define-data-property@^1.0.1, define-data-property@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== @@ -5019,6 +6049,15 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5044,6 +6083,11 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -5064,6 +6108,14 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +detect-port@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + did-resolver@^4.0.0, did-resolver@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-4.1.0.tgz#740852083c4fd5bf9729d528eca5d105aff45eb6" @@ -5103,6 +6155,13 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -5110,35 +6169,55 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: - domelementtype "^2.2.0" + webidl-conversions "^7.0.0" -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" dot-prop@^5.1.0: version "5.3.0" @@ -5147,7 +6226,7 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -dotenv-expand@10.0.0: +dotenv-expand@10.0.0, dotenv-expand@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== @@ -5157,10 +6236,10 @@ dotenv@16.1.4: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.1.4.tgz#67ac1a10cd9c25f5ba604e4e08bc77c0ebe0ca8c" integrity sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw== -dotenv@~10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dotenv@~16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== duplexer2@~0.1.0: version "0.1.4" @@ -5192,9 +6271,9 @@ ejs@^3.1.7: jake "^10.8.5" electron-to-chromium@^1.4.535: - version "1.4.563" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz#dabb424202754c1fed2d2938ff564b23d3bbf0d3" - integrity sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw== + version "1.4.594" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.594.tgz#f69f207fba80735a44a988df42f3f439115d0515" + integrity sha512-xT1HVAu5xFn7bDfkjGQi9dNpMqGchUkebwf1GL7cZN32NSwwlHRPMSDJ1KN6HkS0bWUtndbSQZqvpQftKG2uFQ== emittery@^0.13.1: version "0.13.1" @@ -5228,7 +6307,7 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.4.1: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5250,10 +6329,10 @@ enquirer@~2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== env-ci@^9.0.0: version "9.1.1" @@ -5287,10 +6366,102 @@ error-ex@^1.3.1, error-ex@^1.3.2: dependencies: is-arrayish "^0.2.1" +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-module-lexer@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" - integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.62" @@ -5348,11 +6519,81 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz#4ef1eaf97afe5176e6a75ddfb57c335121abc5a6" integrity sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw== +eslint-import-resolver-node@^0.3.7: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@2.27.5: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsx-a11y@6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + eslint-plugin-prettier@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" @@ -5360,6 +6601,32 @@ eslint-plugin-prettier@^4.2.1: dependencies: prettier-linter-helpers "^1.0.0" +eslint-plugin-react-hooks@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@7.32.2: + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -5388,7 +6655,7 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== @@ -5434,7 +6701,7 @@ eslint@~8.15.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^9.3.2, espree@^9.4.0: +espree@^9.0.0, espree@^9.3.2, espree@^9.4.0: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== @@ -5443,7 +6710,7 @@ espree@^9.3.2, espree@^9.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -5467,7 +6734,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -5497,6 +6764,19 @@ events@^3.2.0, events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -5542,6 +6822,13 @@ execa@^8.0.0: signal-exit "^4.1.0" strip-final-newline "^3.0.0" +executable@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -5618,6 +6905,21 @@ express@4.18.2, express@^4.17.1, express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" +ext-list@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" + integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== + dependencies: + mime-db "^1.28.0" + +ext-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" + integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== + dependencies: + ext-list "^2.0.0" + sort-keys-length "^1.0.0" + ext@^1.1.2: version "1.7.0" resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" @@ -5646,10 +6948,10 @@ fast-glob@3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.12, fast-glob@^3.2.5, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== +fast-glob@^3.2.12, fast-glob@^3.2.5, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5757,6 +7059,15 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-type@^17.1.6: + version "17.1.6" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-17.1.6.tgz#18669e0577a4849ef6e73a41f8bdf1ab5ae21023" + integrity sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw== + dependencies: + readable-web-to-node-stream "^3.0.2" + strtok3 "^7.0.0-alpha.9" + token-types "^5.0.0-alpha.2" + filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -5764,6 +7075,20 @@ filelist@^1.0.4: dependencies: minimatch "^5.0.1" +filename-reserved-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz#3d5dd6d4e2d73a3fed2ebc4cd0b3448869a081f7" + integrity sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw== + +filenamify@^5.0.2: + version "5.1.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-5.1.1.tgz#a1ccc5ae678a5e34f578afcb9b72898264d166d2" + integrity sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA== + dependencies: + filename-reserved-regex "^3.0.0" + strip-outer "^2.0.0" + trim-repeated "^2.0.0" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -5812,6 +7137,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0, find-up@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-up@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" @@ -5820,15 +7153,7 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" -find-up@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-versions@^5.1.0: +find-versions@^5.0.0, find-versions@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-5.1.0.tgz#973f6739ce20f5e439a27eba8542a4b236c8e685" integrity sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg== @@ -5836,9 +7161,9 @@ find-versions@^5.1.0: semver-regex "^4.0.5" flat-cache@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" - integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" keyv "^4.5.3" @@ -5978,7 +7303,7 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== @@ -6012,11 +7337,26 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gauge@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" @@ -6070,7 +7410,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== @@ -6095,6 +7435,18 @@ get-pkg-repo@^4.0.0: through2 "^2.0.0" yargs "^16.2.0" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -6110,6 +7462,14 @@ get-stream@^8.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-symbol-from-current-process-h@^1.0.1, get-symbol-from-current-process-h@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-from-current-process-h/-/get-symbol-from-current-process-h-1.0.2.tgz#510af52eaef873f7028854c3377f47f7bb200265" @@ -6222,6 +7582,17 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -6234,7 +7605,14 @@ globals@^13.19.0, globals@^13.6.0: dependencies: type-fest "^0.20.2" -globby@^11.0.0, globby@^11.1.0: +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6258,16 +7636,17 @@ globby@^12.0.2: merge2 "^1.4.1" slash "^4.0.0" -globby@^13.1.4: - version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== +globby@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.0.tgz#ea9c062a3614e33f516804e778590fcf055256b9" + integrity sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ== dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" + "@sindresorhus/merge-streams" "^1.0.0" + fast-glob "^3.3.2" ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" + path-type "^5.0.0" + slash "^5.1.0" + unicorn-magic "^0.1.0" gopd@^1.0.1: version "1.0.1" @@ -6276,6 +7655,23 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@^13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/got/-/got-13.0.0.tgz#a2402862cef27a5d0d1b07c0fb25d12b58175422" @@ -6335,6 +7731,11 @@ harmony-reflect@^1.4.6: resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6374,6 +7775,11 @@ has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== +has@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + hasown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" @@ -6381,6 +7787,11 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hook-std@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-3.0.0.tgz#47038a01981e07ce9d83a6a3b2eb98cad0f7bd58" @@ -6427,7 +7838,14 @@ hpagent@^1.0.0: resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-1.2.0.tgz#0ae417895430eb3770c03443456b8d90ca464903" integrity sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA== -html-entities@^2.3.2: +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-entities@^2.1.0, html-entities@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== @@ -6437,7 +7855,7 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-cache-semantics@^4.1.1: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -6510,15 +7928,42 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-server@^14.1.0: + version "14.1.1" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" + integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== + dependencies: + basic-auth "^2.0.1" + chalk "^4.1.2" + corser "^2.0.1" + he "^1.2.0" + html-encoding-sniffer "^3.0.0" + http-proxy "^1.18.1" + mime "^1.6.0" + minimist "^1.2.6" + opener "^1.5.1" + portfinder "^1.0.28" + secure-compare "3.0.1" + union "~0.5.0" + url-join "^4.0.1" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + http2-wrapper@^2.1.10: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" - integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: quick-lru "^5.1.1" resolve-alpn "^1.2.0" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6563,7 +8008,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -6595,9 +8040,9 @@ ignore-walk@^6.0.0: minimatch "^9.0.0" ignore@^5.0.4, ignore@^5.1.9, ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== image-size@~0.5.0: version "0.5.5" @@ -6645,6 +8090,11 @@ indent-string@^5.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -6686,6 +8136,15 @@ init-package-json@^5.0.0: validate-npm-package-license "^3.0.4" validate-npm-package-name "^5.0.0" +internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + into-stream@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-7.0.0.tgz#d1a211e146be8acfdb84dabcbf00fe8205e72936" @@ -6721,7 +8180,7 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -6729,11 +8188,27 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -6741,7 +8216,15 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-callable@^1.1.3: +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -6753,13 +8236,20 @@ is-cidr@^4.0.2: dependencies: cidr-regex "^3.1.1" -is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -6804,6 +8294,23 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -6814,7 +8321,7 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== @@ -6824,10 +8331,35 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" @@ -6839,6 +8371,20 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -6853,7 +8399,7 @@ is-text-path@^2.0.0: dependencies: text-extensions "^2.0.0" -is-typed-array@^1.1.3: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -6870,6 +8416,26 @@ is-unicode-supported@^1.2.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -6882,6 +8448,11 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -6927,9 +8498,9 @@ issue-parser@^6.0.0: lodash.uniqby "^4.7.0" istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" @@ -7088,7 +8659,7 @@ jest-config@^29.4.1, jest-config@^29.7.0: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.7.0: +jest-diff@^29.4.1, jest-diff@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== @@ -7114,7 +8685,21 @@ jest-each@^29.7.0: chalk "^4.0.0" jest-get-type "^29.6.3" jest-util "^29.7.0" - pretty-format "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.4.1: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" jest-environment-node@^29.4.1, jest-environment-node@^29.7.0: version "29.7.0" @@ -7346,7 +8931,7 @@ jest-watcher@^29.7.0: jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^27.0.2, jest-worker@^27.4.5: +jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -7355,7 +8940,7 @@ jest-worker@^27.0.2, jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.7.0: +jest-worker@^29.4.3, jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== @@ -7406,6 +8991,38 @@ js-yaml@^3.10.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -7475,11 +9092,35 @@ json-text-sequence@~0.3.0: dependencies: "@sovpro/delimited-stream" "^1.1.0" +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== + dependencies: + string-convert "^0.2.0" + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-eslint-parser@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz#74ded53f9d716e8d0671bd167bf5391f452d5461" + integrity sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg== + dependencies: + acorn "^8.5.0" + eslint-visitor-keys "^3.0.0" + espree "^9.0.0" + semver "^7.3.5" + jsonc-parser@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" @@ -7499,6 +9140,16 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + just-diff-apply@^5.2.0: version "5.5.0" resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" @@ -7509,7 +9160,7 @@ just-diff@^6.0.0: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== -keyv@^4.5.3: +keyv@^4.0.0, keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -7544,6 +9195,18 @@ ky@^0.25.1: resolved "https://registry.yarnpkg.com/ky/-/ky-0.25.1.tgz#0df0bd872a9cc57e31acd5dbc1443547c881bfbc" integrity sha512-PjpCEWlIU7VpiMVrTwssahkYXX1by6NCT0fhTUX34F3DTinARlgMpriuroolugFPcMgpPWrOW4mTb984Qm1RXA== +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + launch-editor@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" @@ -7662,10 +9325,10 @@ libnpmpack@^5.0.20: npm-package-arg "^10.1.0" pacote "^15.0.8" -libnpmpublish@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.5.0.tgz#a118c8fdc680947c960648ed8b4c94d15e42e0ab" - integrity sha512-zctH6QcTJ093lpxmkufr2zr3AJ9V90hcRilDFNin6n91ODj+S28RdyMFFJpa9NwyztmyV2hlWLyZv0GaOQBDyA== +libnpmpublish@^7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.5.1.tgz#80f0b5d30210156af7a1b98b1a7bff06bd868684" + integrity sha512-z/7HYMtuRrNgcftrI9ILXezZWHYHG0RaIZFfUvcLktE75vrScE3zOO+qvAbvQodQi4YvYoOGF1ySQ8tdbDCYQQ== dependencies: ci-info "^3.6.1" normalize-package-data "^5.0.0" @@ -7703,9 +9366,9 @@ libnpmversion@^4.0.2: semver "^7.3.7" libphonenumber-js@^1.10.14: - version "1.10.48" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.48.tgz#3c426b4aa21dfe3210bfbda47d208acffa3631bf" - integrity sha512-Vvcgt4+o8+puIBJZLdMshPYx9nRN3/kTT7HPtOyfYrSQuN9PGBF1KUv0g07fjNzt4E4GuA7FnsLb+WeAMzyRQg== + version "1.10.51" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.51.tgz#a3b8c15db2721c3e5f7fe6759e2a524712b578e6" + integrity sha512-vY2I+rQwrDQzoPds0JeTEpeWzbUJgqoV0O4v31PauHBb/e+1KCXKylHcDnBMgJZ9fH9mErsEbROJY3Z3JtqEmg== license-webpack-plugin@^4.0.2: version "4.0.2" @@ -7714,7 +9377,7 @@ license-webpack-plugin@^4.0.2: dependencies: webpack-sources "^3.0.0" -lilconfig@^2.0.3: +lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== @@ -7725,9 +9388,9 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lines-and-columns@^2.0.3, lines-and-columns@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" - integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + version "2.0.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" + integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== load-json-file@^4.0.0: version "4.0.0" @@ -7744,7 +9407,7 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0, loader-utils@^2.0.3: +loader-utils@^2.0.0, loader-utils@^2.0.3, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -7837,12 +9500,12 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== -lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4: +lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.1.0: +log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -7850,22 +9513,42 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lowercase-keys@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" lru-cache@^5.1.1: version "5.1.1" @@ -7892,9 +9575,14 @@ lru_map@^0.4.1: integrity sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg== luxon@^3.3.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.3.tgz#8ddf0358a9492267ffec6a13675fbaab5551315d" - integrity sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg== + version "3.4.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" + integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@0.30.0: version "0.30.0" @@ -7930,7 +9618,29 @@ make-error@1.x, make-error@^1.1.1, make-error@^1.3.6: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, make-fetch-happen@^11.1.1: +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== @@ -7985,10 +9695,15 @@ marked@^5.0.0: resolved "https://registry.yarnpkg.com/marked/-/marked-5.1.2.tgz#62b5ccfc75adf72ca3b64b2879b551d89e77677f" integrity sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg== -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== media-typer@0.3.0: version "0.3.0" @@ -8052,7 +9767,7 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -8064,7 +9779,7 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, dependencies: mime-db "1.52.0" -mime@1.6.0, mime@^1.4.1: +mime@1.6.0, mime@^1.4.1, mime@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -8084,6 +9799,11 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -8160,6 +9880,17 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-fetch@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" @@ -8200,7 +9931,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0: +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -8225,18 +9956,37 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^0.5.4: +mkdirp@^0.5.4, mkdirp@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@~1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mobx-react-lite@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-4.0.5.tgz#e2cb98f813e118917bcc463638f5bf6ea053a67b" + integrity sha512-StfB2wxE8imKj1f6T8WWPf4lVMx3cYH9Iy60bbKXEs21+HQ4tvvfIBZfSmMXgQAefi8xYEwQIz4GN9s0d2h7dg== + dependencies: + use-sync-external-store "^1.2.0" + +mobx-react@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-9.1.0.tgz#5e54919ca27ffad5f2c0d835148a1f681cebdbc1" + integrity sha512-DeDRTYw4AlgHw8xEXtiZdKKEnp+c5/jeUgTbTQXEqnAzfkrgYRWP3p3Nv3Whc2CEcM/mDycbDWGjxKokQdlffg== + dependencies: + mobx-react-lite "^4.0.4" + +mobx@^6.10.2: + version "6.12.0" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.12.0.tgz#72b2685ca5af031aaa49e77a4d76ed67fcbf9135" + integrity sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ== + modify-values@^1.0.0, modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -8289,14 +10039,14 @@ mute-stream@~1.0.0: integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nats@^2.14.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nats/-/nats-2.17.0.tgz#1f6ffa5d89bb8ea4549e205f42601dbf66c4561e" - integrity sha512-749TtweWL6bc9R9yNra4a+tuk8J0bqurxcPV/9R2D+WPTplY4PPde/LPSXspqR/eCCTxiM80/AjVlfboEafRxA== + version "2.18.0" + resolved "https://registry.yarnpkg.com/nats/-/nats-2.18.0.tgz#a82b263ed71be0f8518af4313e2339055e5d946b" + integrity sha512-zZF004ejzf67Za0Tva+xphxoxBMNc5IMLqbZ7Ho0j9TMuisjpo+qCd1EktXRCLNxmrZ8O6Tbm1dBsZYNF6yR1A== dependencies: nkeys.js "1.0.5" @@ -8346,6 +10096,14 @@ nkeys.js@1.0.5: dependencies: tweetnacl "1.0.3" +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-abort-controller@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" @@ -8391,20 +10149,20 @@ node-forge@^1: integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-gyp-build@^4.2.1, node-gyp-build@^4.3.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" - integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== + version "4.7.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.7.1.tgz#cd7d2eb48e594874053150a9418ac85af83ca8f7" + integrity sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg== node-gyp@^9.0.0, node-gyp@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" - integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^11.0.3" + make-fetch-happen "^10.0.3" nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" @@ -8417,6 +10175,11 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-machine-id@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" + integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== + node-releases@^2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" @@ -8503,6 +10266,11 @@ normalize-url@^8.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== +normalize.css@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" + integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== + npm-audit-report@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-5.0.0.tgz#83ac14aeff249484bde81eff53c3771d5048cf95" @@ -8527,6 +10295,16 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== +npm-package-arg@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.1.tgz#f208b0022c29240a1c532a449bdde3f0a4708ebc" + integrity sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" @@ -8575,6 +10353,13 @@ npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3, npm-registry-fetch@^14.0 npm-package-arg "^10.0.0" proc-log "^3.0.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -8595,9 +10380,9 @@ npm-user-validate@^2.0.0: integrity sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q== npm@^9.5.0: - version "9.9.0" - resolved "https://registry.yarnpkg.com/npm/-/npm-9.9.0.tgz#ea4ecdbdf85dc4cedf9365f6d201990100430bb5" - integrity sha512-wkd7sjz4KmdmddYQcd0aTP73P1cEuPlekeulz4jTDeMVx/Zo5XZ5KQ1z3eUzV3Q/WZpEO0NJXTrD5FNFe6fhCA== + version "9.9.2" + resolved "https://registry.yarnpkg.com/npm/-/npm-9.9.2.tgz#28133f81643bce36c1c8bcb57b51e1ee53583df7" + integrity sha512-D3tV+W0PzJOlwo8YmO6fNzaB1CrMVYd1V+2TURF6lbCbmZKqMsYgeQfPVvqiM3zbNSJPhFEnmlEXIogH2Vq7PQ== dependencies: "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/arborist" "^6.5.0" @@ -8631,7 +10416,7 @@ npm@^9.5.0: libnpmhook "^9.0.3" libnpmorg "^5.0.4" libnpmpack "^5.0.20" - libnpmpublish "^7.5.0" + libnpmpublish "^7.5.1" libnpmsearch "^6.0.2" libnpmteam "^5.0.3" libnpmversion "^4.0.2" @@ -8712,36 +10497,43 @@ null-check@^1.0.0: resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" integrity sha512-j8ZNHg19TyIQOWCGeeQJBuu6xZYIEurf8M1Qsfd8mFrGEfIZytbw18YjKWg+LcO25NowXGZXZpKAx+Ui3TFfDw== -nx@16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/nx/-/nx-16.0.1.tgz#d3f1f9e3e56262d8bd4876bd2126cfe4ab0fdddb" - integrity sha512-x1NUs3ZGRWI3CdY1Qt4JdB9fOpjNkfP064HI3P6YjmHYSilbkVF7xe9bxOptjwCgMlTE3kOa66qC2fI5bKvG4w== +nwsapi@^2.2.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +nx@16.10.0: + version "16.10.0" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.10.0.tgz#b070461f7de0a3d7988bd78558ea84cda3543ace" + integrity sha512-gZl4iCC0Hx0Qe1VWmO4Bkeul2nttuXdPpfnlcDKSACGu3ZIo+uySqwOF8yBAxSTIf8xe2JRhgzJN1aFkuezEBg== dependencies: - "@nrwl/tao" "16.0.1" + "@nrwl/tao" "16.10.0" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "^3.0.0-rc.18" + "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" axios "^1.0.0" chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" - cliui "^7.0.2" - dotenv "~10.0.0" + cliui "^8.0.1" + dotenv "~16.3.1" + dotenv-expand "~10.0.0" enquirer "~2.3.6" - fast-glob "3.2.7" figures "3.2.0" flat "^5.0.2" fs-extra "^11.1.0" glob "7.1.4" ignore "^5.0.4" + jest-diff "^29.4.1" js-yaml "4.1.0" jsonc-parser "3.2.0" lines-and-columns "~2.0.3" minimatch "3.0.5" + node-machine-id "1.1.12" npm-run-path "^4.0.1" open "^8.4.0" - semver "7.3.4" + semver "7.5.3" string-width "^4.2.3" strong-log-transformer "^2.1.0" tar-stream "~2.2.0" @@ -8752,15 +10544,16 @@ nx@16.0.1: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "16.0.1" - "@nx/nx-darwin-x64" "16.0.1" - "@nx/nx-linux-arm-gnueabihf" "16.0.1" - "@nx/nx-linux-arm64-gnu" "16.0.1" - "@nx/nx-linux-arm64-musl" "16.0.1" - "@nx/nx-linux-x64-gnu" "16.0.1" - "@nx/nx-linux-x64-musl" "16.0.1" - "@nx/nx-win32-arm64-msvc" "16.0.1" - "@nx/nx-win32-x64-msvc" "16.0.1" + "@nx/nx-darwin-arm64" "16.10.0" + "@nx/nx-darwin-x64" "16.10.0" + "@nx/nx-freebsd-x64" "16.10.0" + "@nx/nx-linux-arm-gnueabihf" "16.10.0" + "@nx/nx-linux-arm64-gnu" "16.10.0" + "@nx/nx-linux-arm64-musl" "16.10.0" + "@nx/nx-linux-x64-gnu" "16.10.0" + "@nx/nx-linux-x64-musl" "16.10.0" + "@nx/nx-win32-arm64-msvc" "16.10.0" + "@nx/nx-win32-x64-msvc" "16.10.0" object-assign@^4, object-assign@^4.1.1: version "4.1.1" @@ -8772,11 +10565,69 @@ object-hash@3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.10.3, object-inspect@^1.9.0: +object-inspect@^1.10.3, object-inspect@^1.13.1, object-inspect@^1.9.0: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -8794,7 +10645,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -8824,6 +10675,11 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + optionator@^0.9.1: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -8836,6 +10692,20 @@ optionator@^0.9.1: prelude-ls "^1.2.1" type-check "^0.4.0" +ora@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" + integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== + dependencies: + bl "^4.0.3" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + log-symbols "^4.0.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + ora@5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -8851,6 +10721,18 @@ ora@5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-filter-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" + integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg== + dependencies: + arch "^2.1.0" + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + p-cancelable@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" @@ -8868,6 +10750,11 @@ p-filter@^3.0.0: dependencies: p-map "^5.1.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-is-promise@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" @@ -9030,9 +10917,9 @@ parse-json@^5.0.0, parse-json@^5.2.0: lines-and-columns "^1.1.6" parse-json@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-7.1.0.tgz#4cffd0ee00ffa597b995fd70a9811993c4f95023" - integrity sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg== + version "7.1.1" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-7.1.1.tgz#68f7e6f0edf88c54ab14c00eb700b753b14e2120" + integrity sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw== dependencies: "@babel/code-frame" "^7.21.4" error-ex "^1.3.2" @@ -9064,6 +10951,13 @@ parse5@4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -9117,6 +11011,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -9162,11 +11061,21 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path-type@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" + integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== + pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== +peek-readable@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" + integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -9177,7 +11086,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.3.0: +pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -9192,7 +11101,7 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.4: +pirates@^4.0.4, pirates@^4.0.5: version "4.0.6" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== @@ -9224,51 +11133,60 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== +portfinder@^1.0.28: + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== + dependencies: + async "^2.6.4" + debug "^3.2.7" + mkdirp "^0.5.6" + +postcss-calc@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== dependencies: - postcss-selector-parser "^6.0.9" + postcss-selector-parser "^6.0.11" postcss-value-parser "^4.2.0" -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== +postcss-colormin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.0.tgz#d4250652e952e1c0aca70c66942da93d3cdeaafe" + integrity sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw== dependencies: browserslist "^4.21.4" caniuse-api "^3.0.0" colord "^2.9.1" postcss-value-parser "^4.2.0" -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== +postcss-convert-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz#ec94a954957e5c3f78f0e8f65dfcda95280b8996" + integrity sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw== dependencies: browserslist "^4.21.4" postcss-value-parser "^4.2.0" -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== +postcss-discard-comments@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz#9ca335e8b68919f301b24ba47dde226a42e535fe" + integrity sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw== -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== +postcss-discard-duplicates@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz#c26177a6c33070922e67e9a92c0fd23d443d1355" + integrity sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA== -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== +postcss-discard-empty@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz#06c1c4fce09e22d2a99e667c8550eb8a3a1b9aee" + integrity sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ== -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== +postcss-discard-overridden@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz#49c5262db14e975e349692d9024442de7cd8e234" + integrity sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw== postcss-import@~14.1.0: version "14.1.0" @@ -9288,53 +11206,53 @@ postcss-loader@^6.1.1: klona "^2.0.5" semver "^7.3.5" -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== +postcss-merge-longhand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz#6f627b27db939bce316eaa97e22400267e798d69" + integrity sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" + stylehacks "^6.0.0" -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== +postcss-merge-rules@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz#39f165746404e646c0f5c510222ccde4824a86aa" + integrity sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw== dependencies: browserslist "^4.21.4" caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" + cssnano-utils "^4.0.0" postcss-selector-parser "^6.0.5" -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== +postcss-minify-font-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz#68d4a028f9fa5f61701974724b2cc9445d8e6070" + integrity sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA== dependencies: postcss-value-parser "^4.2.0" -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== +postcss-minify-gradients@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz#22b5c88cc63091dadbad34e31ff958404d51d679" + integrity sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA== dependencies: colord "^2.9.1" - cssnano-utils "^3.1.0" + cssnano-utils "^4.0.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== +postcss-minify-params@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz#2b3a85a9e3b990d7a16866f430f5fd1d5961b539" + integrity sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ== dependencies: browserslist "^4.21.4" - cssnano-utils "^3.1.0" + cssnano-utils "^4.0.0" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== +postcss-minify-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz#5046c5e8680a586e5a0cad52cc9aa36d6be5bda2" + integrity sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g== dependencies: postcss-selector-parser "^6.0.5" @@ -9366,93 +11284,92 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== +postcss-normalize-charset@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz#36cc12457259064969fb96f84df491652a4b0975" + integrity sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ== -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== +postcss-normalize-display-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz#8d2961415078644d8c6bbbdaf9a2fdd60f546cd4" + integrity sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== +postcss-normalize-positions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz#25b96df99a69f8925f730eaee0be74416865e301" + integrity sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== +postcss-normalize-repeat-style@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz#ddf30ad8762feb5b1eb97f39f251acd7b8353299" + integrity sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== +postcss-normalize-string@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz#948282647a51e409d69dde7910f0ac2ff97cb5d8" + integrity sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== +postcss-normalize-timing-functions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz#5f13e650b8c43351989fc5de694525cc2539841c" + integrity sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== +postcss-normalize-unicode@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz#741b3310f874616bdcf07764f5503695d3604730" + integrity sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg== dependencies: browserslist "^4.21.4" postcss-value-parser "^4.2.0" -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== +postcss-normalize-url@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz#d0a31e962a16401fb7deb7754b397a323fb650b4" + integrity sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw== dependencies: - normalize-url "^6.0.1" postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== +postcss-normalize-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz#accb961caa42e25ca4179b60855b79b1f7129d4d" + integrity sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw== dependencies: postcss-value-parser "^4.2.0" -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== +postcss-ordered-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz#374704cdff25560d44061d17ba3c6308837a3218" + integrity sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg== dependencies: - cssnano-utils "^3.1.0" + cssnano-utils "^4.0.0" postcss-value-parser "^4.2.0" -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== +postcss-reduce-initial@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz#7d16e83e60e27e2fa42f56ec0b426f1da332eca7" + integrity sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA== dependencies: browserslist "^4.21.4" caniuse-api "^3.0.0" -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== +postcss-reduce-transforms@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz#28ff2601a6d9b96a2f039b3501526e1f4d584a46" + integrity sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w== dependencies: postcss-value-parser "^4.2.0" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: version "6.0.13" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== @@ -9460,18 +11377,18 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selecto cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== +postcss-svgo@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.0.tgz#7b18742d38d4505a0455bbe70d52b49f00eaf69d" + integrity sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw== dependencies: postcss-value-parser "^4.2.0" - svgo "^2.7.0" + svgo "^3.0.2" -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== +postcss-unique-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz#c94e9b0f7bffb1203894e42294b5a1b3fb34fbe1" + integrity sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw== dependencies: postcss-selector-parser "^6.0.5" @@ -9480,7 +11397,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.21: +postcss@^8.4.14, postcss@^8.4.21, postcss@^8.4.24: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -9506,6 +11423,15 @@ prettier@^2.6.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -9568,6 +11494,15 @@ promzard@^1.0.0: dependencies: read "^2.0.0" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -9596,10 +11531,28 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: version "6.0.4" @@ -9628,6 +11581,11 @@ qrcode-terminal@^0.12.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== +qrcode.react@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/qrcode.react/-/qrcode.react-3.1.0.tgz#5c91ddc0340f768316fbdb8fff2765134c2aecd8" + integrity sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q== + qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" @@ -9635,6 +11593,13 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +qs@^6.4.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + query-string@^7.0.1: version "7.1.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" @@ -9645,6 +11610,11 @@ query-string@^7.0.1: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -9677,20 +11647,369 @@ raw-body@2.5.1: resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 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" + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-cascader@~3.20.0: + version "3.20.0" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.20.0.tgz#b270f9d84ed83417ee7309ef5e56e415f1586076" + integrity sha512-lkT9EEwOcYdjZ/jvhLoXGzprK1sijT3/Tp4BLxQQcHDZkkOzzwYQC9HgmKoJz0K7CukMfgvO9KqHeBdgE+pELw== + dependencies: + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + classnames "^2.3.1" + rc-select "~14.10.0" + rc-tree "~5.8.1" + rc-util "^5.37.0" + +rc-checkbox@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.1.0.tgz#6be0d9d8de2cc96fb5e37f9036a1c3e360d0a42d" + integrity sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.3.2" + rc-util "^5.25.2" + +rc-collapse@~3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.7.1.tgz#bda1f7f80adccf3433c1c15d4d9f9ca09910c727" + integrity sha512-N/7ejyiTf3XElNJBBpxqnZBUuMsQWEOPjB2QkfNvZ/Ca54eAvJXuOD1EGbCWCk2m7v/MSxku7mRpdeaLOCd4Gg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.3.4" + rc-util "^5.27.0" + +rc-dialog@~9.3.4: + version "9.3.4" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.3.4.tgz#e0decb3d4a0dbe36524a67ed2f8fe2daa4b7b73c" + integrity sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.0.0-8" + classnames "^2.2.6" + rc-motion "^2.3.0" + rc-util "^5.21.0" + +rc-drawer@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-6.5.2.tgz#49c1f279261992f6d4653d32a03b14acd436d610" + integrity sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.1.1" + classnames "^2.2.6" + rc-motion "^2.6.1" + rc-util "^5.36.0" + +rc-dropdown@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.1.0.tgz#418a68939631520de80d0865d02b440eeeb4168e" + integrity sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw== + dependencies: + "@babel/runtime" "^7.18.3" + "@rc-component/trigger" "^1.7.0" + classnames "^2.2.6" + rc-util "^5.17.0" + +rc-field-form@~1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.40.0.tgz#808dce06ebae1c3aea574e672b673533fc98f11f" + integrity sha512-OM3N01X2BYFGJDJcwpk9/BBtlwgveE7eh2SQAKIxVCt9KVWlODYJ9ypTHQdxchfDbeJKJKxMBFXlLAmyvlgPHg== + dependencies: + "@babel/runtime" "^7.18.0" + async-validator "^4.1.0" + rc-util "^5.32.2" + +rc-image@~7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-7.5.1.tgz#39a93354e14fe3e5eaafd9c9464e8fe3c6c171a0" + integrity sha512-Z9loECh92SQp0nSipc0MBuf5+yVC05H/pzC+Nf8xw1BKDFUJzUeehYBjaWlxly8VGBZJcTHYri61Fz9ng1G3Ag== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/portal" "^1.0.2" + classnames "^2.2.6" + rc-dialog "~9.3.4" + rc-motion "^2.6.2" + rc-util "^5.34.1" + +rc-input-number@~8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-8.4.0.tgz#f0d0caa2ce3a4e37f062556f9cb4c08c8c23322d" + integrity sha512-B6rziPOLRmeP7kcS5qbdC5hXvvDHYKV4vUxmahevYx2E6crS2bRi0xLDjhJ0E1HtOWo8rTmaE2EBJAkTCZOLdA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/mini-decimal" "^1.0.1" + classnames "^2.2.5" + rc-input "~1.3.5" + rc-util "^5.28.0" + +rc-input@~1.3.5, rc-input@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.3.6.tgz#038b74779b6c8b688ff60a41c3976d1db7a1d7d6" + integrity sha512-/HjTaKi8/Ts4zNbYaB5oWCquxFyFQO4Co1MnMgoCeGJlpe7k8Eir2HN0a0F9IHDmmo+GYiGgPpz7w/d/krzsJA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.18.1" + +rc-mentions@~2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.9.1.tgz#cfe55913fd5bc156ef9814f38c1a2ceefee032ce" + integrity sha512-cZuElWr/5Ws0PXx1uxobxfYh4mqUw2FitfabR62YnWgm+WAfDyXZXqZg5DxXW+M1cgVvntrQgDDd9LrihrXzew== + dependencies: + "@babel/runtime" "^7.22.5" + "@rc-component/trigger" "^1.5.0" + classnames "^2.2.6" + rc-input "~1.3.5" + rc-menu "~9.12.0" + rc-textarea "~1.5.0" + rc-util "^5.34.1" + +rc-menu@~9.12.0, rc-menu@~9.12.2: + version "9.12.2" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.12.2.tgz#1bab34646421224eff5c5b7de993f8ea1238418e" + integrity sha512-NzloFH2pRUYmQ3S/YbJAvRkgCZaLvq0sRa5rgJtuIHLfPPprNHNyepeSlT64+dbVqI4qRWL44VN0lUCldCbbfg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.17.0" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.3.1" + rc-util "^5.27.0" + +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1, rc-motion@^2.6.2, rc-motion@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.9.0.tgz#9e18a1b8d61e528a97369cf9a7601e9b29205710" + integrity sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.21.0" + +rc-notification@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.3.0.tgz#e31c86fe2350598ade8cff383babd1befa7a94fe" + integrity sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.9.0" + rc-util "^5.20.1" + +rc-overflow@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.3.2.tgz#72ee49e85a1308d8d4e3bd53285dc1f3e0bcce2c" + integrity sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.37.0" + +rc-pagination@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.7.0.tgz#4c4332800688ec0fd3b2435c4772f7f8d4d7b50e" + integrity sha512-IxSzKapd13L91/195o1TPkKnCNw8gIR25UP1GCW/7c7n/slhld4npu2j2PB9IWjXm4SssaAaSAt2lscYog7wzg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.32.2" + +rc-picker@~3.14.6: + version "3.14.6" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-3.14.6.tgz#60fc34f9883272e10f6c593fa6d82e7e7a70781b" + integrity sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "^2.2.1" + rc-util "^5.30.0" + +rc-progress@~3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.5.1.tgz#a3cdfd2fe04eb5c3d43fa1c69e7dd70c73b102ae" + integrity sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.16.1" + +rc-rate@~2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.12.0.tgz#0182deffed3b009cdcc61660da8746c39ed91ed5" + integrity sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.3.1, rc-resize-observer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz#7bba61e6b3c604834980647cce6451914750d0cc" + integrity sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q== + dependencies: + "@babel/runtime" "^7.20.7" + classnames "^2.2.1" + rc-util "^5.38.0" + resize-observer-polyfill "^1.5.1" + +rc-segmented@~2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.2.2.tgz#a34f12ce6c0975fc3042ae7656bcd18e1744798e" + integrity sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-motion "^2.4.4" + rc-util "^5.17.0" + +rc-select@~14.10.0: + version "14.10.0" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.10.0.tgz#5f60e61ed7c9a83c8591616b1174a1c4ab2de0cd" + integrity sha512-TsIJTYafTTapCA32LLNpx/AD6ntepR1TG8jEVx35NiAAWCPymhUfuca8kRcUNd3WIGVMDcMKn9kkphoxEz+6Ag== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "2.x" + rc-motion "^2.0.1" + rc-overflow "^1.3.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.2" + +rc-slider@~10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.4.0.tgz#efc016583fdea5f5dfb4f3dc61b6755a19e5f453" + integrity sha512-ZlpWjFhOlEf0w4Ng31avFBkXNNBj60NAcTPaIoiCxBkJ29wOtHSPMqv9PZeEoqmx64bpJkgK7kPa47HG4LPzww== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.27.0" + +rc-steps@~6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-6.0.1.tgz#c2136cd0087733f6d509209a84a5c80dc29a274d" + integrity sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g== + dependencies: + "@babel/runtime" "^7.16.7" + classnames "^2.2.3" + rc-util "^5.16.1" -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== +rc-switch@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-4.1.0.tgz#f37d81b4e0c5afd1274fd85367b17306bf25e7d7" + integrity sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg== dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" + "@babel/runtime" "^7.21.0" + classnames "^2.2.1" + rc-util "^5.30.0" + +rc-table@~7.36.0: + version "7.36.0" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.36.0.tgz#95e50805392b6a723105c3eb77eefb1e14ba1ced" + integrity sha512-3xVcdCC5OLeOOhaCg+5Lps2oPreM/GWXmUXWTSX4p6vF7F76ABM4dfPpMJ9Dnf5yGRyh+8pe7FRyhRVnWw2H/w== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/context" "^1.4.0" + classnames "^2.2.5" + rc-resize-observer "^1.1.0" + rc-util "^5.37.0" + rc-virtual-list "^3.11.1" + +rc-tabs@~12.13.1: + version "12.13.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-12.13.1.tgz#e28c5652dfed4e72eb27a75a2691754afd3e5f68" + integrity sha512-83u3l2QkO0UznCzdBLEk9WnNcT+imtmDmMT993sUUEOGnNQAmqOdev0XjeqrcvsAMe9CDpAWDFd7L/RZw+LVJQ== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "2.x" + rc-dropdown "~4.1.0" + rc-menu "~9.12.0" + rc-motion "^2.6.2" + rc-resize-observer "^1.0.0" + rc-util "^5.34.1" + +rc-textarea@~1.5.0, rc-textarea@~1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.5.3.tgz#513e837d308584996c05f540f4f58645a3a8c89a" + integrity sha512-oH682ghHx++stFNYrosPRBfwsypywrTXpaD0/5Z8MPkUOnyOQUaY9ueL9tMu6BP1LfsuYQ1VLpg5OtshViLNgA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-input "~1.3.5" + rc-resize-observer "^1.0.0" + rc-util "^5.27.0" + +rc-tooltip@~6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.1.2.tgz#33923ecfb2cf24347975093cbd0b048ab33c9567" + integrity sha512-89zwvybvCxGJu3+gGF8w5AXd4HHk6hIN7K0vZbkzjilVaEAIWPqc1fcyeUeP71n3VCcw7pTL9LyFupFbrx8gHw== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/trigger" "^1.18.0" + classnames "^2.3.1" + +rc-tree-select@~5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.15.0.tgz#8591f1dd28b043dde6fa1ca30c7acb198b160a42" + integrity sha512-YJHfdO6azFnR0/JuNBZLDptGE4/RGfVeHAafUIYcm2T3RBkL1O8aVqiHvwIyLzdK59ry0NLrByd+3TkfpRM+9Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "~14.10.0" + rc-tree "~5.8.1" + rc-util "^5.16.1" + +rc-tree@~5.8.1, rc-tree@~5.8.2: + version "5.8.2" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.8.2.tgz#ed3a3f7c56597bbeab3303407a9e1739bbf15621" + integrity sha512-xH/fcgLHWTLmrSuNphU8XAqV7CdaOQgm4KywlLGNoTMhDAcNR3GVNP6cZzb0GrKmIZ9yae+QLot/cAgUdPRMzg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.1" + +rc-upload@~4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.5.tgz#12fc69b2af74d08646a104828831bcaf44076eda" + integrity sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.5" + rc-util "^5.2.0" + +rc-util@^5.0.1, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.27.0, rc-util@^5.28.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.38.1: + version "5.38.1" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.38.1.tgz#4915503b89855f5c5cd9afd4c72a7a17568777bb" + integrity sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^18.2.0" + +rc-virtual-list@^3.11.1, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: + version "3.11.3" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz#77d4e12e20c1ba314b43c0e37e118296674c5401" + integrity sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q== + dependencies: + "@babel/runtime" "^7.20.0" + classnames "^2.2.6" + rc-resize-observer "^1.0.0" + rc-util "^5.36.0" rc@^1.2.8: version "1.2.8" @@ -9702,7 +12021,25 @@ rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-is@^18.0.0: +react-dom@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== @@ -9714,6 +12051,40 @@ react-native-securerandom@^0.1.1: dependencies: base64-js "*" +react-refresh@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.10.0.tgz#2f536c9660c0b9b1d500684d9e52a65e7404f7e3" + integrity sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ== + +react-router-dom@6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.11.2.tgz#324d55750ffe2ecd54ca4ec6b7bc7ab01741f170" + integrity sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw== + dependencies: + "@remix-run/router" "1.6.2" + react-router "6.11.2" + +react-router@6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.11.2.tgz#006301c4da1a173d7ad76b7ecd2da01b9dd3837a" + integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== + dependencies: + "@remix-run/router" "1.6.2" + +react-toastify@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.1.3.tgz#1e798d260d606f50e0fab5ee31daaae1d628c5ff" + integrity sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg== + dependencies: + clsx "^1.1.1" + +react@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -9839,6 +12210,13 @@ readable-stream@^4.1.0: process "^0.11.10" string_decoder "^1.3.0" +readable-web-to-node-stream@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9915,6 +12293,15 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -9961,7 +12348,12 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -resolve-alpn@^1.2.0: +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== @@ -9993,7 +12385,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -10002,6 +12394,22 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.4: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + responselike@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" @@ -10046,19 +12454,22 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@7.8.1, rxjs@^7.0.0, rxjs@^7.2.0, rxjs@^7.8.1: +rxjs@7.8.1, rxjs@^7.0.0, rxjs@^7.2.0, rxjs@^7.8.0, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" -rxjs@^6.5.4: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: - tslib "^1.9.0" + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" @@ -10070,7 +12481,16 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.2: +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10084,9 +12504,9 @@ sass-loader@^12.2.0: neo-async "^2.6.2" sass@^1.42.1: - version "1.69.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.4.tgz#10c735f55e3ea0b7742c6efa940bce30e07fbca2" - integrity sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA== + version "1.69.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde" + integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -10102,6 +12522,20 @@ sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" @@ -10111,7 +12545,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: +schema-utils@^4.0.0, schema-utils@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== @@ -10121,16 +12555,29 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +scroll-into-view-if-needed@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" + integrity sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== + dependencies: + compute-scroll-into-view "^3.0.2" + +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" semantic-release@^21.0.2: @@ -10179,15 +12626,22 @@ semver-regex@^4.0.5: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-4.0.5.tgz#fbfa36c7ba70461311f5debcb3928821eb4f9180" integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw== +semver-truncate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-3.0.0.tgz#0e3b4825d4a4225d8ae6e7c72231182b42edba40" + integrity sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg== + dependencies: + semver "^7.3.5" + "semver@2 || 3 || 4 || 5", semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +semver@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== dependencies: lru-cache "^6.0.0" @@ -10274,6 +12728,15 @@ set-function-length@^1.1.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -10284,6 +12747,13 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -10291,6 +12761,11 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -10345,7 +12820,7 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^3.0.0: +slash@3.0.0, slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== @@ -10355,11 +12830,24 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slash@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" + integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== + smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -10386,6 +12874,20 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" +sort-keys-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" + integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw== + dependencies: + sort-keys "^1.0.0" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== + dependencies: + is-plain-obj "^1.0.0" + "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -10400,14 +12902,6 @@ source-map-loader@^3.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.1" -source-map-resolve@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" - integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -10424,7 +12918,7 @@ source-map-support@0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.20: +source-map-support@^0.5.21, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -10437,7 +12931,7 @@ source-map@0.7.4, source-map@^0.7.3, source-map@^0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -10549,10 +13043,12 @@ ssri@^10.0.0, ssri@^10.0.1, ssri@^10.0.4: dependencies: minipass "^7.0.3" -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" stack-utils@^2.0.3: version "2.0.6" @@ -10561,6 +13057,11 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + standard-changelog@^2.0.27: version "2.0.27" resolved "https://registry.yarnpkg.com/standard-changelog/-/standard-changelog-2.0.27.tgz#6249ab788979fe15573d5f521b6c504199ea1ef4" @@ -10588,6 +13089,13 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + str2buf@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/str2buf/-/str2buf-1.3.0.tgz#a4172afff4310e67235178e738a2dbb573abead0" @@ -10611,6 +13119,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -10637,6 +13150,48 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -10675,6 +13230,11 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -10702,6 +13262,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strip-outer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-2.0.0.tgz#c45c724ed9b1ff6be5f660503791404f4714084b" + integrity sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg== + strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -10711,19 +13276,32 @@ strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" +strtok3@^7.0.0-alpha.9: + version "7.0.0" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.0.0.tgz#868c428b4ade64a8fd8fee7364256001c1a4cbe5" + integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^5.0.0" + style-loader@^3.3.0: version "3.3.3" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== +stylehacks@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.0.tgz#9fdd7c217660dae0f62e14d51c89f6c01b3cb738" + integrity sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw== dependencies: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylis@^4.0.13: + version "4.3.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" + integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== + stylus-loader@^7.1.0: version "7.1.3" resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-7.1.3.tgz#1fdfa0d34e8c05a569bc0902e1ecdb857d764964" @@ -10732,18 +13310,15 @@ stylus-loader@^7.1.0: fast-glob "^3.2.12" normalize-path "^3.0.0" -stylus@^0.55.0: - version "0.55.0" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.55.0.tgz#bd404a36dd93fa87744a9dd2d2b1b8450345e5fc" - integrity sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw== +stylus@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.59.0.tgz#a344d5932787142a141946536d6e24e6a6be7aa6" + integrity sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg== dependencies: - css "^3.0.0" - debug "~3.1.0" + "@adobe/css-tools" "^4.0.1" + debug "^4.3.2" glob "^7.1.6" - mkdirp "~1.0.4" - safer-buffer "^2.1.2" sax "~1.2.4" - semver "^6.3.0" source-map "^0.7.3" supports-color@^5.3.0: @@ -10785,24 +13360,34 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.0.4.tgz#67b40a710743e358e8d19ec288de8f1e388afbb4" + integrity sha512-T+Xul3JwuJ6VGXKo/p2ndqx1ibxNKnLTvRc1ZTWKCfyKS/GgNjRZcYsK84fxTsy/izr91g/Rwx6fGnVgaFSI5g== dependencies: "@trysound/sax" "0.2.0" commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" + css-select "^5.1.0" + css-tree "^2.2.1" + css-what "^6.1.0" + csso "5.0.5" picocolors "^1.0.0" - stable "^0.1.8" swagger-ui-dist@4.18.2: version "4.18.2" resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.18.2.tgz#323308f1c1d87a7c22ce3e273c31835eb680a71b" integrity sha512-oVBoBl9Dg+VJw8uRWDxlyUyHoNEDC0c1ysT6+Boy6CTgr2rUcLcfPon4RvxgS2/taNW6O0+US+Z/dlAsWFjOAQ== +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -10871,9 +13456,9 @@ terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.16.8: - version "5.22.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.22.0.tgz#4f18103f84c5c9437aafb7a14918273310a8a49d" - integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw== + version "5.24.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" + integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10904,6 +13489,11 @@ text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +throttle-debounce@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz#a17a4039e82a2ed38a5e7268e4132d6960d41933" + integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg== + through2@^2.0.0, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -10958,11 +13548,41 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +token-types@^5.0.0-alpha.2: + version "5.0.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4" + integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -10973,7 +13593,7 @@ traverse@~0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== -tree-kill@1.2.2, tree-kill@^1.2.2: +tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== @@ -10988,6 +13608,13 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +trim-repeated@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-2.0.0.tgz#5d60556d6d40d9461b7c7e06c3ac20b6b1d50090" + integrity sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg== + dependencies: + escape-string-regexp "^5.0.0" + ts-jest@^29.1.0: version "29.1.1" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" @@ -11003,9 +13630,9 @@ ts-jest@^29.1.0: yargs-parser "^21.0.1" ts-loader@^9.3.1: - version "9.5.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.0.tgz#f0a51dda37cc4d8e43e6cb14edebbc599b0c3aa2" - integrity sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg== + version "9.5.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" + integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" @@ -11041,6 +13668,16 @@ tsconfig-paths-webpack-plugin@4.0.0: enhanced-resolve "^5.7.0" tsconfig-paths "^4.0.0" +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" @@ -11055,12 +13692,12 @@ tslib@2.5.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== -tslib@2.6.2, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2: +tslib@2.6.2, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -11146,9 +13783,9 @@ type-fest@^3.0.0, type-fest@^3.8.0: integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-fest@^4.2.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.5.0.tgz#79208f4dbb8a9946a55889e9f482b95a3292ee41" - integrity sha512-diLQivFzddJl4ylL3jxSkEc39Tpw7o1QeEHIPxVwryDK2lpB7Nqhzhuo6v5/Ls08Z0yPSAhsyAWlv1/H0ciNmw== + version "4.8.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.8.2.tgz#20d4cc287745723dbabf925de644eeb7de0349c1" + integrity sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ== type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" @@ -11168,6 +13805,45 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typed-assert@^1.0.8: version "1.0.9" resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" @@ -11183,6 +13859,11 @@ typescript@~4.9.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@~5.1.3: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + uglify-js@^3.1.4: version "3.17.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" @@ -11195,10 +13876,20 @@ uid@2.0.2: dependencies: "@lukeed/csprng" "^1.0.0" -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -11223,6 +13914,25 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unicorn-magic@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" + integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== + +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== + dependencies: + qs "^6.4.0" + +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -11230,6 +13940,13 @@ unique-filename@^3.0.0: dependencies: unique-slug "^4.0.0" +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + unique-slug@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" @@ -11245,14 +13962,19 @@ unique-string@^3.0.0: crypto-random-string "^4.0.0" universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -11274,7 +13996,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-join@^4.0.0: +url-join@^4.0.0, url-join@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== @@ -11284,6 +14006,28 @@ url-join@^5.0.0: resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -11341,9 +14085,9 @@ v8-compile-cache@^2.0.3: integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== v8-to-istanbul@^9.0.1: - version "9.1.3" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" - integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -11379,6 +14123,13 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + walk-up-path@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" @@ -11442,6 +14193,11 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + webpack-dev-middleware@^5.3.1: version "5.3.3" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" @@ -11506,7 +14262,7 @@ webpack-subresource-integrity@^5.1.0: dependencies: typed-assert "^1.0.8" -webpack@^5.75.0: +webpack@^5.80.0: version "5.89.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== @@ -11550,6 +14306,26 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -11558,7 +14334,28 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-typed-array@^1.1.11, which-typed-array@^1.1.2: +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.2: version "1.1.13" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== @@ -11569,6 +14366,13 @@ which-typed-array@^1.1.11, which-typed-array@^1.1.2: gopd "^1.0.1" has-tostringtag "^1.0.0" +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -11634,11 +14438,21 @@ write-file-atomic@^5.0.0, write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@8.14.2, ws@^8.13.0: +ws@8.14.2, ws@^8.11.0, ws@^8.13.0: version "8.14.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -11649,6 +14463,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -11659,7 +14478,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: +yaml@^1.10.0, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -- GitLab