From 31a6ef96d838ad640324898ab7364bb1500c94c3 Mon Sep 17 00:00:00 2001 From: Philipp Kunz Date: Sun, 29 Sep 2024 13:56:38 +0200 Subject: [PATCH] initial --- .dockerignore | 1 + .gitea/workflows/docker_nottags.yaml | 71 + .gitea/workflows/docker_tags.yaml | 106 + .gitignore | 20 + .vscode/launch.json | 11 + .vscode/settings.json | 26 + Dockerfile | 46 + cli.child.ts | 4 + cli.js | 4 + cli.ts.js | 5 + html/index.html | 110 + npmextra.json | 24 + package.json | 82 + pnpm-lock.yaml | 8171 +++++++++++++++++ qenv.yml | 1 + readme.hints.md | 3 + readme.md | 1 + ts/00_commitinfo_data.ts | 8 + ts/ffb.paths.ts | 7 + ts/ffb.plugins.ts | 14 + ts/index.ts | 12 + ts/reception/classes.apitoken.ts | 34 + ts/reception/classes.apitokenmanager.ts | 12 + ts/reception/classes.billingplan.ts | 36 + ts/reception/classes.billingplanmanager.ts | 64 + ts/reception/classes.housekeeping.ts | 45 + ts/reception/classes.jwt.ts | 78 + ts/reception/classes.jwtmanager.ts | 141 + ts/reception/classes.loginsession.ts | 114 + ts/reception/classes.loginsessionmanager.ts | 259 + ts/reception/classes.organization.ts | 40 + ts/reception/classes.organizationmanager.ts | 115 + ts/reception/classes.reception.ts | 61 + ts/reception/classes.receptiondb.ts | 25 + ts/reception/classes.receptionmailer.ts | 270 + ts/reception/classes.receptionserver.ts | 35 + ts/reception/classes.receptionstorage.ts | 9 + ts/reception/classes.registrationsession.ts | 200 + .../classes.registrationsessionmanager.ts | 189 + ts/reception/classes.role.ts | 14 + ts/reception/classes.rolemanager.ts | 57 + ts/reception/classes.user.ts | 50 + ts/reception/classes.usermanager.ts | 60 + ts/reception/index.ts | 15 + ts/reception/logging.ts | 13 + ts/reception/paths.ts | 3 + ts/reception/plugins.ts | 57 + ts_idpclient/classes.idpclient.ts | 362 + ts_idpclient/classes.idprequests.ts | 62 + ts_idpclient/index.ts | 1 + ts_idpclient/plugins.ts | 26 + ts_interfaces/00_commitinfo_data.ts | 8 + ts_interfaces/data/index.ts | 9 + ts_interfaces/data/loint-reception.app.ts | 13 + .../data/loint-reception.billingplan.ts | 47 + ts_interfaces/data/loint-reception.device.ts | 3 + ts_interfaces/data/loint-reception.jwt.ts | 38 + .../data/loint-reception.loginsession.ts | 14 + .../data/loint-reception.organization.ts | 13 + .../loint-reception.paddlecheckoutdata.ts | 316 + .../data/loint-reception.property.ts | 12 + ts_interfaces/data/loint-reception.role.ts | 13 + ts_interfaces/data/loint-reception.user.ts | 30 + ts_interfaces/index.ts | 6 + ts_interfaces/loint-reception.plugins.ts | 9 + ts_interfaces/request/index.ts | 9 + .../request/loint-reception.apitoken.ts | 1 + .../request/loint-reception.authorization.ts | 19 + .../request/loint-reception.billingplan.ts | 39 + ts_interfaces/request/loint-reception.jwt.ts | 45 + .../request/loint-reception.login.ts | 180 + .../request/loint-reception.organization.ts | 51 + ts_interfaces/request/loint-reception.plan.ts | 17 + .../request/loint-reception.registration.ts | 90 + ts_interfaces/request/loint-reception.user.ts | 76 + ts_interfaces/tags/index.ts | 12 + .../classes.idp-registration-stepper.ts | 296 + ts_web/elements/idp-logincontainer.ts | 264 + ts_web/elements/idp-loginprompt.ts | 298 + ts_web/elements/idp-transfermanager.ts | 76 + ts_web/elements/idp-welcome.ts | 73 + ts_web/idp.state.ts | 17 + ts_web/index.ts | 61 + ts_web/plugins.ts | 17 + tsconfig.json | 14 + 85 files changed, 13360 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitea/workflows/docker_nottags.yaml create mode 100644 .gitea/workflows/docker_tags.yaml create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 Dockerfile create mode 100644 cli.child.ts create mode 100644 cli.js create mode 100644 cli.ts.js create mode 100644 html/index.html create mode 100644 npmextra.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 qenv.yml create mode 100644 readme.hints.md create mode 100644 readme.md create mode 100644 ts/00_commitinfo_data.ts create mode 100644 ts/ffb.paths.ts create mode 100644 ts/ffb.plugins.ts create mode 100644 ts/index.ts create mode 100644 ts/reception/classes.apitoken.ts create mode 100644 ts/reception/classes.apitokenmanager.ts create mode 100644 ts/reception/classes.billingplan.ts create mode 100644 ts/reception/classes.billingplanmanager.ts create mode 100644 ts/reception/classes.housekeeping.ts create mode 100644 ts/reception/classes.jwt.ts create mode 100644 ts/reception/classes.jwtmanager.ts create mode 100644 ts/reception/classes.loginsession.ts create mode 100644 ts/reception/classes.loginsessionmanager.ts create mode 100644 ts/reception/classes.organization.ts create mode 100644 ts/reception/classes.organizationmanager.ts create mode 100644 ts/reception/classes.reception.ts create mode 100644 ts/reception/classes.receptiondb.ts create mode 100644 ts/reception/classes.receptionmailer.ts create mode 100644 ts/reception/classes.receptionserver.ts create mode 100644 ts/reception/classes.receptionstorage.ts create mode 100644 ts/reception/classes.registrationsession.ts create mode 100644 ts/reception/classes.registrationsessionmanager.ts create mode 100644 ts/reception/classes.role.ts create mode 100644 ts/reception/classes.rolemanager.ts create mode 100644 ts/reception/classes.user.ts create mode 100644 ts/reception/classes.usermanager.ts create mode 100644 ts/reception/index.ts create mode 100644 ts/reception/logging.ts create mode 100644 ts/reception/paths.ts create mode 100644 ts/reception/plugins.ts create mode 100644 ts_idpclient/classes.idpclient.ts create mode 100644 ts_idpclient/classes.idprequests.ts create mode 100644 ts_idpclient/index.ts create mode 100644 ts_idpclient/plugins.ts create mode 100644 ts_interfaces/00_commitinfo_data.ts create mode 100644 ts_interfaces/data/index.ts create mode 100644 ts_interfaces/data/loint-reception.app.ts create mode 100644 ts_interfaces/data/loint-reception.billingplan.ts create mode 100644 ts_interfaces/data/loint-reception.device.ts create mode 100644 ts_interfaces/data/loint-reception.jwt.ts create mode 100644 ts_interfaces/data/loint-reception.loginsession.ts create mode 100644 ts_interfaces/data/loint-reception.organization.ts create mode 100644 ts_interfaces/data/loint-reception.paddlecheckoutdata.ts create mode 100644 ts_interfaces/data/loint-reception.property.ts create mode 100644 ts_interfaces/data/loint-reception.role.ts create mode 100644 ts_interfaces/data/loint-reception.user.ts create mode 100644 ts_interfaces/index.ts create mode 100644 ts_interfaces/loint-reception.plugins.ts create mode 100644 ts_interfaces/request/index.ts create mode 100644 ts_interfaces/request/loint-reception.apitoken.ts create mode 100644 ts_interfaces/request/loint-reception.authorization.ts create mode 100644 ts_interfaces/request/loint-reception.billingplan.ts create mode 100644 ts_interfaces/request/loint-reception.jwt.ts create mode 100644 ts_interfaces/request/loint-reception.login.ts create mode 100644 ts_interfaces/request/loint-reception.organization.ts create mode 100644 ts_interfaces/request/loint-reception.plan.ts create mode 100644 ts_interfaces/request/loint-reception.registration.ts create mode 100644 ts_interfaces/request/loint-reception.user.ts create mode 100644 ts_interfaces/tags/index.ts create mode 100644 ts_web/elements/classes.idp-registration-stepper.ts create mode 100644 ts_web/elements/idp-logincontainer.ts create mode 100644 ts_web/elements/idp-loginprompt.ts create mode 100644 ts_web/elements/idp-transfermanager.ts create mode 100644 ts_web/elements/idp-welcome.ts create mode 100644 ts_web/idp.state.ts create mode 100644 ts_web/index.ts create mode 100644 ts_web/plugins.ts create mode 100644 tsconfig.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.gitea/workflows/docker_nottags.yaml b/.gitea/workflows/docker_nottags.yaml new file mode 100644 index 0000000..5154a0e --- /dev/null +++ b/.gitea/workflows/docker_nottags.yaml @@ -0,0 +1,71 @@ +name: Docker (tags) + +on: + push: + tags-ignore: + - '**' + +env: + IMAGE: code.foss.global/hosttoday/ht-docker-node:npmci + NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git + NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}} + NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}} + NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}} + NPMCI_LOGIN_DOCKER_GITEA: ${{ github.server_url }}|${{ gitea.repository_owner }}|${{ secrets.GITEA_TOKEN }} + NPMCI_LOGIN_DOCKER_DOCKERREGISTRY: ${{ secrets.NPMCI_LOGIN_DOCKER_DOCKERREGISTRY }} + +jobs: + security: + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + continue-on-error: true + + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm and npmci + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + npmci npm prepare + + - name: Audit production dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --prod + continue-on-error: true + + - name: Audit development dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --dev + continue-on-error: true + + test: + needs: security + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + npmci npm prepare + + - name: Test stable + run: | + npmci node install stable + npmci npm install + npmci npm test + + - name: Test build + run: | + npmci npm prepare + npmci node install stable + npmci npm install + npmci command npm run build diff --git a/.gitea/workflows/docker_tags.yaml b/.gitea/workflows/docker_tags.yaml new file mode 100644 index 0000000..74684e0 --- /dev/null +++ b/.gitea/workflows/docker_tags.yaml @@ -0,0 +1,106 @@ +name: Docker (tags) + +on: + push: + tags: + - '*' + +env: + IMAGE: code.foss.global/hosttoday/ht-docker-node:npmci + NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git + NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}} + NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}} + NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}} + NPMCI_LOGIN_DOCKER_GITEA: ${{ github.server_url }}|${{ gitea.repository_owner }}|${{ secrets.GITEA_TOKEN }} + NPMCI_LOGIN_DOCKER_DOCKERREGISTRY: ${{ secrets.NPMCI_LOGIN_DOCKER_DOCKERREGISTRY }} + +jobs: + security: + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + continue-on-error: true + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + npmci npm prepare + + - name: Audit production dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --prod + continue-on-error: true + + - name: Audit development dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --dev + continue-on-error: true + + test: + needs: security + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + npmci npm prepare + + - name: Test stable + run: | + npmci node install stable + npmci npm install + npmci npm test + + - name: Test build + run: | + npmci node install stable + npmci npm install + npmci command npm run build + + release: + needs: test + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + container: + image: code.foss.global/hosttoday/ht-docker-dbase:npmci + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + + - name: Release + run: | + npmci docker login + npmci docker build + npmci docker test + # npmci docker push + npmci docker push + + metadata: + needs: test + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Trigger + run: npmci trigger diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ef13c79 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +.nogit/ + +# artifacts +coverage/ +public/ +pages/ + +# installs +node_modules/ + +# caches +.yarn/ +.cache/ +.rpt2_cache + +# builds +dist/ +dist_*/ + +# custom \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..26e9f92 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "npm test", + "name": "Run npm test", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3648eaa --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,26 @@ +{ + "json.schemas": [ + { + "fileMatch": ["/npmextra.json"], + "schema": { + "type": "object", + "properties": { + "npmci": { + "type": "object", + "description": "settings for npmci" + }, + "gitzone": { + "type": "object", + "description": "settings for gitzone", + "properties": { + "projectType": { + "type": "string", + "enum": ["website", "element", "service", "npm", "wcc"] + } + } + } + } + } + } + ] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b8dec57 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +# gitzone dockerfile_service +## STAGE 1 // BUILD +FROM code.foss.global/hosttoday/ht-docker-node:npmci as node1 +COPY ./ /app +WORKDIR /app +ARG NPMCI_TOKEN_NPM2 +ENV NPMCI_TOKEN_NPM2 $NPMCI_TOKEN_NPM2 +RUN npmci npm prepare +RUN pnpm config set store-dir .pnpm-store +RUN rm -rf node_modules && pnpm install +RUN pnpm run build + +# gitzone dockerfile_service +## STAGE 2 // install production +FROM code.foss.global/hosttoday/ht-docker-node:npmci as node2 +WORKDIR /app +COPY --from=node1 /app /app +RUN rm -rf .pnpm-store +ARG NPMCI_TOKEN_NPM2 +ENV NPMCI_TOKEN_NPM2 $NPMCI_TOKEN_NPM2 +RUN npmci npm prepare +RUN pnpm config set store-dir .pnpm-store +RUN rm -rf node_modules/ && pnpm install --prod + + +## STAGE 3 // rebuild dependencies for alpine +FROM code.foss.global/hosttoday/ht-docker-node:alpinenpmci as node3 +WORKDIR /app +COPY --from=node2 /app /app +ARG NPMCI_TOKEN_NPM2 +ENV NPMCI_TOKEN_NPM2 $NPMCI_TOKEN_NPM2 +RUN npmci npm prepare +RUN pnpm config set store-dir .pnpm-store +RUN pnpm rebuild -r + +## STAGE 4 // the final production image with all dependencies in place +FROM code.foss.global/hosttoday/ht-docker-node:alpine as node4 +WORKDIR /app +COPY --from=node3 /app /app + +### Healthchecks +RUN pnpm install -g @servezone/healthy +HEALTHCHECK --interval=30s --timeout=30s --start-period=30s --retries=3 CMD [ "healthy" ] + +EXPOSE 80 +CMD ["npm", "start"] diff --git a/cli.child.ts b/cli.child.ts new file mode 100644 index 0000000..20d8b5f --- /dev/null +++ b/cli.child.ts @@ -0,0 +1,4 @@ +#!/usr/bin/env node +process.env.CLI_CALL = 'true'; +import * as cliTool from './ts/index.js'; +cliTool.runCli(); diff --git a/cli.js b/cli.js new file mode 100644 index 0000000..b854fb3 --- /dev/null +++ b/cli.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +process.env.CLI_CALL = 'true'; +const cliTool = await import('./dist_ts/index.js'); +cliTool.runCli(); diff --git a/cli.ts.js b/cli.ts.js new file mode 100644 index 0000000..505c88d --- /dev/null +++ b/cli.ts.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node +process.env.CLI_CALL = 'true'; + +import * as tsrun from '@git.zone/tsrun'; +tsrun.runPath('./cli.child.js', import.meta.url); diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..7048dad --- /dev/null +++ b/html/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/npmextra.json b/npmextra.json new file mode 100644 index 0000000..300c3a3 --- /dev/null +++ b/npmextra.json @@ -0,0 +1,24 @@ +{ + "gitzone": { + "projectType": "website", + "module": { + "githost": "code.foss.global", + "gitscope": "idp.global", + "gitrepo": "idp.global", + "description": "the code that runs the idp.global software", + "npmPackagename": "@idp.global/idp.global", + "license": "MIT", + "projectDomain": "idp.global" + } + }, + "npmci": { + "npmGlobalTools": [], + "dockerRegistryRepoMap": { + "registry.gitlab.com": "code.foss.global/idp.global/idp.global" + }, + "dockerBuildargEnvMap": { + "NPMCI_TOKEN_NPM2": "NPMCI_TOKEN_NPM2" + }, + "npmRegistryUrl": "registry.npmjs.org" + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..6aba4bf --- /dev/null +++ b/package.json @@ -0,0 +1,82 @@ +{ + "name": "@idp.global/idp.global", + "version": "1.0.0", + "description": "the code that runs the idp.global software", + "main": "dist_ts/index.js", + "typings": "dist_ts/index.d.ts", + "type": "module", + "scripts": { + "test": "npm run build", + "build": "tsbuild tsfolders --web --allowimplicitany && tsbundle website --production", + "watch": "tswatch website", + "start": "(node cli.js)", + "startTs": "(node cli.ts.js)", + "buildDocs": "tsdoc" + }, + "author": "Task Venture Capital GmbH", + "license": "MIT", + "dependencies": { + "@api.global/typedrequest": "^3.0.32", + "@api.global/typedrequest-interfaces": "^3.0.19", + "@api.global/typedserver": "^3.0.51", + "@api.global/typedsocket": "^3.0.1", + "@consentsoftware_private/catalog": "^1.0.73", + "@design.estate/dees-catalog": "^1.1.8", + "@design.estate/dees-domtools": "^2.0.23", + "@design.estate/dees-element": "^2.0.15", + "@push.rocks/lik": "^6.0.15", + "@push.rocks/qenv": "^6.0.5", + "@push.rocks/smartdata": "^5.2.10", + "@push.rocks/smartdelay": "^3.0.5", + "@push.rocks/smarthash": "^3.0.4", + "@push.rocks/smartjson": "^5.0.20", + "@push.rocks/smartjwt": "^2.2.1", + "@push.rocks/smartlog": "^3.0.7", + "@push.rocks/smartmail": "^1.0.24", + "@push.rocks/smartpath": "^5.0.5", + "@push.rocks/smartpromise": "^4.0.4", + "@push.rocks/smartrx": "^3.0.7", + "@push.rocks/smartstate": "^2.0.0", + "@push.rocks/smarttime": "^4.0.8", + "@push.rocks/smartunique": "^3.0.9", + "@push.rocks/smarturl": "^3.0.7", + "@push.rocks/taskbuffer": "^3.1.7", + "@push.rocks/webjwt": "^1.0.9", + "@push.rocks/websetup": "^3.0.15", + "@push.rocks/webstore": "^2.0.20", + "@serve.zone/platformclient": "^1.0.6", + "@tsclass/tsclass": "^4.1.2" + }, + "devDependencies": { + "@git.zone/tsbuild": "^2.1.17", + "@git.zone/tsbundle": "^2.0.3", + "@git.zone/tsrun": "^1.2.8", + "@git.zone/tswatch": "^2.0.1", + "@push.rocks/projectinfo": "^5.0.1", + "@types/node": "^22.7.2" + }, + "private": true, + "repository": { + "type": "git", + "url": "git+https://code.foss.global/idp.global/idp.global.git" + }, + "bugs": { + "url": "https://code.foss.global/idp.global/idp.global/issues" + }, + "homepage": "https://code.foss.global/idp.global/idp.global#readme", + "browserslist": [ + "last 1 chrome versions" + ], + "files": [ + "ts/**/*", + "ts_web/**/*", + "dist/**/*", + "dist_*/**/*", + "dist_ts/**/*", + "dist_ts_web/**/*", + "assets/**/*", + "cli.js", + "npmextra.json", + "readme.md" + ] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..ea12c39 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8171 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@api.global/typedrequest': + specifier: ^3.0.32 + version: 3.0.32 + '@api.global/typedrequest-interfaces': + specifier: ^3.0.19 + version: 3.0.19 + '@api.global/typedserver': + specifier: ^3.0.51 + version: 3.0.51 + '@api.global/typedsocket': + specifier: ^3.0.1 + version: 3.0.1 + '@consentsoftware_private/catalog': + specifier: ^1.0.73 + version: 1.0.77(@types/node@22.7.2) + '@design.estate/dees-catalog': + specifier: ^1.1.8 + version: 1.1.8 + '@design.estate/dees-domtools': + specifier: ^2.0.23 + version: 2.0.57 + '@design.estate/dees-element': + specifier: ^2.0.15 + version: 2.0.36 + '@push.rocks/lik': + specifier: ^6.0.15 + version: 6.0.15 + '@push.rocks/qenv': + specifier: ^6.0.5 + version: 6.0.5 + '@push.rocks/smartdata': + specifier: ^5.2.10 + version: 5.2.10(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/credential-providers@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)))(socks@2.8.3) + '@push.rocks/smartdelay': + specifier: ^3.0.5 + version: 3.0.5 + '@push.rocks/smarthash': + specifier: ^3.0.4 + version: 3.0.4 + '@push.rocks/smartjson': + specifier: ^5.0.20 + version: 5.0.20 + '@push.rocks/smartjwt': + specifier: ^2.2.1 + version: 2.2.1 + '@push.rocks/smartlog': + specifier: ^3.0.7 + version: 3.0.7 + '@push.rocks/smartmail': + specifier: ^1.0.24 + version: 1.0.24 + '@push.rocks/smartpath': + specifier: ^5.0.5 + version: 5.0.18 + '@push.rocks/smartpromise': + specifier: ^4.0.4 + version: 4.0.4 + '@push.rocks/smartrx': + specifier: ^3.0.7 + version: 3.0.7 + '@push.rocks/smartstate': + specifier: ^2.0.0 + version: 2.0.17 + '@push.rocks/smarttime': + specifier: ^4.0.8 + version: 4.0.8 + '@push.rocks/smartunique': + specifier: ^3.0.9 + version: 3.0.9 + '@push.rocks/smarturl': + specifier: ^3.0.7 + version: 3.0.7 + '@push.rocks/taskbuffer': + specifier: ^3.1.7 + version: 3.1.7 + '@push.rocks/webjwt': + specifier: ^1.0.9 + version: 1.0.9 + '@push.rocks/websetup': + specifier: ^3.0.15 + version: 3.0.19 + '@push.rocks/webstore': + specifier: ^2.0.20 + version: 2.0.20 + '@serve.zone/platformclient': + specifier: ^1.0.6 + version: 1.0.6 + '@tsclass/tsclass': + specifier: ^4.1.2 + version: 4.1.2 + devDependencies: + '@git.zone/tsbuild': + specifier: ^2.1.17 + version: 2.1.84 + '@git.zone/tsbundle': + specifier: ^2.0.3 + version: 2.0.15 + '@git.zone/tsrun': + specifier: ^1.2.8 + version: 1.2.49(@types/node@22.7.2) + '@git.zone/tswatch': + specifier: ^2.0.1 + version: 2.0.23(@types/node@22.7.2) + '@push.rocks/projectinfo': + specifier: ^5.0.1 + version: 5.0.2 + '@types/node': + specifier: ^22.7.2 + version: 22.7.2 + +packages: + + '@adobe/fetch@4.1.9': + resolution: {integrity: sha512-FWIzm4vvl1OtCarTBgWDW6otj4gxrNmMf/DdriqBUw7DjjmckjT3ZQA43b4HzBkzkuAHhajwMy91btp9fWgTEw==} + engines: {node: '>=14.16'} + + '@api.global/typedrequest-interfaces@2.0.2': + resolution: {integrity: sha512-D+mkr4IiUZ/eUgrdp5jXjBKOW/iuMcl0z2ZLQsLLypKX/psFGD3viZJ58FNRa+/1OSM38JS5wFyoWl8oPEFLrw==} + + '@api.global/typedrequest-interfaces@3.0.19': + resolution: {integrity: sha512-uuHUXJeOy/inWSDrwD0Cwax2rovpxYllDhM2RWh+6mVpQuNmZ3uw6IVg6dA2G1rOe24Ebs+Y9SzEogo+jYN7vw==} + + '@api.global/typedrequest@3.0.32': + resolution: {integrity: sha512-8kIavXswntn3KY4hnXhhA08c4unI43eCkm9F32LgPDKs1PrkhhB8jvbqzbJnXvYdHfVJ3mcT1N71/r8frIGYrw==} + + '@api.global/typedserver@3.0.51': + resolution: {integrity: sha512-NbvCDB/Td8jr1Y9whUrkuQ1viy57q3EoG7H1/LgCZpJJD2nzoNpmRK1Gnujz60UmTDoxIEWq8QfteiU3n7yvZg==} + + '@api.global/typedsocket@3.0.1': + resolution: {integrity: sha512-xojiAVNXtHoxkpBo8U2HHJG8FrVXXuLvDNndSHXwx4C9VslUwDn5zSCI+PdBl8iAg+ZuBmKjqkpZZ9sL6DC5yQ==} + + '@apiglobal/typedrequest-interfaces@1.0.20': + resolution: {integrity: sha512-ybsDtavYbzGJYSLodSbkxDvSLYtfMzBTuNZDJpiANt1rZA2MO/GCq8zk5MVLlrUUQIr/7oxPGWqxi1QDwR+RHQ==} + + '@apiglobal/typedrequest-interfaces@2.0.1': + resolution: {integrity: sha512-Oi7pNU4vKo5UvcCJmqkH43Us237Ws/Pp/WDYnwnonRnTmIMd+6QjNfN/gXcPnP6tbamk8r8Xzcz9mgnSDM2ysw==} + + '@apiglobal/typedrequest@2.0.12': + resolution: {integrity: sha512-oCxcdKEzihzPDf0jrqG4obFFSgDszvO5LO+0Fk/hH/0bZm0AQ1LssYVwaY8OHjT0ujmkTcC5JFCjaS7LgjKSgQ==} + + '@apiglobal/typedserver@2.0.65': + resolution: {integrity: sha512-enI+UGgzyQRG43ZQBzRMcc9dSII7vOx+v/7+mkVqTqgCQtad9RimqMDBdhOrnIWPyzctY86CK1LfQmlpZJAFbA==} + + '@apiglobal/typedsocket@2.0.24': + resolution: {integrity: sha512-8Ol5E3AvqdUTjEhiNkEKnbGpst9iXBtD5zDudeQDcajzjSdstUGe+GExQRc+D7hiOkktfuF8FArQ3HQ4RyZwow==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-cognito-identity@3.658.1': + resolution: {integrity: sha512-MCYLKmNy0FlNT9TvXfOxj0jh+ZQq+G9qEy/VZqu3JsQSgiFvFRdzgzcbQ9gQx7fZrDC/TPdABOTh483zI4cu9g==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso-oidc@3.658.1': + resolution: {integrity: sha512-RGcZAI3qEA05JszPKwa0cAyp8rnS1nUvs0Sqw4hqLNQ1kD7b7V6CPjRXe7EFQqCOMvM4kGqx0+cEEVTOmBsFLw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.658.1 + + '@aws-sdk/client-sso@3.658.1': + resolution: {integrity: sha512-lOuaBtqPTYGn6xpXlQF4LsNDsQ8Ij2kOdnk+i69Kp6yS76TYvtUuukyLL5kx8zE1c8WbYtxj9y8VNw9/6uKl7Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sts@3.658.1': + resolution: {integrity: sha512-yw9hc5blTnbT1V6mR7Cx9HGc9KQpcLQ1QXj8rntiJi6tIYu3aFNVEyy81JHL7NsuBSeQulJTvHO3y6r3O0sfRg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/core@3.658.1': + resolution: {integrity: sha512-vJVMoMcSKXK2gBRSu9Ywwv6wQ7tXH8VL1fqB1uVxgCqBZ3IHfqNn4zvpMPWrwgO2/3wv7XFyikGQ5ypPTCw4jA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.658.1': + resolution: {integrity: sha512-JY4rZ4e2emL7PNHCU7F/BQV8PpQGEBZLkEoPD55RO4CitaIhlVZRpUCGLih+0Hw4MOnTUqJdfQBM+qZk6G+Now==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-env@3.654.0': + resolution: {integrity: sha512-kogsx3Ql81JouHS7DkheCDU9MYAvK0AokxjcshDveGmf7BbgbWCA8Fnb9wjQyNDaOXNvkZu8Z8rgkX91z324/w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-http@3.658.1': + resolution: {integrity: sha512-4ubkJjEVCZflxkZnV1JDQv8P2pburxk1LrEp55telfJRzXrnowzBKwuV2ED0QMNC448g2B3VCaffS+Ct7c4IWQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-ini@3.658.1': + resolution: {integrity: sha512-2uwOamQg5ppwfegwen1ddPu5HM3/IBSnaGlaKLFhltkdtZ0jiqTZWUtX2V+4Q+buLnT0hQvLS/frQ+7QUam+0Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.658.1 + + '@aws-sdk/credential-provider-node@3.658.1': + resolution: {integrity: sha512-XwxW6N+uPXPYAuyq+GfOEdfL/MZGAlCSfB5gEWtLBFmFbikhmEuqfWtI6CD60OwudCUOh6argd21BsJf8o1SJA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-process@3.654.0': + resolution: {integrity: sha512-PmQoo8sZ9Q2Ow8OMzK++Z9lI7MsRUG7sNq3E72DVA215dhtTICTDQwGlXH2AAmIp7n+G9LLRds+4wo2ehG4mkg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-sso@3.658.1': + resolution: {integrity: sha512-YOagVEsZEk9DmgJEBg+4MBXrPcw/tYas0VQ5OVBqC5XHNbi2OBGJqgmjVPesuu393E7W0VQxtJFDS00O1ewQgA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.654.0': + resolution: {integrity: sha512-6a2g9gMtZToqSu+CusjNK5zvbLJahQ9di7buO3iXgbizXpLXU1rnawCpWxwslMpT5fLgMSKDnKDrr6wdEk7jSw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.654.0 + + '@aws-sdk/credential-providers@3.658.1': + resolution: {integrity: sha512-lfXA6kZS6GHyi/67EbfrKdLoqHR6j7G35eFwaqxyNkfMhNBpAF0eZK3SYiwnzdR9+Wb/enTFawYiFbG5R+dQzA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-host-header@3.654.0': + resolution: {integrity: sha512-rxGgVHWKp8U2ubMv+t+vlIk7QYUaRCHaVpmUlJv0Wv6Q0KeO9a42T9FxHphjOTlCGQOLcjCreL9CF8Qhtb4mdQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-logger@3.654.0': + resolution: {integrity: sha512-OQYb+nWlmASyXfRb989pwkJ9EVUMP1CrKn2eyTk3usl20JZmKo2Vjis6I0tLUkMSxMhnBJJlQKyWkRpD/u1FVg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.654.0': + resolution: {integrity: sha512-gKSomgltKVmsT8sC6W7CrADZ4GHwX9epk3GcH6QhebVO3LA9LRbkL3TwOPUXakxxOLLUTYdOZLIOtFf7iH00lg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-user-agent@3.654.0': + resolution: {integrity: sha512-liCcqPAyRsr53cy2tYu4qeH4MMN0eh9g6k56XzI5xd4SghXH5YWh4qOYAlQ8T66ZV4nPMtD8GLtLXGzsH8moFg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/region-config-resolver@3.654.0': + resolution: {integrity: sha512-ydGOrXJxj3x0sJhsXyTmvJVLAE0xxuTWFJihTl67RtaO7VRNtd82I3P3bwoMMaDn5WpmV5mPo8fEUDRlBm3fPg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/token-providers@3.654.0': + resolution: {integrity: sha512-D8GeJYmvbfWkQDtTB4owmIobSMexZel0fOoetwvgCQ/7L8VPph3Q2bn1TRRIXvH7wdt6DcDxA3tKMHPBkT3GlA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.654.0 + + '@aws-sdk/types@3.654.0': + resolution: {integrity: sha512-VWvbED3SV+10QJIcmU/PKjsKilsTV16d1I7/on4bvD/jo1qGeMXqLDBSen3ks/tuvXZF/mFc7ZW/W2DiLVtO7A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-endpoints@3.654.0': + resolution: {integrity: sha512-i902fcBknHs0Irgdpi62+QMvzxE+bczvILXigYrlHL4+PiEnlMVpni5L5W1qCkNZXf8AaMrSBuR1NZAGp6UOUw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-user-agent-browser@3.654.0': + resolution: {integrity: sha512-ykYAJqvnxLt7wfrqya28wuH3/7NdrwzfiFd7NqEVQf7dXVxL5RPEpD7DxjcyQo3DsHvvdUvGZVaQhozycn1pzA==} + + '@aws-sdk/util-user-agent-node@3.654.0': + resolution: {integrity: sha512-a0ojjdBN6pqv6gB4H/QPPSfhs7mFtlVwnmKCM/QrTaFzN0U810PJ1BST3lBx5sa23I5jWHGaoFY+5q65C3clLQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@babel/runtime@7.23.4': + resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.25.6': + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + engines: {node: '>=6.9.0'} + + '@cloudflare/workers-types@4.20240919.0': + resolution: {integrity: sha512-DZwTpZVAV+fKTLxo6ntC2zMNRL/UJwvtMKUt/U7ZyJdR+t0qcBUZGx8jLi9gOFWYxkzO3s7slajwkR2hQRPXYQ==} + + '@configvault.io/interfaces@1.0.17': + resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} + + '@consent.software/interfaces@1.0.13': + resolution: {integrity: sha512-xB1h5n5vltRLBrvQhrKz4K6tz+TN5RHHvcbQbTIphxetiWOJJq/RwyEN2iH8TtwWIGBSqHRtoljBQqY8t8Oanw==} + + '@consentsoftware/interfaces@1.0.13': + resolution: {integrity: sha512-NIkCvjuue+6Srz5Umnzo5qDw5WxMJluQC4QrV4ykW9DSKcPR3eF1rROhSAsuj5EKupNfoiWJlXoWyrKfGg/JVQ==} + + '@consentsoftware/webclient@1.0.16': + resolution: {integrity: sha512-dqR7vfhEtKTbgxkOJQb6USDCmGFC4L+asm2jBIck+J3AdgF+fTPgfR/lIZzVhCjIn6Rq514hPB4e9RKSNN3aDA==} + + '@consentsoftware_private/catalog@1.0.77': + resolution: {integrity: sha512-qiV3t0ivVglhbHXlKcNVrh7+Po8T/bLrbNwyaNINgxN/Dq6dCmhGhUKBzgUYkKXTg6o4p7ae9YrvRi3fbXDwtA==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@design.estate/dees-catalog@1.1.8': + resolution: {integrity: sha512-5OuzzLNBwNURB99EZtQ+BOjpLXqe1+rQIFHSrDhyMaPg5atbTJa6IqfYNqs1newbpE1PnS+RQ7OawQs3J3uZ8Q==} + + '@design.estate/dees-comms@1.0.27': + resolution: {integrity: sha512-GvzTUwkV442LD60T08iqSoqvhA02Mou5lFvvqBPc4yBUiU7cZISqBx+76xvMgMIEI9Dx9JfTl4/2nW8MoVAanw==} + + '@design.estate/dees-domtools@2.0.57': + resolution: {integrity: sha512-sA27nOl+vdY3hR0Y/QPs4wtUJU15W34CeMshjWModUtm7WgogJgAhbHHY+I38yf3gwvBFfFkBZHo/GL9l/lR2A==} + + '@design.estate/dees-element@2.0.36': + resolution: {integrity: sha512-XPOwNni7fxWyPKqEfYEECM6wup2v7WCb7mzmUxC3bXoHajYwZeYgoN8OOIbV8oKK5Iwi2wKhdW/GoUN45SUZZA==} + + '@design.estate/dees-wcctools@1.0.90': + resolution: {integrity: sha512-EHYWHiOe+P261e9fBbOBmkD7lIsOpD+tu4VZQr20oc8vhsFjeUGJqYeBm/Ghwg+Gck/dto+K9zyJNIyQ642cEw==} + + '@designestate/dees-catalog@1.0.170': + resolution: {integrity: sha512-oiyy3zCNcdYDtjhtWR0whIv4xBusINY0xBGSwX+NTI+l7VRt8YjXepj8rUOTkG6DjzhCbNyRibQ4fsd4fdcPYg==} + deprecated: This package has been deprecated in favour of the new package at @design.estate/dees-catalog + + '@designestate/dees-comms@1.0.22': + resolution: {integrity: sha512-zZ2AwCy49sj1fNyeSMtAxcN4qAGiP5+OjJCtY88YjrNbvD83v4GZpjci0nFUPuvOkCoeo18Uw8xgZSDy8lc59Q==} + deprecated: This package has been deprecated in favour of the new package at @design.estate/dees-comms + + '@designestate/dees-domtools@2.0.34': + resolution: {integrity: sha512-FVcX/yCQmWj9tl53ys2xn1PUCrSDAkCeMFp+qfJ4IKMA6ubb4kMTpl5f5mSQR0h4Uue2C+/XPapwWAK/G+ZTFg==} + deprecated: This package has been deprecated in favour of the new package at @design.estate/dees-domtools + + '@designestate/dees-element@2.0.23': + resolution: {integrity: sha512-TcDp9tAk7n65LwEX1oyMvG+g6g9+dWlOHea7G+k+HGNBAoGnSDrHhe9M/zAmxNVnQ08O/opgxiIgdr3viouTWA==} + deprecated: This package has been deprecated in favour of the new package at @design.estate/dees-element + + '@designestate/dees-wcctools@1.0.76': + resolution: {integrity: sha512-TN+A+A6KK7VtkTF6r9m1HPYwtH6rmcw2JJYO+2tBqV7qozNQ39EUjWk217jTkyiy7ynOZEI6SfIFXP+2UgG2NA==} + deprecated: This package has been deprecated in favour of the new package at @design.estate/dees-wcctools + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@fortawesome/fontawesome-common-types@6.6.0': + resolution: {integrity: sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==} + engines: {node: '>=6'} + + '@fortawesome/fontawesome-svg-core@6.6.0': + resolution: {integrity: sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==} + engines: {node: '>=6'} + + '@fortawesome/free-brands-svg-icons@6.6.0': + resolution: {integrity: sha512-1MPD8lMNW/earme4OQi1IFHtmHUwAKgghXlNwWi9GO7QkTfD+IIaYpIai4m2YJEzqfEji3jFHX1DZI5pbY/biQ==} + engines: {node: '>=6'} + + '@fortawesome/free-regular-svg-icons@6.6.0': + resolution: {integrity: sha512-Yv9hDzL4aI73BEwSEh20clrY8q/uLxawaQ98lekBx6t9dQKDHcDzzV1p2YtBGTtolYtNqcWdniOnhzB+JPnQEQ==} + engines: {node: '>=6'} + + '@fortawesome/free-solid-svg-icons@6.6.0': + resolution: {integrity: sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA==} + engines: {node: '>=6'} + + '@git.zone/tsbuild@2.1.84': + resolution: {integrity: sha512-OR7c06zfsOnqn693ITJnk9B6Yrei/Qa+0c6vp3ixHRGqh1VYUdI5GOIESC4uk8j4R5komR+uou9Jq8IWYkdjIw==} + hasBin: true + + '@git.zone/tsbundle@2.0.15': + resolution: {integrity: sha512-ZrPkScaBQ7hHx6BUchRFfPB9tvb7RlNXwjk9qjkp6AcBcF38JgLcu/UDKDqRsuaFJpkK9oclyhA5bDA7SjXWZg==} + hasBin: true + + '@git.zone/tsrun@1.2.49': + resolution: {integrity: sha512-RnUDdny6jAuuBLx7HqUE38JsHx9nnUUYkDM5vAOREoc6oCI9XVM0QeqIdwFmDz6eeDLBH1+yqjSQPoW5UvflJA==} + hasBin: true + + '@git.zone/tswatch@2.0.23': + resolution: {integrity: sha512-ADloBDzuyyOjzDLwOVx+5lBEKJdx+r58Qat+oCDOOlRMwDOJcjI4qQOU8PVzFYCh7otraia6aNeXWXfKgKA92g==} + hasBin: true + + '@gitzone/tsrun@1.2.44': + resolution: {integrity: sha512-7AfL9u+TmD7gLiRaTCimhWm5rq9GGBQnOF4q1FnFh2CAb1FbK5fzUVbj6wo3zGS2H+MSm6dqFA6mvdBI1ox0mQ==} + hasBin: true + + '@happy-dom/global-registrator@8.9.0': + resolution: {integrity: sha512-Kw/YMNv1kmH862kQUzXM6K0Y4AW5b0I/+2EIopVc7edurBwY8LHSKd5gJzEEQvdgapSeDJowhOCgL0tkhJWi4A==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@lit-labs/ssr-dom-shim@1.2.1': + resolution: {integrity: sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==} + + '@lit/reactive-element@1.6.3': + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + + '@lit/reactive-element@2.0.4': + resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@mixmark-io/domino@2.2.0': + resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + + '@mongodb-js/saslprep@1.1.9': + resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@push.rocks/consolecolor@2.0.2': + resolution: {integrity: sha512-IBwxCLX+YF3f5wB2N4LfuvFqm9WPlBMiEeSAfjN8YQCyYec6u1hlrR3EIj8vT300pppjeGrybJHK+GyjdGXZJw==} + + '@push.rocks/early@4.0.4': + resolution: {integrity: sha512-ak6/vqZ1PlFV08fSFQ6UwiBrr+K6IsfieZWWzT7eex1Ls6GvWEi8wZ3REFDPJq/qckNLWSgEy0EsqzRtltkaCA==} + + '@push.rocks/isohash@2.0.1': + resolution: {integrity: sha512-UulhEui8O9Ei9fSqTldsB73TUmAFNqEBk82tHsJSLLpNK9gJZQE82iaSNsQUakoUQ2c9KueueMfwC3IoDaYRrQ==} + + '@push.rocks/isounique@1.0.5': + resolution: {integrity: sha512-Z0BVqZZOCif1THTbIKWMgg0wxCzt9CyBtBBqQJiZ+jJ0KlQFrQHNHrPt81/LXe/L4x0cxWsn0bpL6W5DNSvNLw==} + + '@push.rocks/lik@6.0.15': + resolution: {integrity: sha512-rZxln6l4NAU931MTxnsjy1pue+S3AXtDCidHH/tbkqBtrWIzWuXduo6Nz3zYkndbD64Knyta7F60JRvcOe4XqA==} + + '@push.rocks/mongodump@1.0.8': + resolution: {integrity: sha512-oDufyjNBg8I50OaJvbHhc0RnRpJQ544dr9her0G6sA8JmI3hD2/amTdcPLVIX1kzYf5GsTUKeWuRaZgdNqz3ew==} + + '@push.rocks/projectinfo@5.0.2': + resolution: {integrity: sha512-zzieCal6jwR++o+fDl8gMpWkNV2cGEsbT96vCNZu/H9kr0iqRmapOiA4DFadkhOnhlDqvRr6TPaXESu2YUbI8Q==} + + '@push.rocks/qenv@6.0.5': + resolution: {integrity: sha512-Id/eSKKqSDUGe+0Cp5HEJ58J1iVv1jQseLUMs9kFTPYwG+NJSETUCRsJV50w5cPv8bRFcSkSU+xVbUbOc1p29A==} + + '@push.rocks/smartbuffer@3.0.4': + resolution: {integrity: sha512-TLfhx/JD61YC8XGO9TI6Ux6US38R14HaIM84QT8hZZod8axfXrg+h8xA8tMUBpSV8PXsQy9LzxmOq0Il1fmDXw==} + + '@push.rocks/smartcache@1.0.16': + resolution: {integrity: sha512-UAXf74eDuH4/RebJhydIbHlYVR3ACYJjniEY/9ZePblu7bIPgwFZqLBE9g1lcKVogbH9yY62dk3rSpgBzenyfQ==} + + '@push.rocks/smartchok@1.0.34': + resolution: {integrity: sha512-YzFjUbyzYREFDc4khcySObLzB21R98yIRFvpu3cB2kRmhEfVD2IEO6Wzp4aWFMhkq5A/dDBJRNmRPtgMVGNqKA==} + + '@push.rocks/smartcli@4.0.11': + resolution: {integrity: sha512-KDWfUqWBoUZsOEtsDx36d6qc8GG7Zo5E+HHamYY68KVDO8BMu6jbBucoUUPDksczLEmbXKLmroBP1mn/xozQOA==} + + '@push.rocks/smartcrypto@2.0.4': + resolution: {integrity: sha512-1+/5bsjyataf5uUkUNnnVXGRAt+gHVk1KDzozjTqgqJxHvQk1d9fVDohL6CxUhUucTPtu5VR5xNBiV8YCDuGyw==} + + '@push.rocks/smartdata@5.2.10': + resolution: {integrity: sha512-ZknoguU4O6NwPUMHEyVANHzbRYqHV05iYa3fV/ISKP+JJZQsZzm8qgFWpfRMeN3ljzqvdo6hy+RdU5g29kgZKg==} + + '@push.rocks/smartdelay@3.0.5': + resolution: {integrity: sha512-mUuI7kj2f7ztjpic96FvRIlf2RsKBa5arw81AHNsndbxO6asRcxuWL8dTVxouEIK8YsBUlj0AsrCkHhMbLQdHw==} + + '@push.rocks/smartdns@5.0.4': + resolution: {integrity: sha512-DCeekCzAJEPn8gZOPZLnFGFZdgLKtCqb3YfwJpfkdSfPxwlSXzjs5rYmzmsg0BlQP+7pSR43fuLMERB4DGCn9w==} + + '@push.rocks/smartenv@5.0.12': + resolution: {integrity: sha512-tDEFwywzq0FNzRYc9qY2dRl2pgQuZG0G2/yml2RLWZWSW+Fn1EHshnKOGHz8o77W7zvu4hTgQQX42r/JY5XHTg==} + + '@push.rocks/smartexit@1.0.23': + resolution: {integrity: sha512-WmwKYcwbHBByoABhHHB+PAjr5475AtD/xBh1mDcqPrFsOOUOZq3BBUdpq25wI3ccu/SZB5IwaimiVzadls6HkA==} + + '@push.rocks/smartfeed@1.0.11': + resolution: {integrity: sha512-02uhXxQamgfBo3T12FsAdfyElnpoWuDUb08B2AE60DbIaukVx/7Mi17xwobApY1flNSr5StZDt8N8vxPhBhIXw==} + + '@push.rocks/smartfile-interfaces@1.0.7': + resolution: {integrity: sha512-MeOl/200UOvSO4Pgq/DVFiBVZpL9gjOBQM+4XYNjSxda8c6VBvchHAntaFLQUlO8U1ckNaP9i+nMO4O4/0ymyw==} + + '@push.rocks/smartfile@10.0.41': + resolution: {integrity: sha512-xOOy0duI34M2qrJZggpk51EHGXmg9+mBL1Q55tNiQKXzfx89P3coY1EAZG8tvmep3qB712QEKe7T+u04t42Kjg==} + + '@push.rocks/smartfile@11.0.21': + resolution: {integrity: sha512-ZtF8QPGeR/2MJxtHgJY1+FLrOZ+GTLWqwyDz7Woq1x+K9nb4almA1OpdW5IQPBK3ECHur0ghg5bzzKMuR5ZSzg==} + + '@push.rocks/smartguard@3.1.0': + resolution: {integrity: sha512-J23q84f1O+TwFGmd4lrO9XLHUh2DaLXo9PN/9VmTWYzTkQDv5JehmifXVI0esophXcCIfbdIu6hbt7/aHlDF4A==} + + '@push.rocks/smarthash@3.0.4': + resolution: {integrity: sha512-HJ/fSx41jm0CvSaqMLa6b2nuNK5rHAqAeAq3dAB7Sq9BCPm2M0J5ZVDTzEAH8pS91XYniUiwuE0jwPERNn9hmw==} + + '@push.rocks/smarti18n@1.0.4': + resolution: {integrity: sha512-bHIi9Iuzp2cbux9q79ZK5jOQYPsYJ9zDDS4p/xEPQH31gr0mcFRosLSQb1kvDQDVmUhI0ADlQMqr2ui9zEXQHA==} + + '@push.rocks/smartjson@5.0.20': + resolution: {integrity: sha512-ogGBLyOTluphZVwBYNyjhm5sziPGuiAwWihW07OSRxD4HQUyqj9Ek6r1pqH07JUG5EbtRYivM1Yt1cCwnu3JVQ==} + + '@push.rocks/smartjwt@2.2.1': + resolution: {integrity: sha512-Xwau9o8u7kLfSGi5v+kiyGB/hiDPclZjVEuj69J0LszO9nOh4OexYizKIOgOzKQMqnYQ03Dy35KqP9pdEjccbQ==} + + '@push.rocks/smartlog-destination-devtools@1.0.12': + resolution: {integrity: sha512-zvsIkrqByc0JRaBgIyhh+PSz2SY/e/bmhZdUcr/OW6pudgAcqe2sso68EzrKux0w9OMl1P9ZnzF3FpCZPFWD/A==} + + '@push.rocks/smartlog-destination-local@9.0.2': + resolution: {integrity: sha512-htzIY+4+hU61Z2J4Oz+IHnAB3RGe+fpS0VKCKnAoppZqzMWnJ3UOgYIyr4djDBy2WtgpXV/16KdisKrOmwuuvw==} + + '@push.rocks/smartlog-interfaces@3.0.2': + resolution: {integrity: sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==} + + '@push.rocks/smartlog@3.0.7': + resolution: {integrity: sha512-WHOw0iHHjCEbYY4KGX40iFtLI11QJvvWIbC9yFn3Mt+nrdupMnry7Ztc5v/PqO8lu33Q6xDBMXiNQ9yNY0HVGw==} + + '@push.rocks/smartmail@1.0.24': + resolution: {integrity: sha512-UUIKQmMiCpcnkql4uoPp0kDRDnGl1jV5UbacRkoaKHh6PPd4trkZRVcVQadtpEqteFb6W0B9Z/YtMKpTPxUsxA==} + + '@push.rocks/smartmanifest@2.0.2': + resolution: {integrity: sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==} + + '@push.rocks/smartmarkdown@3.0.3': + resolution: {integrity: sha512-9KhKZxDQKPk4P/2CYdVqJa5dpGfTA8w1cxqoVZL3e8RPA7EGxbdYEqMp0n2d9mth0btk/m0KHHV+G09LfCVeBw==} + + '@push.rocks/smartmatch@2.0.0': + resolution: {integrity: sha512-MBzP++1yNIBeox71X6VxpIgZ8m4bXnJpZJ4nWVH6IWpmO38MXTu4X0QF8tQnyT4LFcwvc9iiWaD15cstHa7Mmw==} + + '@push.rocks/smartmime@1.0.6': + resolution: {integrity: sha512-PHd+I4UcsnOATNg8wjDsSAmmJ4CwQFrQCNzd0HSJMs4ZpiK3Ya91almd6GLpDPU370U4HFh4FaPF4eEAI6vkJQ==} + + '@push.rocks/smartmime@2.0.2': + resolution: {integrity: sha512-aXH1sFD73q9cEwPdeSeN7Zxd2aoVt9wE97ILFCW5gORylvm85Hgfq7SYkqykjQzEL8IDJKJF3G78+xcL2rALTg==} + + '@push.rocks/smartmongo@2.0.10': + resolution: {integrity: sha512-K6jereWHHuEoTIlDDC3zum8DZYHzB74LCXx85+RSeKa8aeP9XYvGEbuIAr/e1MuX4WGZeHt6w2458dgyDW4w1w==} + + '@push.rocks/smartmustache@3.0.2': + resolution: {integrity: sha512-G3LyRXoJhyM+iQhkvP/MR/2WYMvC9U7zc2J44JxUM5tPdkQ+o3++FbfRtnZj6rz5X/A7q03//vsxPitVQwoi2Q==} + + '@push.rocks/smartntml@2.0.4': + resolution: {integrity: sha512-cO1190fQsGZu5ycar1C6i7gCC16y/ywc8Ipn+aTKpDMMLO2HMuCvTurMBgjT0NeD8ZEXjc/yZ7n0m3KTxw6NSg==} + + '@push.rocks/smartobject@1.0.12': + resolution: {integrity: sha512-xSMiqXiZXXUOixT3QIPsOUKOWjL3YA/1h9/YTiCzqs5C0D3tyfTbojnfcp6YbKZoBzans2I5LghaDHsGid2DKQ==} + + '@push.rocks/smartopen@2.0.0': + resolution: {integrity: sha512-eVT0GhtQ2drb95j/kktYst/Toh1zCwCqjTJFYtaYFUnnBnBUajPtBZDFnPQo01DN8JxoeCTo8jggq+PCvzcfww==} + + '@push.rocks/smartpath@5.0.18': + resolution: {integrity: sha512-kIyRTlOoeEth5b4Qp8KPUxNOGNdvhb2aD0hbHfF3oGTQ0xnDdgB1l03/4bIoapHG48OrTgh4uQ5tUorykgdOzw==} + + '@push.rocks/smartpromise@4.0.4': + resolution: {integrity: sha512-Mbh+DnX4+rVPEZgYU7LtTJI/AYoNn7+h27AycEFpPJW41DCfjTiXiI0+ecNdyO1AfbcL0Q02RQjoEauEWx5FQg==} + + '@push.rocks/smartrequest@2.0.22': + resolution: {integrity: sha512-EfgmdEsLtDJ8aNOLOh59ca1NMsiiFz54aoHRigQFQ0cuoUs6phxejIY2FdMoPFn68ubTpkztdL2P4L1/cRYyHg==} + + '@push.rocks/smartrouter@1.0.16': + resolution: {integrity: sha512-GsEv6paOuIbC3vkIS5LxNroK68mNygB+oSDJRaUOE8/OCJLk0aPfI579nEiuXP/DkGjC1SjQ2bUWc3BTaUM3GQ==} + + '@push.rocks/smartrx@3.0.7': + resolution: {integrity: sha512-qCWy0s3RLAgGSnaw/Gu0BNaJ59CsI6RK5OJDCCqxc7P2X/S755vuLtnAR5/0dEjdhCHXHX9ytPZx+o9g/CNiyA==} + + '@push.rocks/smartshell@3.0.6': + resolution: {integrity: sha512-j3SgNyq1K3i7NVk5a2+5QkG/9ac30eC3OsOAMXVxOczYceMXRiXIr9yow3t/+na14/zSYd8He2N0vYPtYqKeSQ==} + + '@push.rocks/smartsitemap@2.0.3': + resolution: {integrity: sha512-jIcms8V1b2mt3dS4PKNlLR1DRC8pCDWMRVbnyM/2+snZOJZonQRlQzAyX8No0EfLbfdrfnxv2IjPX13X29Re6g==} + + '@push.rocks/smartsocket@2.0.27': + resolution: {integrity: sha512-planM3EkBvx/+guLLWHLBNnNp4mcWDwp1k9G0It0ul7IhdaBQsSWzKSQJxym3Bx2dypgA2UIeT3/hRvSa5Nqdw==} + + '@push.rocks/smartspawn@3.0.3': + resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} + + '@push.rocks/smartstate@2.0.17': + resolution: {integrity: sha512-ucx0zq8gWL3MuN4ogibUiGJlEH0of9WyDfxu+4pQySEdaZBJw0/UFkBM8wButkj0dF8w4wsVMN4YwZAdVqsAXg==} + + '@push.rocks/smartstream@2.0.8': + resolution: {integrity: sha512-GlF/9cCkvBHwKa3DK4DO5wjfSgqkj6gAS4TrY9uD5NMHu9RQv4WiNrElTYj7iCEpnZgUnLO3tzw1JA3NRIMnnA==} + + '@push.rocks/smartstream@3.0.44': + resolution: {integrity: sha512-BZwSUmhVD/CEzRdG/e2UachlyNjshiknqBnwHzIFPIjVKC66UgWX5lYCs2LOwJtuUEpfL1vTMOAYUFNcmPjW9A==} + + '@push.rocks/smartstring@4.0.15': + resolution: {integrity: sha512-NTNeOjWyg+aHtBTiQEyXamr7oTvYZ3wS1fudHo9ua7CLrykpK+i+RxFyJaLg1zB5x9xQF3NLEQecB14HPFX8Cg==} + + '@push.rocks/smarttime@4.0.8': + resolution: {integrity: sha512-He+1ebBowVd8rW+VHZMFmz407xVMQf/JbyKr3s1ozoIlJS1AhZpDvlkzyqLV2tNMP1/cEBeo25ImJN2x1pksBA==} + + '@push.rocks/smartunique@3.0.9': + resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==} + + '@push.rocks/smarturl@3.0.7': + resolution: {integrity: sha512-nx4EWjQD9JeO7QVbOsxd1PFeDQYoSQOOOYCZ+r7QWXHLJG52iYzgvJDCQyX6p705HDkYMJWozW2ZzhR22qLKbw==} + + '@push.rocks/smartxml@1.0.8': + resolution: {integrity: sha512-idrPsBj9t6oxkLZJZgWtyZK6PnQ5BVDbBErk0UfGanXgSWJc+ZEKNYjVqr850+Na3+y0CT6AQdug7pnaokygwg==} + + '@push.rocks/smartyaml@2.0.5': + resolution: {integrity: sha512-tBcf+HaOIfeEsTMwgUZDtZERCxXQyRsWO8Ar5DjBdiSRchbhVGZQEBzXswMS0W5ZoRenjgPK+4tPW3JQGRTfbg==} + + '@push.rocks/taskbuffer@3.1.7': + resolution: {integrity: sha512-QktGVJPucqQmW/QNGnscf4FAigT1H7JWKFGFdRuDEaOHKFh9qN+PXG3QY7DtZ4jfXdGLxPN4yAufDuPSAJYFnw==} + + '@push.rocks/webjwt@1.0.9': + resolution: {integrity: sha512-IhWAv0hxfXbLbmQHHOGr96Oe3H1kB0OTtDofM8N+9qhJeKxTHfF2pUrdpck6btAQQbaBY2D7xtHvumrIXU5HIg==} + + '@push.rocks/webrequest@3.0.37': + resolution: {integrity: sha512-fLN7kP6GeHFxE4UH4r9C9pjcQb0QkJxHeAMwXvbOqB9hh0MFNKhtGU7GoaTn8SVRGRMPc9UqZVNwo6u5l8Wn0A==} + + '@push.rocks/websetup@3.0.19': + resolution: {integrity: sha512-iKJDwXdMmQdu5siOIgziPRxM51lN1AU9HOr+yMteu1YMDkZT7HKCyisDAr4gC9WZ9a7FzsG8zgthm4dMeA8NTw==} + + '@push.rocks/webstore@2.0.20': + resolution: {integrity: sha512-Z3L4OHGcw/Gs9aXpMUwebEPTh0nK/C7R6YwPfCLcGVu9yd/ZShaQ8QZEYE243Cu9J1Mn+CEtz4jpPLnHiizHQA==} + + '@push.rocks/webstream@1.0.10': + resolution: {integrity: sha512-45CcR0I4/9v0qSjLvz2dYTGMkR0YP3x66ItpStdad5hidJm86t1lfHF06d0oiEvJTpvQkeyIX/8YKAumf21d/Q==} + + '@pushrocks/isohash@2.0.1': + resolution: {integrity: sha512-qCvC/NNcDDFQAH1uUKkJM779jY5qWijbOGGVf/9enfSItlkKe/rheUsYHgXg+cP7lwWFIxDbKYplq8QaOP6bkw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/isohash + + '@pushrocks/isounique@1.0.5': + resolution: {integrity: sha512-XYeoKGkmIdsWX64NlPA1fuA41n/1bQ7LdYXytlU/QqYeW7ojgA0ARRhBSh/2phL6o0Jpw6K/7gJ8jc7ab/Tc+w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/isounique + + '@pushrocks/lik@3.0.19': + resolution: {integrity: sha512-N9uTtQmTJ/iZ/V7LMCKbVx/ZAmP+b8uId0pxV9Au9T0Ulu9wcg3vNpyTQARgdWfG+tI9Qc0NHgOEa9H5mbDcDA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/lik + + '@pushrocks/lik@5.0.7': + resolution: {integrity: sha512-fIxcrafl127+yErfedIurafCbiY2VwuuMlbNLjKrMKnFswol4y/anjXVRZ4euWUBck0KOfnBB0VuutcmlfYUqA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/lik + + '@pushrocks/lik@6.0.2': + resolution: {integrity: sha512-jO85PCb4gULfZbLoVpXb9HIR9Wgoigq6Zjcp1JqHOgM4KB38IZrU+HPWPWWMErAOOQmmYvVCdl4gkrkO/Rzn4w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/lik + + '@pushrocks/smartcache@1.0.16': + resolution: {integrity: sha512-bKtueWrRHs4Rlink81MpNUDpnXqoPy+7sdw/WQWKzlWfDWLzF/cO24efriNP+3O2W84MvfSzxliRcbxxPvefLA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartcache + + '@pushrocks/smartchok@1.0.23': + resolution: {integrity: sha512-l1owj/ZYfP3chD5Gm3dkxucdpVRYiqyn/bLgCmtBZY0Q4EAvsu+bUJQ8qixiPiKYpjyIg0ZUKlCeDzZJc+G3Xg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartchok + + '@pushrocks/smartdelay@2.0.13': + resolution: {integrity: sha512-s6Wh0BHWMfZ5VYONQwpxOYX1JeC9RKA0O9TxEzfZ6FCw2oNQb2QUPCixT9rsceKwva4+atKRw/RfU+Z7aJDmsA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartdelay + + '@pushrocks/smartdelay@3.0.1': + resolution: {integrity: sha512-I+i/QhC6kLsXsWyW19UgD1vH2r1YWVxK19VMxt2CEuvxMyC6tuCd0vqud9vv5JxaxsJwxWlOsrURkgL4tXeILQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartdelay + + '@pushrocks/smartenv@5.0.5': + resolution: {integrity: sha512-VWON1OJ4qV2/9hzJbgRquRekaO9am3b8W82tgCwgO6LBg23ea2tanfd+gESVMbRFduxHVoFLvlhSBcDGM5zsLA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartenv + + '@pushrocks/smarterror@2.0.1': + resolution: {integrity: sha512-3OrF5me+/sy5VgwR/tfCqs7qhb0Ywzgn8tTThRUZnCGas0aindISzMiW7cIro3RlFykmtPmdTztC9Ostu2ioeA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarterror + + '@pushrocks/smartexpress@4.0.35': + resolution: {integrity: sha512-/xuUshI4VtfM2Q8RJxsTjD/7sI2HZ4p4+CmKOZYK66nxgeyO+IkKM/qcxHdZLbuB2q/ekYNAfvce8VL0RxtTVQ==} + deprecated: This package has been replaced by @apiglobal/typedserver + + '@pushrocks/smartfeed@1.0.11': + resolution: {integrity: sha512-PcsiQ4tkwTpGxOdLiEpAR5vfFpn8Utnlind4mmX+FLIZVuuONaApefWMvaYv5ysmfnWQuCE2qkFq1J5ulDcBbQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartfeed + + '@pushrocks/smartfile-interfaces@1.0.7': + resolution: {integrity: sha512-C/v9Scbx1J+ByMk3YBZrlLRYXdObty/Uz/h6kSZqsO8ghYuT9l7OVpEcyduiSVPakaMi6YnzfME3Nfs3oLj//Q==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartfile-interfaces + + '@pushrocks/smartfile@10.0.26': + resolution: {integrity: sha512-JAbsVHXCkBoqI+GHN/gnbXji8hztCVlPrri63HQAdx4lS9OyDCdXN2CSbEIBXQIsXFx9ITzx5LZiPq0owbcDpQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartfile + + '@pushrocks/smartfile@9.0.6': + resolution: {integrity: sha512-mXFrnHpM3Eq0MLokGP6DDRTk+v/HDlQwnNq4HFuCqs8YW6uTU/FoRJDnrCAf+spSzkDm0m1ajz/4rke8Dk9l6A==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartfile + + '@pushrocks/smarthash@2.1.10': + resolution: {integrity: sha512-f6lnQPa2lmkSQOMvWwZ6R6wcNvbDWuXH5OhQNvwmog8af3hBEmOEXxjauj6XU+l7ICJ6qxr3wsvpt4y7Ogyc9A==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarthash + + '@pushrocks/smarthash@3.0.2': + resolution: {integrity: sha512-jXW4f8k6iqOQRvkCmXMID1C+qXyNvUMKm7apPETxnO+L172VlzxP1dml0Ey1+vjfpU2luKCteJWX7W95sOdLDg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarthash + + '@pushrocks/smartjson@4.0.6': + resolution: {integrity: sha512-lykr068RSDHs0+EXCvIDVxjKnDtRQ2M7EXOo5jVrUU6/OEdfRl9ErM1K/oPafiEi47/PtTrwLlp1KdSgqkRjmg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartjson + + '@pushrocks/smartjson@5.0.6': + resolution: {integrity: sha512-9OJbnRgLTaCRQz+pqu5tB3ZCqRs5Zh0hnBe7t7URE+TgwIZ8aiELUIbWRkgn4mSGVzHyL6pqTyIowP6AjUCG3w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartjson + + '@pushrocks/smartlog-destination-devtools@1.0.10': + resolution: {integrity: sha512-Kkss3lAogY+n/Xx3N9eOjWz0L4XUWlCYZLOqWnDOIMzX5mJtwesYXHIT8SHvADv13qT4d7T9k+VUQNsDEoT71g==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartlog-destination-devtools + + '@pushrocks/smartlog-interfaces@2.0.23': + resolution: {integrity: sha512-tXqwfrekGxGZJB72BFQppywk7413hXVDgcJNeU+kY6xvmzVjf2HxOMbFYhewh1+p4uai1u9n0xcMb0qbbPy4/Q==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartlog-interfaces + + '@pushrocks/smartlog-interfaces@3.0.0': + resolution: {integrity: sha512-yjppiLLJHBcrXTJJusDbFTvHq0RTMl3LnhvWAhyyy8U0O4VkJxIls1t5mS6jsEwxogP88+0flQIWknNJeB913A==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartlog-interfaces + + '@pushrocks/smartlog@3.0.2': + resolution: {integrity: sha512-1WPA0LX9HfE54ESKtk32uvsXiYIMu2QX7NUlQ3uHSMmFULnJYo2m/LeKEf6qHH7DJtxZbkWzkrMOkZVPL1MeNg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartlog + + '@pushrocks/smartmanifest@1.0.8': + resolution: {integrity: sha512-inHmTp58Z8xl+c6mdOrfxc9IjUKuqho1i+WUI74G7rn6HwEn3cMd/06R1v80Xlx+95EYWzBwnYtuo7j7DafrdQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartmanifest + + '@pushrocks/smartmanifest@2.0.2': + resolution: {integrity: sha512-q5QMWTUO9vv59IksUc24isVbOLyde4CU5TwGT01WrzflCStH9MLgPOo5JoPz04UjokxpsFbFqGcPnWUr37toyw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartmanifest + + '@pushrocks/smartmatch@1.0.7': + resolution: {integrity: sha512-D+lK5HIKO4Kj1Jm/ycKvy1VzDJ3V6ucHqmf5DMBFdm18BrMj2Zb6M7wN8HUKtkfHvOI7ig85JMuANSEyO7kAPg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartmatch + + '@pushrocks/smartmatch@2.0.0': + resolution: {integrity: sha512-PLvBNVeuY9BERNLq3PFDkhnHHc0RpilEGHd4aUI5XRFlZF++LETdLxPbxw+DHbvHlkUf/nep09f7rrL9Tqub1Q==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartmatch + + '@pushrocks/smartmime@1.0.5': + resolution: {integrity: sha512-FCRg5p5NFTyZnPsvy2sbheVGz67Zeno7VoZARrcP0O+hFtVPnQKnJ73ze11G+MKZ3dVCmYCh1Li+73R6Lx8XJA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartmime + + '@pushrocks/smartopen@2.0.0': + resolution: {integrity: sha512-pqglAbp/OiJ8nUlCLKq8A2n1tKi7WH9lJgV93fs5s4gZCTVijGRg1SMZNAa/OI2O5hRfBeXacu/Na6bQSJ3hyw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartopen + + '@pushrocks/smartpath@4.0.3': + resolution: {integrity: sha512-KWz4DWOrB0sPfk6L4i+CPOo+UK5HXNaLI7ZAaqJe1nEWoDrpyeds1dNDaqVAmSgX4riLGxVpslKH5MnABCPsPg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpath + + '@pushrocks/smartpath@5.0.5': + resolution: {integrity: sha512-t2lXXGMpKnPlwubIcYGD6cGi2CUJxJ3t2yftVt8tHfjX68jELA5sJhFMtyD3AeFZVxePFZOCiHwWEbWkSDNnmw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpath + + '@pushrocks/smartpromise@3.1.10': + resolution: {integrity: sha512-VeTurbZ1+ZMxBDJk1Y1LV8SN9xLI+oDXKVeCFw41FAGEKOUEqordqFpi6t+7Vhe/TXUZzCVpZ5bXxAxrGf8yTQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpromise + + '@pushrocks/smartpromise@4.0.2': + resolution: {integrity: sha512-bqorOaGXPOuiOSV81luTKrTghg4O4NBRD0zyv7TIqmrMGf4a0uoozaUMp1X8vQdZW+y0gTzUJP9wkzAE6Cci0g==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpromise + + '@pushrocks/smartrequest@1.1.56': + resolution: {integrity: sha512-iF6bApmTgd3ZvRK8OHa77UFg8nVZxS1Y6iL8VfHpWOXdSlQZcXo/WbvwxYtu0+wkERAfFtCTGrrLAPGsFm9lhw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartrequest + + '@pushrocks/smartrequest@2.0.15': + resolution: {integrity: sha512-QDXXKhOwAIp+TNFrDglApBpbCTClHrf8pUM3w81q5+VtrMbqUrLINHhInXt3ZUSgTS7RD9HtJSIVSqAukcJo5A==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartrequest + + '@pushrocks/smartrouter@1.0.16': + resolution: {integrity: sha512-x5lMYOk9Wh6pS7LrGlpmXQ88ObnXi5wC1svQLnS5XraEjiSUhYAIbsM5QJ5YX4VSdhKZ9n59fsdA7/idg9BEYQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartrouter + + '@pushrocks/smartrx@2.0.27': + resolution: {integrity: sha512-aFRpGxDZgHH1mpmkRBTFwuIVqFiDxk22n2vX2gW4hntV0nJGlt9M9dixMFFXGUjabwX9hHW7y60QPJm2rKaypA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartrx + + '@pushrocks/smartrx@3.0.2': + resolution: {integrity: sha512-uh2ByyE86Q4f1/rpktR29vAMzHgAvAhFZqbvP6Sme9FK57OZG0mqZxDvJMVNP5O+QOn0Chrbl3BZCuRsFF3NUA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartrx + + '@pushrocks/smartsitemap@2.0.1': + resolution: {integrity: sha512-eB4ybrhUtJaoqDY3P76NIp6gbIOGzLJPwqkMGo2d8dcJftqlySZxalsZTLOIHqLzQXYwSxuKo2JYGrjokx83Vw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartsitemap + + '@pushrocks/smartsocket@2.0.19': + resolution: {integrity: sha512-ZCmnUKnXMxD99mZkpXHkCN5uJTy/x3ScfRQ6qS1PKPjKxSdt6SPmeJqP5NKBhLlKd4QcE12zoJvlSZf/4eDd1w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartsocket + + '@pushrocks/smartstate@2.0.6': + resolution: {integrity: sha512-r/eHEFbC9jJgvtUFwiox+cRsDbQ6ce9IMgKHIR4BjTVC+Z9L7bD6o9SC7KHc8SLqUTPI5Is6q8O4wEe5qK0Caw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartstate + + '@pushrocks/smartstream@2.0.3': + resolution: {integrity: sha512-Zz1amk2FgqWyZFQE8WonKhNMreETm50pqDanp2g9uJBCNwFHIppJD4Qbpy/FFEFfp4Rs326hoBCWbZwU/FEymw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartstream + + '@pushrocks/smartstring@4.0.7': + resolution: {integrity: sha512-TxHSar7Cj29E+GOcIj4DeZKWCNVzHKdqnrBRqcBqLqmeYZvzFosLXpFKoaCJDq7MSxuPoCvu5woSdp9YmPXyog==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartstring + + '@pushrocks/smarttime@3.0.50': + resolution: {integrity: sha512-44NgDuNukCQIlPJFNORcDugp36Yj6HT6eZEWtn4M4HKlTFCQ8De+ztwGg+gRceucJ202zqLRKrXoh8dVdS3BaQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarttime + + '@pushrocks/smarttime@4.0.1': + resolution: {integrity: sha512-5SpUqD3X/2IZCTezCpk48Ss7cDc9QOuQAkeAYnJrRjDL4UCLakA3lBeHXRD/rsIB7S1smtXlayQ/vizfYzdbfw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarttime + + '@pushrocks/smartunique@3.0.3': + resolution: {integrity: sha512-f+c3s2WzzjASoRHyYTLU0kHDVWREg4sZVdi5L42bTA3CTUWNrcGUC62h4wP4U4BiPl3bopTr3LPhClZHJ738oA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartunique + + '@pushrocks/smarturl@2.0.1': + resolution: {integrity: sha512-6KGnf2vHR7hW4mQpAD7gkDVL3QVML3jb/No/Uw+qCqvs0TaQr60Yjm+CXoLxJNCKwmrL+I1yx8mhAHBHfYJiJA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarturl + + '@pushrocks/smarturl@3.0.6': + resolution: {integrity: sha512-YHWnYE1mm8WIJk1usSXg+kNM7s7ByM+PKApO9cgl0T/oGybjzAJiO3clGNDro4ysP0TD+WuvJuiVue02bErEBQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarturl + + '@pushrocks/smartxml@1.0.6': + resolution: {integrity: sha512-Cy//pxzdpplqE64h9/sAwvAkUBv9t3Nw9v6k2c+erXH779iOtuyGiiyWqgbRTX1wo2CRhMJqWGJx6xd2Ljq5kw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartxml + + '@pushrocks/smartyaml@2.0.5': + resolution: {integrity: sha512-nJGqvJ56vAst5evLqaPYQ4mO5uJVnXVlriyL3D6s89YMUoWGS3qj/jK+V8hDgznFCnd46pNjnc0GfQBCDpZ6eg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartyaml + + '@pushrocks/streamfunction@4.0.4': + resolution: {integrity: sha512-qnGs9cNkUq7nnluQCuX4te+NeB3RoikNNs+kbSCZCSnwYQWvoHXMeobkK8GXAC1bE3kWKAd68ja8cuLvaDebBg==} + + '@pushrocks/webrequest@3.0.28': + resolution: {integrity: sha512-V7mRb0RC36GkbCvZv0d2p1Uiu/4+xA74IHTP5Hjw0dWYHnIsagcgf9E8Nie3Fo7w3gfQ3BtkHo+LtazwnAh0OQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/webrequest + + '@pushrocks/websetup@3.0.19': + resolution: {integrity: sha512-cxPXyEhTu2TRFPa36QQJJWrR46f4BmLAJD57cBA6d/zhnzJzv7g6ThT1ZFFzDEOgzRh3F8KrFbqlbY+l/cReHA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/websetup + + '@pushrocks/webstore@2.0.8': + resolution: {integrity: sha512-gvZ5QnZu14bPIWaFDOCyH6pfPgN/nQ0hF3EFhE74Ypfm5dCzq6OZEC9jeUTXDypfsvbSs3xAgj4XG83sVSUDAg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/webstore + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@serve.zone/interfaces@1.0.81': + resolution: {integrity: sha512-ra0pALnvhYut2Ts55BHWKv8q1ysjf84AS0cG/Pi8FB53/OqCnaaETr2qJrAETa6OcuDDDm++R0KVZm+R5evbwQ==} + + '@serve.zone/platformclient@1.0.6': + resolution: {integrity: sha512-ySsZy05nu5OjDO4fFYYD1b/0NTOtLTSEynae/lsJXbjduvNj5fEcXZBZhnkUhboxjiksVawnAJgiTLT2qPneWw==} + + '@smithy/abort-controller@3.1.4': + resolution: {integrity: sha512-VupaALAQlXViW3/enTf/f5l5JZYSAxoJL7f0nanhNNKnww6DGCg1oYIuNP78KDugnkwthBO6iEcym16HhWV8RQ==} + engines: {node: '>=16.0.0'} + + '@smithy/config-resolver@3.0.8': + resolution: {integrity: sha512-Tv1obAC18XOd2OnDAjSWmmthzx6Pdeh63FbLin8MlPiuJ2ATpKkq0NcNOJFr0dO+JmZXnwu8FQxKJ3TKJ3Hulw==} + engines: {node: '>=16.0.0'} + + '@smithy/core@2.4.6': + resolution: {integrity: sha512-6lQQp99hnyuNNIzeTYSzCUXJHwvvFLY7hfdFGSJM95tjRDJGfzWYFRBXPaM9766LiiTsQ561KErtbufzUFSYUg==} + engines: {node: '>=16.0.0'} + + '@smithy/credential-provider-imds@3.2.3': + resolution: {integrity: sha512-VoxMzSzdvkkjMJNE38yQgx4CfnmT+Z+5EUXkg4x7yag93eQkVQgZvN3XBSHC/ylfBbLbAtdu7flTCChX9I+mVg==} + engines: {node: '>=16.0.0'} + + '@smithy/fetch-http-handler@3.2.8': + resolution: {integrity: sha512-Lqe0B8F5RM7zkw//6avq1SJ8AfaRd3ubFUS1eVp5WszV7p6Ne5hQ4dSuMHDpNRPhgTvj4va9Kd/pcVigHEHRow==} + + '@smithy/hash-node@3.0.6': + resolution: {integrity: sha512-c/FHEdKK/7DU2z6ZE91L36ahyXWayR3B+FzELjnYq7wH5YqIseM24V+pWCS9kFn1Ln8OFGTf+pyYPiHZuX0s/Q==} + engines: {node: '>=16.0.0'} + + '@smithy/invalid-dependency@3.0.6': + resolution: {integrity: sha512-czM7Ioq3s8pIXht7oD+vmgy4Wfb4XavU/k/irO8NdXFFOx7YAlsCCcKOh/lJD1mJSYQqiR7NmpZ9JviryD/7AQ==} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-content-length@3.0.8': + resolution: {integrity: sha512-VuyszlSO49WKh3H9/kIO2kf07VUwGV80QRiaDxUfP8P8UKlokz381ETJvwLhwuypBYhLymCYyNhB3fLAGBX2og==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-endpoint@3.1.3': + resolution: {integrity: sha512-KeM/OrK8MVFUsoJsmCN0MZMVPjKKLudn13xpgwIMpGTYpA8QZB2Xq5tJ+RE6iu3A6NhOI4VajDTwBsm8pwwrhg==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-retry@3.0.21': + resolution: {integrity: sha512-/h0fElV95LekVVEJuSw+aI11S1Y3zIUwBc6h9ZbUv43Gl2weXsbQwjLoet6j/Qtb0phfrSxS6pNg6FqgJOWZkA==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-serde@3.0.6': + resolution: {integrity: sha512-KKTUSl1MzOM0MAjGbudeaVNtIDo+PpekTBkCNwvfZlKndodrnvRo+00USatiyLOc0ujjO9UydMRu3O9dYML7ag==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-stack@3.0.6': + resolution: {integrity: sha512-2c0eSYhTQ8xQqHMcRxLMpadFbTXg6Zla5l0mwNftFCZMQmuhI7EbAJMx6R5eqfuV3YbJ3QGyS3d5uSmrHV8Khg==} + engines: {node: '>=16.0.0'} + + '@smithy/node-config-provider@3.1.7': + resolution: {integrity: sha512-g3mfnC3Oo8pOI0dYuPXLtdW1WGVb3bR2tkV21GNkm0ZvQjLTtamXAwCWt/FCb0HGvKt3gHHmF1XerG0ICfalOg==} + engines: {node: '>=16.0.0'} + + '@smithy/node-http-handler@3.2.3': + resolution: {integrity: sha512-/gcm5DJ3k1b1zEInzBGAZC8ntJ+jwrz1NcSIu+9dSXd1FfG0G6QgkDI40tt8/WYUbHtLyo8fEqtm2v29koWo/w==} + engines: {node: '>=16.0.0'} + + '@smithy/property-provider@3.1.6': + resolution: {integrity: sha512-NK3y/T7Q/Bw+Z8vsVs9MYIQ5v7gOX7clyrXcwhhIBQhbPgRl6JDrZbusO9qWDhcEus75Tg+VCxtIRfo3H76fpw==} + engines: {node: '>=16.0.0'} + + '@smithy/protocol-http@4.1.3': + resolution: {integrity: sha512-GcbMmOYpH9iRqtC05RbRnc/0FssxSTHlmaNhYBTgSgNCYpdR3Kt88u5GAZTBmouzv+Zlj/VRv92J9ruuDeJuEw==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-builder@3.0.6': + resolution: {integrity: sha512-sQe08RunoObe+Usujn9+R2zrLuQERi3CWvRO3BvnoWSYUaIrLKuAIeY7cMeDax6xGyfIP3x/yFWbEKSXvOnvVg==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-parser@3.0.6': + resolution: {integrity: sha512-UJKw4LlEkytzz2Wq+uIdHf6qOtFfee/o7ruH0jF5I6UAuU+19r9QV7nU3P/uI0l6+oElRHmG/5cBBcGJrD7Ozg==} + engines: {node: '>=16.0.0'} + + '@smithy/service-error-classification@3.0.6': + resolution: {integrity: sha512-53SpchU3+DUZrN7J6sBx9tBiCVGzsib2e4sc512Q7K9fpC5zkJKs6Z9s+qbMxSYrkEkle6hnMtrts7XNkMJJMg==} + engines: {node: '>=16.0.0'} + + '@smithy/shared-ini-file-loader@3.1.7': + resolution: {integrity: sha512-IA4K2qTJYXkF5OfVN4vsY1hfnUZjaslEE8Fsr/gGFza4TAC2A9NfnZuSY2srQIbt9bwtjHiAayrRVgKse4Q7fA==} + engines: {node: '>=16.0.0'} + + '@smithy/signature-v4@4.1.4': + resolution: {integrity: sha512-72MiK7xYukNsnLJI9NqvUHqTu0ziEsfMsYNlWpiJfuGQnCTFKpckThlEatirvcA/LmT1h7rRO+pJD06PYsPu9Q==} + engines: {node: '>=16.0.0'} + + '@smithy/smithy-client@3.3.5': + resolution: {integrity: sha512-7IZi8J3Dr9n3tX+lcpmJ/5tCYIqoXdblFBaPuv0SEKZFRpCxE+TqIWL6I3t7jLlk9TWu3JSvEZAhtjB9yvB+zA==} + engines: {node: '>=16.0.0'} + + '@smithy/types@3.4.2': + resolution: {integrity: sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==} + engines: {node: '>=16.0.0'} + + '@smithy/url-parser@3.0.6': + resolution: {integrity: sha512-47Op/NU8Opt49KyGpHtVdnmmJMsp2hEwBdyjuFB9M2V5QVOwA7pBhhxKN5z6ztKGrMw76gd8MlbPuzzvaAncuQ==} + + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-defaults-mode-browser@3.0.21': + resolution: {integrity: sha512-M/FhTBk4c/SsB91dD/M4gMGfJO7z/qJaM9+XQQIqBOf4qzZYMExnP7R4VdGwxxH8IKMGW+8F0I4rNtVRrcfPoA==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@3.0.21': + resolution: {integrity: sha512-NiLinPvF86U3S2Pdx/ycqd4bnY5dmFSPNL5KYRwbNjqQFS09M5Wzqk8BNk61/47xCYz1X/6KeiSk9qgYPTtuDw==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-endpoints@2.1.2': + resolution: {integrity: sha512-FEISzffb4H8DLzGq1g4MuDpcv6CIG15fXoQzDH9SjpRJv6h7J++1STFWWinilG0tQh9H1v2UKWG19Jjr2B16zQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-middleware@3.0.6': + resolution: {integrity: sha512-BxbX4aBhI1O9p87/xM+zWy0GzT3CEVcXFPBRDoHAM+pV0eSW156pR+PSYEz0DQHDMYDsYAflC2bQNz2uaDBUZQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-retry@3.0.6': + resolution: {integrity: sha512-BRZiuF7IwDntAbevqMco67an0Sr9oLQJqqRCsSPZZHYRnehS0LHDAkJk/pSmI7Z8c/1Vet294H7fY2fWUgB+Rg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-stream@3.1.8': + resolution: {integrity: sha512-hoKOqSmb8FD3WLObuB5hwbM7bNIWgcnvkThokTvVq7J5PKjlLUK5qQQcB9zWLHIoSaIlf3VIv2OxZY2wtQjcRQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@tempfix/idb@8.0.3': + resolution: {integrity: sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==} + + '@tempfix/watcher@2.3.0': + resolution: {integrity: sha512-a2qVQffcrnetehvwsN+LdipxQ6jejwZLgAvS9/91+C0gP4CKyikY01c0tSs0I4tSL7qHdCw1Fx0quLw+A9uyLA==} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tsclass/tsclass@3.0.48': + resolution: {integrity: sha512-hC65UvDlp9qvsl6OcIZXz0JNiWZ0gyzsTzbXpg215sGxopgbkOLCr6E0s4qCTnweYm95gt2AdY95uP7M7kExaQ==} + + '@tsclass/tsclass@4.1.2': + resolution: {integrity: sha512-uMg1IcTU1cP0McXYGwGffoU3asNQHle7bTN0tn6kVXzfNzSwQf4o8v+YQ4VRnUzo4ov6VKcPXqg5OLb2vz977g==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/buffer-json@2.0.3': + resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==} + + '@types/chokidar@2.1.3': + resolution: {integrity: sha512-6qK3xoLLAhQVTucQGHTySwOVA1crHRXnJeLwqK6KIFkkKa2aoMFXh+WEi8PotxDtvN6MQJLyYN9ag9P6NLV81w==} + deprecated: This is a stub types definition. chokidar provides its own type definitions, so you do not need this installed. + + '@types/clean-css@4.2.11': + resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} + + '@types/compression@1.7.5': + resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/fast-json-stable-stringify@2.1.0': + resolution: {integrity: sha512-IyNhGHu71jH1jCXTHmafuoAAdsbBON3kDh7u/UUhLmjYgN5TYB54e1R8ckTCiIevl2UuZaCsi9XRxineY5yUjw==} + deprecated: This is a stub types definition. fast-json-stable-stringify provides its own type definitions, so you do not need this installed. + + '@types/finalhandler@1.2.3': + resolution: {integrity: sha512-I+Ba0JZEiuSr8LLjVmBhvLBEN8KG9GSITNXWwPCLeAvZj/k5pXEdOBEvnEEIgA038eeaauJ3BPxbuxeFBsqqUw==} + + '@types/from2@2.3.5': + resolution: {integrity: sha512-giavnjf3kNlJnE+HpZA1CQ3UKHxgehzsTuIMGda8pGMbOiLYGVNADEskey44OZcADHm/HOoBany8IV+0x28XFw==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/html-minifier@4.0.5': + resolution: {integrity: sha512-LfE7f7MFd+YUfZnlBz8W43P4NgSObWiqyKapANsWCj63Aqeqli8/9gVsGP4CwC8jPpTTYlTopKCk9rJSuht/ew==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/js-yaml@3.12.10': + resolution: {integrity: sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/jsonwebtoken@9.0.7': + resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mime-types@2.1.4': + resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@22.7.2': + resolution: {integrity: sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==} + + '@types/qs@6.9.16': + resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} + + '@types/randomatic@3.1.5': + resolution: {integrity: sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/relateurl@0.2.33': + resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/shortid@0.0.29': + resolution: {integrity: sha1-gJPuBBam4r8qpjOBCRFLP7/6Dps=} + + '@types/symbol-tree@3.2.5': + resolution: {integrity: sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==} + + '@types/through2@2.0.41': + resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/turndown@5.0.5': + resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} + + '@types/uglify-js@3.17.5': + resolution: {integrity: sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/uuid@7.0.8': + resolution: {integrity: sha512-95N4tyM4B5u1sj2m8Tht09qWHju2ht413GBFz8CHtxp8aIiJUF6t51MsR7jC9OF4rRVf93AxE++WJe7+Puc1UA==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + + '@types/whatwg-url@8.2.2': + resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + + '@types/which@3.0.4': + resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@webcontainer/api@1.3.0': + resolution: {integrity: sha512-gnb5P7Qr7xIvOEiUUODhKG6o8i4ZpVFdoKdnggOnWYaGOTECM94PK3alTYifa9YIL304VJkH/liT+fbnKCXa+A==} + + '@yr/monotone-cubic-spline@1.0.3': + resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + ansi-256-colors@1.1.0: + resolution: {integrity: sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + apexcharts@3.53.0: + resolution: {integrity: sha512-QESZHZY3w9LPQ64PGh1gEdfjYjJ5Jp+Dfy0D/CLjsLOPTpXzdxwlNMqRj+vPbTcP0nAHgjWv1maDqcEq6u5olw==} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} + + async-mutex@0.3.2: + resolution: {integrity: sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==} + + asynckit@0.4.0: + resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-arraybuffer-es6@0.7.0: + resolution: {integrity: sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw==} + engines: {node: '>=6.0.0'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + broadcast-channel@3.7.0: + resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} + + broadcast-channel@7.0.0: + resolution: {integrity: sha512-a2tW0Ia1pajcPBOGUF2jXlDnvE9d5/dg6BG9h60OmRUcZVr/veUrU8vEQFwwQIhwG3KVzYwSk3v2nRRGFgQDXQ==} + + bson@4.7.2: + resolution: {integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==} + engines: {node: '>=6.9.0'} + + bson@6.8.0: + resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} + engines: {node: '>=16.20.1'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} + + buffer-json@2.0.0: + resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@3.0.0: + resolution: {integrity: sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + canvas@2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + + clean-stack@1.3.0: + resolution: {integrity: sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=} + engines: {node: '>=4'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commondir@1.0.1: + resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + console-control-strings@1.1.0: + resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + croner@4.4.1: + resolution: {integrity: sha512-aqVeeIPCf5/NZFlz4mN4MLEOs9xf4ODCmHQDs+577JFj8mK3RkKJz77h7+Rn94AijUqKdFNOUHM+v88d8p02UQ==} + + croner@5.7.0: + resolution: {integrity: sha512-9pSLe+tDJnmNak2JeMkz6ZmTCXP5p6vCxSd4kvDqrTJkqAP62j2uAEIZjf8cPDZIakStujqVzh5Y5MIWH3yYAw==} + engines: {node: '>=6.0'} + + croner@7.0.8: + resolution: {integrity: sha512-4E27J9ZQV9prM9ggU18QGPYPMSblbA9JuGv4Ff3Gk6supX4RszNGQxBgiFBL6wb/L9HuSMpFbQpduMiDRo+z5Q==} + engines: {node: '>=6.0'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@5.0.0: + resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==} + engines: {node: '>=14.16'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dns2@2.1.0: + resolution: {integrity: sha512-m27K11aQalRbmUs7RLaz6aPyceLjAoqjPRNTdE7qUouQpl+PC8Bi67O+i9SuJUPbQC8dxFrczAxfmTPuTKHNkw==} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + + dommatrix@1.0.3: + resolution: {integrity: sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-client@6.2.3: + resolution: {integrity: sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==} + + engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + + engine.io-parser@5.0.7: + resolution: {integrity: sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==} + engines: {node: '>=10.0.0'} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.2.1: + resolution: {integrity: sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==} + engines: {node: '>=10.0.0'} + + engine.io@6.3.1: + resolution: {integrity: sha512-VhEArSKyCC8dv223fltbMOqaJInFZqIqLABLnD3VLhclriF9sxnAJu6ZvnIMI+p7+ByZBxXd4otTrLAeeMTImg==} + engines: {node: '>=10.0.0'} + + engine.io@6.5.4: + resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engines: {node: '>=10.2.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + escape-html@1.0.3: + resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + etag@1.8.1: + resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + express-force-ssl@0.3.2: + resolution: {integrity: sha1-AbK0mK5v0uQRUrIrV6Phc3c69n4=} + engines: {node: '>=0.2.2'} + + express@4.21.0: + resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fake-indexeddb@4.0.2: + resolution: {integrity: sha512-SdTwEhnakbgazc7W3WUXOJfGmhH0YfG4d+dRPOFoYDRTL6U5t8tvrmkf2W/C3W1jk2ylV7Wrnj44RASqpX/lEw==} + + fake-indexeddb@5.0.2: + resolution: {integrity: sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==} + engines: {node: '>=18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-xml-parser@3.21.1: + resolution: {integrity: sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==} + hasBin: true + + fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + + fast-xml-parser@4.5.0: + resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} + hasBin: true + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} + + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + + file-type@19.5.0: + resolution: {integrity: sha512-dMuq6WWnP6BpQY0zYJNpTtQWgeCImSMG0BTIzUBXvxbwc1HWP/E7AE4UWU9XSCOPGJuOHda0HpDnwM2FW+d90A==} + engines: {node: '>=18'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} + engines: {node: '>= 0.6'} + + from2@2.3.0: + resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + happy-dom@8.9.0: + resolution: {integrity: sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA==} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-sanitize@5.0.1: + resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} + + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@11.10.0: + resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} + engines: {node: '>=12.0.0'} + + highlight.js@11.7.0: + resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==} + engines: {node: '>=12.0.0'} + + html-minifier@4.0.0: + resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} + engines: {node: '>=6'} + hasBin: true + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + humanize-ms@1.2.1: + resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} + + ibantools@4.5.1: + resolution: {integrity: sha512-DfKQpLlFq9yEUIEnFuCJzss3XavD7iHZTU5PyqXiAJ+rmaMp+NFP3hboumHKuK8nZjuOJg93WemTzcQ5b9jOZA==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inflight@1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-observable@2.1.0: + resolution: {integrity: sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + + isexe@2.0.0: + resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha1-sBMHyym2GKHtJux56RH4A8TaAEA=} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + + lit-element@4.1.0: + resolution: {integrity: sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww==} + + lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + + lit-html@3.2.0: + resolution: {integrity: sha512-pwT/HwoxqI9FggTrYVarkBKFN9MlTUpLrDHubTmW4SrkL3kkqW5gxwbxMMUnbbRHBC0WTZnYHcjDSCM559VyfA==} + + lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + + lit@3.2.0: + resolution: {integrity: sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash._baseassign@3.2.0: + resolution: {integrity: sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=} + + lodash._basecopy@3.0.1: + resolution: {integrity: sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=} + + lodash._bindcallback@3.0.1: + resolution: {integrity: sha1-5THCdkTPi1epnhftlbNcdIeJOS4=} + + lodash._createassigner@3.1.1: + resolution: {integrity: sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=} + + lodash._getnative@3.9.1: + resolution: {integrity: sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=} + + lodash._isiterateecall@3.0.9: + resolution: {integrity: sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=} + + lodash.assign@3.2.0: + resolution: {integrity: sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} + + lodash.includes@4.3.0: + resolution: {integrity: sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=} + + lodash.isarray@3.0.4: + resolution: {integrity: sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=} + + lodash.isstring@4.0.1: + resolution: {integrity: sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=} + + lodash.keys@3.1.2: + resolution: {integrity: sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=} + + lodash.once@4.1.1: + resolution: {integrity: sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=} + + lodash.restparam@3.6.1: + resolution: {integrity: sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lower-case@1.1.4: + resolution: {integrity: sha1-miyr0bno4K6ZOkv31YdcOcQujqw=} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-error-cause@2.3.0: + resolution: {integrity: sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + math-random@1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + + md5-file@5.0.0: + resolution: {integrity: sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==} + engines: {node: '>=10.13.0'} + hasBin: true + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-typer@0.3.0: + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + engines: {node: '>= 0.6'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + methods@1.1.2: + resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + microseconds@0.2.0: + resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@4.0.4: + resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} + engines: {node: '>=16'} + hasBin: true + + mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + monaco-editor@0.51.0: + resolution: {integrity: sha512-xaGwVV1fq343cM7aOYB6lVE4Ugf0UyimdD/x5PWcWBMKENwectaEu77FAN7c5sFiyumqeJdX1RPTh1ocioyDjw==} + + mongodb-connection-string-url@2.6.0: + resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + + mongodb-connection-string-url@3.0.1: + resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} + + mongodb-memory-server-core@8.16.1: + resolution: {integrity: sha512-skRGr7vzVIyefKm/YTn73sWI/7ghIb+gBxYNt42kGO7zeOfy+3S2Xg3kHYLkBz1IrOmTyV2HpFVzbZ1HF8grsQ==} + engines: {node: '>=12.22.0'} + + mongodb-memory-server@8.16.1: + resolution: {integrity: sha512-Zje3i+xKN+nxALkOOraDfIvc9X8mNy979IvJdjUghvf5PbwvX5ZPr5gUtCcmzz2VRj97WsZbdUSkxny+GXZTIA==} + engines: {node: '>=12.22.0'} + + mongodb@4.17.2: + resolution: {integrity: sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg==} + engines: {node: '>=12.9.0'} + + mongodb@6.9.0: + resolution: {integrity: sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + ms@2.0.0: + resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nan@2.20.0: + resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} + + nano-time@1.0.0: + resolution: {integrity: sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=} + + nanoid@2.1.11: + resolution: {integrity: sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==} + + nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + new-find-package-json@2.0.0: + resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} + engines: {node: '>=12.22.0'} + + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-newline@4.1.0: + resolution: {integrity: sha512-ff4jKqMI8Xl50/4Mms/9jPobzAV/UK+kXG2XJ/7AqOmxIx8mqfqTIHYxuAnEgJ2AQeBbLnlbmZ5+38Y9A0w/YA==} + engines: {node: '>=12'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + + object-assign@4.1.1: + resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + oblivious-set@1.0.0: + resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} + + oblivious-set@1.4.0: + resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} + engines: {node: '>=16'} + + observable-fns@0.6.1: + resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + p-finally@1.0.0: + resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + param-case@2.1.1: + resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path2d@0.2.1: + resolution: {integrity: sha512-Fl2z/BHvkTNvkuBzYTpTuirHZg6wW9z8+4SND/3mDTEcYbbNKWAy21dz9D3ePNNwrrK8pqZO5vLPZ1hLF6T7XA==} + engines: {node: '>=6'} + + pdfjs-dist@2.16.105: + resolution: {integrity: sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==} + peerDependencies: + worker-loader: ^3.0.8 + peerDependenciesMeta: + worker-loader: + optional: true + + pdfjs-dist@4.6.82: + resolution: {integrity: sha512-BUOryeRFwvbLe0lOU6NhkJNuVQUp06WxlJVVCsxdmJ4y5cU3O3s3/0DunVdK1PMm7v2MUw52qKYaidhDH1Z9+w==} + engines: {node: '>=18'} + + peek-readable@5.2.0: + resolution: {integrity: sha512-U94a+eXHzct7vAd19GH3UQ2dH4Satbng0MyYTMaQatL0pvYYL5CTPR25HBhKtecl+4bfu1/i3vC6k0hydO5Vcw==} + engines: {node: '>=14.16'} + + pend@1.2.0: + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + punycode@1.4.1: + resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + realistic-structured-clone@3.0.0: + resolution: {integrity: sha512-rOjh4nuWkAqf9PWu6JVpOWD4ndI+JHfgiZeMmujYcPi+fvILUu7g6l26TC1K5aBIp34nV+jE1cDO75EKOfHC5Q==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + relateurl@0.2.7: + resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} + engines: {node: '>= 0.10'} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-html@16.0.1: + resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + replace-buffer@1.2.1: + resolution: {integrity: sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw==} + engines: {node: '>=4'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rss-parser@3.13.0: + resolution: {integrity: sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shortid@2.2.16: + resolution: {integrity: sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socket.io-adapter@2.4.0: + resolution: {integrity: sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-client@4.5.4: + resolution: {integrity: sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==} + engines: {node: '>=10.0.0'} + + socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.5.4: + resolution: {integrity: sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==} + engines: {node: '>=10.0.0'} + + socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + engines: {node: '>=10.2.0'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha1-/0rm5oZWBWuks+eSqzM004JzyhE=} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + sprintf-js@1.0.3: + resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + strtok3@8.1.0: + resolution: {integrity: sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==} + engines: {node: '>=16'} + + stubborn-fs@1.2.5: + resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + + svg.draggable.js@2.2.2: + resolution: {integrity: sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==} + engines: {node: '>= 0.8.0'} + + svg.easing.js@2.0.0: + resolution: {integrity: sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==} + engines: {node: '>= 0.8.0'} + + svg.filter.js@2.0.2: + resolution: {integrity: sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==} + engines: {node: '>= 0.8.0'} + + svg.js@2.7.1: + resolution: {integrity: sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==} + + svg.pathmorphing.js@0.1.3: + resolution: {integrity: sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==} + engines: {node: '>= 0.8.0'} + + svg.resize.js@1.4.3: + resolution: {integrity: sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==} + engines: {node: '>= 0.8.0'} + + svg.select.js@2.1.2: + resolution: {integrity: sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==} + engines: {node: '>= 0.8.0'} + + svg.select.js@3.0.1: + resolution: {integrity: sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==} + engines: {node: '>= 0.8.0'} + + sweet-scroll@4.0.0: + resolution: {integrity: sha512-mR6fRsAQANtm3zpzhUE73KAOt2aT4ZsWzNSggiEsSqdO6Zh4gM7ioJG81EngrZEl0XAc3ZvzEfhxggOoEBc8jA==} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + threads@1.7.0: + resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + tiny-worker@2.3.0: + resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@6.0.0: + resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + engines: {node: '>=14.16'} + + tr46@0.0.3: + resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} + + tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + tr46@4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + turndown-plugin-gfm@1.0.2: + resolution: {integrity: sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==} + + turndown@7.2.0: + resolution: {integrity: sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.26.1: + resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + engines: {node: '>=14.17'} + hasBin: true + + typeson-registry@1.0.0-alpha.39: + resolution: {integrity: sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw==} + engines: {node: '>=10.0.0'} + + typeson@6.1.0: + resolution: {integrity: sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA==} + engines: {node: '>=0.1.14'} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uint8array-extras@1.4.0: + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unload@2.2.0: + resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} + + unload@2.4.1: + resolution: {integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==} + + unpipe@1.0.0: + resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} + engines: {node: '>= 0.8'} + + upper-case@1.1.3: + resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + util-deprecate@1.0.2: + resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + + utils-merge@1.0.1: + resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + engines: {node: '>= 0.4.0'} + + uuid@7.0.3: + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vary@1.1.2: + resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} + engines: {node: '>= 0.8'} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@13.0.0: + resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} + engines: {node: '>=16'} + + whatwg-url@5.0.0: + resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} + + whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + wordwrap@1.0.0: + resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + + ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.2.3: + resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + + xterm-addon-fit@0.8.0: + resolution: {integrity: sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==} + peerDependencies: + xterm: ^5.0.0 + + xterm@5.3.0: + resolution: {integrity: sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@adobe/fetch@4.1.9': + dependencies: + debug: 4.3.7 + http-cache-semantics: 4.1.1 + lru-cache: 7.18.3 + transitivePeerDependencies: + - supports-color + + '@api.global/typedrequest-interfaces@2.0.2': {} + + '@api.global/typedrequest-interfaces@3.0.19': {} + + '@api.global/typedrequest@3.0.32': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartbuffer': 3.0.4 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartguard': 3.1.0 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webstream': 1.0.10 + + '@api.global/typedserver@3.0.51': + dependencies: + '@api.global/typedrequest': 3.0.32 + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedsocket': 3.0.1 + '@cloudflare/workers-types': 4.20240919.0 + '@design.estate/dees-comms': 1.0.27 + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartchok': 1.0.34 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartfeed': 1.0.11 + '@push.rocks/smartfile': 11.0.21 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartlog-destination-devtools': 1.0.12 + '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartmanifest': 2.0.2 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartmime': 2.0.2 + '@push.rocks/smartntml': 2.0.4 + '@push.rocks/smartopen': 2.0.0 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrequest': 2.0.22 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartsitemap': 2.0.3 + '@push.rocks/smartstream': 3.0.44 + '@push.rocks/smarttime': 4.0.8 + '@push.rocks/taskbuffer': 3.1.7 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webstore': 2.0.20 + '@tsclass/tsclass': 4.1.2 + '@types/express': 4.17.21 + body-parser: 1.20.3 + cors: 2.8.5 + express: 4.21.0 + express-force-ssl: 0.3.2 + lit: 3.2.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@api.global/typedsocket@3.0.1': + dependencies: + '@api.global/typedrequest': 3.0.32 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isohash': 2.0.1 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartsocket': 2.0.27 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smarturl': 3.0.7 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@apiglobal/typedrequest-interfaces@1.0.20': {} + + '@apiglobal/typedrequest-interfaces@2.0.1': {} + + '@apiglobal/typedrequest@2.0.12': + dependencies: + '@apiglobal/typedrequest-interfaces': 1.0.20 + '@pushrocks/isounique': 1.0.5 + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/webrequest': 3.0.28 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@apiglobal/typedserver@2.0.65': + dependencies: + '@apiglobal/typedrequest': 2.0.12 + '@apiglobal/typedrequest-interfaces': 2.0.1 + '@apiglobal/typedsocket': 2.0.24 + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartchok': 1.0.23 + '@pushrocks/smartdelay': 3.0.1 + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smartfeed': 1.0.11 + '@pushrocks/smartfile': 10.0.26 + '@pushrocks/smartlog': 3.0.2 + '@pushrocks/smartlog-destination-devtools': 1.0.10 + '@pushrocks/smartmanifest': 2.0.2 + '@pushrocks/smartmime': 1.0.5 + '@pushrocks/smartopen': 2.0.0 + '@pushrocks/smartpath': 5.0.5 + '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/smartrequest': 2.0.15 + '@pushrocks/smartrx': 3.0.2 + '@pushrocks/smartsitemap': 2.0.1 + '@pushrocks/smarttime': 4.0.1 + '@pushrocks/webstore': 2.0.8 + '@tsclass/tsclass': 4.1.2 + '@types/express': 4.17.21 + body-parser: 1.20.3 + cors: 2.8.5 + express: 4.21.0 + express-force-ssl: 0.3.2 + lit: 2.8.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@apiglobal/typedsocket@2.0.24': + dependencies: + '@apiglobal/typedrequest': 2.0.12 + '@apiglobal/typedrequest-interfaces': 2.0.1 + '@pushrocks/isohash': 2.0.1 + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartsocket': 2.0.19 + '@pushrocks/smartstring': 4.0.7 + '@pushrocks/smarturl': 3.0.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.7.0 + optional: true + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.654.0 + tslib: 2.7.0 + optional: true + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.7.0 + optional: true + + '@aws-sdk/client-cognito-identity@3.658.1': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/core': 3.658.1 + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/core': 3.658.1 + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/client-sso@3.658.1': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.658.1 + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/client-sts@3.658.1': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/core': 3.658.1 + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/core@3.658.1': + dependencies: + '@smithy/core': 2.4.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/property-provider': 3.1.6 + '@smithy/protocol-http': 4.1.3 + '@smithy/signature-v4': 4.1.4 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/util-middleware': 3.0.6 + fast-xml-parser: 4.4.1 + tslib: 2.7.0 + optional: true + + '@aws-sdk/credential-provider-cognito-identity@3.658.1': + dependencies: + '@aws-sdk/client-cognito-identity': 3.658.1 + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/credential-provider-env@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/credential-provider-http@3.658.1': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/node-http-handler': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/util-stream': 3.1.8 + tslib: 2.7.0 + optional: true + + '@aws-sdk/credential-provider-ini@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/credential-provider-env': 3.654.0 + '@aws-sdk/credential-provider-http': 3.658.1 + '@aws-sdk/credential-provider-process': 3.654.0 + '@aws-sdk/credential-provider-sso': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/credential-provider-web-identity': 3.654.0(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.654.0 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + + '@aws-sdk/credential-provider-node@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/credential-provider-env': 3.654.0 + '@aws-sdk/credential-provider-http': 3.658.1 + '@aws-sdk/credential-provider-ini': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/credential-provider-process': 3.654.0 + '@aws-sdk/credential-provider-sso': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/credential-provider-web-identity': 3.654.0(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.654.0 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + optional: true + + '@aws-sdk/credential-provider-process@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/credential-provider-sso@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))': + dependencies: + '@aws-sdk/client-sso': 3.658.1 + '@aws-sdk/token-providers': 3.654.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + + '@aws-sdk/credential-provider-web-identity@3.654.0(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/credential-providers@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))': + dependencies: + '@aws-sdk/client-cognito-identity': 3.658.1 + '@aws-sdk/client-sso': 3.658.1 + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/credential-provider-cognito-identity': 3.658.1 + '@aws-sdk/credential-provider-env': 3.654.0 + '@aws-sdk/credential-provider-http': 3.658.1 + '@aws-sdk/credential-provider-ini': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/credential-provider-process': 3.654.0 + '@aws-sdk/credential-provider-sso': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/credential-provider-web-identity': 3.654.0(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.654.0 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + + '@aws-sdk/middleware-host-header@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/middleware-logger@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/middleware-recursion-detection@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/middleware-user-agent@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/region-config-resolver@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/node-config-provider': 3.1.7 + '@smithy/types': 3.4.2 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.6 + tslib: 2.7.0 + optional: true + + '@aws-sdk/token-providers@3.654.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/types@3.654.0': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/util-endpoints@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/types': 3.4.2 + '@smithy/util-endpoints': 2.1.2 + tslib: 2.7.0 + optional: true + + '@aws-sdk/util-locate-window@3.568.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@aws-sdk/util-user-agent-browser@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/types': 3.4.2 + bowser: 2.11.0 + tslib: 2.7.0 + optional: true + + '@aws-sdk/util-user-agent-node@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/node-config-provider': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@babel/runtime@7.23.4': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.25.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@cloudflare/workers-types@4.20240919.0': {} + + '@configvault.io/interfaces@1.0.17': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + + '@consent.software/interfaces@1.0.13': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + + '@consentsoftware/interfaces@1.0.13': + dependencies: + '@apiglobal/typedrequest-interfaces': 2.0.1 + + '@consentsoftware/webclient@1.0.16': + dependencies: + '@api.global/typedrequest': 3.0.32 + '@consent.software/interfaces': 1.0.13 + '@push.rocks/smarttime': 4.0.8 + '@push.rocks/webstore': 2.0.20 + + '@consentsoftware_private/catalog@1.0.77(@types/node@22.7.2)': + dependencies: + '@consentsoftware/interfaces': 1.0.13 + '@consentsoftware/webclient': 1.0.16 + '@designestate/dees-catalog': 1.0.170(@types/node@22.7.2) + '@designestate/dees-domtools': 2.0.34 + '@designestate/dees-element': 2.0.23 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - supports-color + - utf-8-validate + - worker-loader + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@design.estate/dees-catalog@1.1.8': + dependencies: + '@design.estate/dees-domtools': 2.0.57 + '@design.estate/dees-element': 2.0.36 + '@design.estate/dees-wcctools': 1.0.90 + '@fortawesome/fontawesome-svg-core': 6.6.0 + '@fortawesome/free-brands-svg-icons': 6.6.0 + '@fortawesome/free-regular-svg-icons': 6.6.0 + '@fortawesome/free-solid-svg-icons': 6.6.0 + '@push.rocks/smarti18n': 1.0.4 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartstring': 4.0.15 + '@tsclass/tsclass': 4.1.2 + '@webcontainer/api': 1.3.0 + apexcharts: 3.53.0 + highlight.js: 11.10.0 + ibantools: 4.5.1 + monaco-editor: 0.51.0 + pdfjs-dist: 4.6.82 + xterm: 5.3.0 + xterm-addon-fit: 0.8.0(xterm@5.3.0) + transitivePeerDependencies: + - encoding + - supports-color + + '@design.estate/dees-comms@1.0.27': + dependencies: + '@api.global/typedrequest': 3.0.32 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/smartdelay': 3.0.5 + broadcast-channel: 7.0.0 + + '@design.estate/dees-domtools@2.0.57': + dependencies: + '@api.global/typedrequest': 3.0.32 + '@design.estate/dees-comms': 1.0.27 + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmarkdown': 3.0.3 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrouter': 1.0.16 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartstate': 2.0.17 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smarturl': 3.0.7 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/websetup': 3.0.19 + '@push.rocks/webstore': 2.0.20 + lit: 3.2.0 + sweet-scroll: 4.0.0 + transitivePeerDependencies: + - supports-color + + '@design.estate/dees-element@2.0.36': + dependencies: + '@design.estate/dees-domtools': 2.0.57 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartrx': 3.0.7 + lit: 3.2.0 + transitivePeerDependencies: + - supports-color + + '@design.estate/dees-wcctools@1.0.90': + dependencies: + '@design.estate/dees-domtools': 2.0.57 + '@design.estate/dees-element': 2.0.36 + '@push.rocks/smartdelay': 3.0.5 + lit: 3.2.0 + transitivePeerDependencies: + - supports-color + + '@designestate/dees-catalog@1.0.170(@types/node@22.7.2)': + dependencies: + '@designestate/dees-domtools': 2.0.34 + '@designestate/dees-element': 2.0.23 + '@designestate/dees-wcctools': 1.0.76(@types/node@22.7.2) + '@fortawesome/fontawesome-svg-core': 6.6.0 + '@fortawesome/free-brands-svg-icons': 6.6.0 + '@fortawesome/free-regular-svg-icons': 6.6.0 + '@fortawesome/free-solid-svg-icons': 6.6.0 + '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/smartstring': 4.0.7 + '@tsclass/tsclass': 4.1.2 + highlight.js: 11.7.0 + pdfjs-dist: 2.16.105 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - supports-color + - utf-8-validate + - worker-loader + + '@designestate/dees-comms@1.0.22': + dependencies: + '@apiglobal/typedrequest': 2.0.12 + '@apiglobal/typedrequest-interfaces': 1.0.20 + '@pushrocks/smartdelay': 2.0.13 + broadcast-channel: 3.7.0 + + '@designestate/dees-domtools@2.0.34': + dependencies: + '@apiglobal/typedrequest': 2.0.12 + '@designestate/dees-comms': 1.0.22 + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartdelay': 3.0.1 + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/smartrouter': 1.0.16 + '@pushrocks/smartrx': 3.0.2 + '@pushrocks/smartstate': 2.0.6 + '@pushrocks/smarturl': 3.0.6 + '@pushrocks/webrequest': 3.0.28 + '@pushrocks/websetup': 3.0.19 + '@pushrocks/webstore': 2.0.8 + lit: 2.8.0 + sweet-scroll: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@designestate/dees-element@2.0.23': + dependencies: + '@design.estate/dees-domtools': 2.0.57 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartrx': 3.0.7 + lit: 2.8.0 + transitivePeerDependencies: + - supports-color + + '@designestate/dees-wcctools@1.0.76(@types/node@22.7.2)': + dependencies: + '@designestate/dees-domtools': 2.0.34 + '@designestate/dees-element': 2.0.23 + '@gitzone/tsrun': 1.2.44(@types/node@22.7.2) + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartexpress': 4.0.35 + lit: 2.8.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - supports-color + - utf-8-validate + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@fortawesome/fontawesome-common-types@6.6.0': {} + + '@fortawesome/fontawesome-svg-core@6.6.0': + dependencies: + '@fortawesome/fontawesome-common-types': 6.6.0 + + '@fortawesome/free-brands-svg-icons@6.6.0': + dependencies: + '@fortawesome/fontawesome-common-types': 6.6.0 + + '@fortawesome/free-regular-svg-icons@6.6.0': + dependencies: + '@fortawesome/fontawesome-common-types': 6.6.0 + + '@fortawesome/free-solid-svg-icons@6.6.0': + dependencies: + '@fortawesome/fontawesome-common-types': 6.6.0 + + '@git.zone/tsbuild@2.1.84': + dependencies: + '@push.rocks/early': 4.0.4 + '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 11.0.21 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.0.4 + typescript: 5.5.2 + + '@git.zone/tsbundle@2.0.15': + dependencies: + '@push.rocks/early': 4.0.4 + '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 11.0.21 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartlog-destination-local': 9.0.2 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartspawn': 3.0.3 + '@types/html-minifier': 4.0.5 + esbuild: 0.19.12 + html-minifier: 4.0.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@git.zone/tsrun@1.2.49(@types/node@22.7.2)': + dependencies: + '@push.rocks/smartfile': 11.0.21 + '@push.rocks/smartshell': 3.0.6 + ts-node: 10.9.2(@types/node@22.7.2)(typescript@5.5.2) + typescript: 5.5.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + + '@git.zone/tswatch@2.0.23(@types/node@22.7.2)': + dependencies: + '@api.global/typedserver': 3.0.51 + '@git.zone/tsbundle': 2.0.15 + '@git.zone/tsrun': 1.2.49(@types/node@22.7.2) + '@push.rocks/early': 4.0.4 + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartchok': 1.0.34 + '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartlog-destination-local': 9.0.2 + '@push.rocks/smartshell': 3.0.6 + '@push.rocks/taskbuffer': 3.1.7 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@gitzone/tsrun@1.2.44(@types/node@22.7.2)': + dependencies: + '@push.rocks/smartfile': 10.0.41 + '@push.rocks/smartshell': 3.0.6 + ts-node: 10.9.2(@types/node@22.7.2)(typescript@5.6.2) + typescript: 5.6.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + + '@happy-dom/global-registrator@8.9.0': + dependencies: + happy-dom: 8.9.0 + transitivePeerDependencies: + - encoding + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@lit-labs/ssr-dom-shim@1.2.1': {} + + '@lit/reactive-element@1.6.3': + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.1 + + '@lit/reactive-element@2.0.4': + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.1 + + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@mixmark-io/domino@2.2.0': {} + + '@mongodb-js/saslprep@1.1.9': + dependencies: + sparse-bitfield: 3.0.3 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@push.rocks/consolecolor@2.0.2': + dependencies: + ansi-256-colors: 1.1.0 + + '@push.rocks/early@4.0.4': + dependencies: + '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/smartpromise': 4.0.4 + + '@push.rocks/isohash@2.0.1': + dependencies: + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smarthash': 3.0.2 + + '@push.rocks/isounique@1.0.5': {} + + '@push.rocks/lik@6.0.15': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smarttime': 4.0.8 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + + '@push.rocks/mongodump@1.0.8(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))': + dependencies: + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartfile': 9.0.6 + '@pushrocks/smartjson': 4.0.6 + '@pushrocks/smartpath': 5.0.5 + '@pushrocks/smartpromise': 3.1.10 + '@tsclass/tsclass': 4.1.2 + mongodb: 4.17.2(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@push.rocks/projectinfo@5.0.2': + dependencies: + '@push.rocks/smartfile': 10.0.41 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartstring': 4.0.15 + + '@push.rocks/qenv@6.0.5': + dependencies: + '@api.global/typedrequest': 3.0.32 + '@configvault.io/interfaces': 1.0.17 + '@push.rocks/smartfile': 11.0.21 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartpath': 5.0.18 + + '@push.rocks/smartbuffer@3.0.4': + dependencies: + uint8array-extras: 1.4.0 + + '@push.rocks/smartcache@1.0.16': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smarterror': 2.0.1 + '@pushrocks/smarthash': 3.0.2 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smarttime': 4.0.1 + + '@push.rocks/smartchok@1.0.34': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + '@tempfix/watcher': 2.3.0 + + '@push.rocks/smartcli@4.0.11': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartobject': 1.0.12 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + yargs-parser: 21.1.1 + + '@push.rocks/smartcrypto@2.0.4': + dependencies: + '@push.rocks/smartpromise': 4.0.4 + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + '@push.rocks/smartdata@5.2.10(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/credential-providers@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)))(socks@2.8.3)': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartmongo': 2.0.10(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/credential-providers@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)))(socks@2.8.3) + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smarttime': 4.0.8 + '@push.rocks/smartunique': 3.0.9 + '@push.rocks/taskbuffer': 3.1.7 + '@tsclass/tsclass': 4.1.2 + mongodb: 6.9.0(@aws-sdk/credential-providers@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)))(socks@2.8.3) + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - aws-crt + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + + '@push.rocks/smartdelay@3.0.5': + dependencies: + '@push.rocks/smartpromise': 4.0.4 + + '@push.rocks/smartdns@5.0.4': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrequest': 2.0.15 + '@tsclass/tsclass': 4.1.2 + dns2: 2.1.0 + + '@push.rocks/smartenv@5.0.12': + dependencies: + '@push.rocks/smartpromise': 4.0.4 + + '@push.rocks/smartexit@1.0.23': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.0.4 + tree-kill: 1.2.2 + + '@push.rocks/smartfeed@1.0.11': + dependencies: + '@tsclass/tsclass': 3.0.48 + feed: 4.2.2 + rss-parser: 3.13.0 + + '@push.rocks/smartfile-interfaces@1.0.7': {} + + '@push.rocks/smartfile@10.0.41': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smarthash': 3.0.4 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmime': 1.0.6 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrequest': 2.0.22 + '@push.rocks/smartstream': 2.0.8 + '@types/fs-extra': 11.0.4 + '@types/glob': 8.1.0 + '@types/js-yaml': 4.0.9 + fs-extra: 11.2.0 + glob: 10.4.5 + js-yaml: 4.1.0 + + '@push.rocks/smartfile@11.0.21': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smarthash': 3.0.4 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmime': 2.0.2 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrequest': 2.0.22 + '@push.rocks/smartstream': 3.0.44 + '@types/fs-extra': 11.0.4 + '@types/glob': 8.1.0 + '@types/js-yaml': 4.0.9 + fs-extra: 11.2.0 + glob: 10.4.5 + js-yaml: 4.1.0 + + '@push.rocks/smartguard@3.1.0': + dependencies: + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrequest': 2.0.22 + + '@push.rocks/smarthash@3.0.4': + dependencies: + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.0.4 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@push.rocks/smarti18n@1.0.4': {} + + '@push.rocks/smartjson@5.0.20': + dependencies: + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartstring': 4.0.15 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + + '@push.rocks/smartjwt@2.2.1': + dependencies: + '@push.rocks/smartcrypto': 2.0.4 + '@push.rocks/smartguard': 3.1.0 + '@push.rocks/smartjson': 5.0.20 + '@tsclass/tsclass': 4.1.2 + '@types/jsonwebtoken': 9.0.7 + jsonwebtoken: 9.0.2 + + '@push.rocks/smartlog-destination-devtools@1.0.12': + dependencies: + '@push.rocks/smartlog-interfaces': 3.0.2 + + '@push.rocks/smartlog-destination-local@9.0.2': + dependencies: + '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartpromise': 4.0.4 + + '@push.rocks/smartlog-interfaces@3.0.2': + dependencies: + '@api.global/typedrequest-interfaces': 2.0.2 + '@tsclass/tsclass': 4.1.2 + + '@push.rocks/smartlog@3.0.7': + dependencies: + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartlog-interfaces': 3.0.2 + + '@push.rocks/smartmail@1.0.24': + dependencies: + '@push.rocks/smartdns': 5.0.4 + '@push.rocks/smartfile': 10.0.41 + '@push.rocks/smartmustache': 3.0.2 + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartrequest': 2.0.22 + + '@push.rocks/smartmanifest@2.0.2': {} + + '@push.rocks/smartmarkdown@3.0.3': + dependencies: + '@push.rocks/smartyaml': 2.0.5 + '@types/turndown': 5.0.5 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + remark-html: 16.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + turndown: 7.2.0 + turndown-plugin-gfm: 1.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartmatch@2.0.0': + dependencies: + matcher: 5.0.0 + + '@push.rocks/smartmime@1.0.6': + dependencies: + '@types/mime-types': 2.1.4 + mime-types: 2.1.35 + + '@push.rocks/smartmime@2.0.2': + dependencies: + '@types/mime-types': 2.1.4 + file-type: 19.5.0 + mime: 4.0.4 + + '@push.rocks/smartmongo@2.0.10(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/credential-providers@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)))(socks@2.8.3)': + dependencies: + '@push.rocks/mongodump': 1.0.8(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@push.rocks/smartdata': 5.2.10(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/credential-providers@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)))(socks@2.8.3) + '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpromise': 4.0.4 + mongodb-memory-server: 8.16.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - aws-crt + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + + '@push.rocks/smartmustache@3.0.2': + dependencies: + handlebars: 4.7.8 + + '@push.rocks/smartntml@2.0.4': + dependencies: + '@designestate/dees-element': 2.0.23 + '@happy-dom/global-registrator': 8.9.0 + '@pushrocks/smartpromise': 3.1.10 + fake-indexeddb: 4.0.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@push.rocks/smartobject@1.0.12': + dependencies: + fast-deep-equal: 3.1.3 + minimatch: 9.0.5 + + '@push.rocks/smartopen@2.0.0': + dependencies: + open: 8.4.2 + + '@push.rocks/smartpath@5.0.18': {} + + '@push.rocks/smartpromise@4.0.4': {} + + '@push.rocks/smartrequest@2.0.22': + dependencies: + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smarturl': 3.0.7 + agentkeepalive: 4.5.0 + form-data: 4.0.0 + + '@push.rocks/smartrouter@1.0.16': + dependencies: + path-to-regexp: 6.3.0 + + '@push.rocks/smartrx@3.0.7': + dependencies: + '@push.rocks/smartpromise': 4.0.4 + rxjs: 7.8.1 + + '@push.rocks/smartshell@3.0.6': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartexit': 1.0.23 + '@push.rocks/smartpromise': 4.0.4 + '@types/which': 3.0.4 + tree-kill: 1.2.2 + which: 4.0.0 + + '@push.rocks/smartsitemap@2.0.3': + dependencies: + '@push.rocks/smartcache': 1.0.16 + '@push.rocks/smartfeed': 1.0.11 + '@push.rocks/smartxml': 1.0.8 + '@push.rocks/smartyaml': 2.0.5 + '@push.rocks/webrequest': 3.0.37 + '@tsclass/tsclass': 4.1.2 + + '@push.rocks/smartsocket@2.0.27': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedserver': 3.0.51 + '@push.rocks/isohash': 2.0.1 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smarttime': 4.0.8 + engine.io: 6.5.4 + socket.io: 4.7.5 + socket.io-client: 4.7.5 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@push.rocks/smartspawn@3.0.3': + dependencies: + '@push.rocks/smartpromise': 4.0.4 + spawn-wrap: 2.0.0 + threads: 1.7.0 + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartstate@2.0.17': + dependencies: + '@push.rocks/isohash': 2.0.1 + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/webstore': 2.0.20 + + '@push.rocks/smartstream@2.0.8': + dependencies: + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + '@types/from2': 2.3.5 + '@types/through2': 2.0.41 + from2: 2.3.0 + through2: 4.0.2 + + '@push.rocks/smartstream@3.0.44': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + + '@push.rocks/smartstring@4.0.15': + dependencies: + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartenv': 5.0.12 + '@types/randomatic': 3.1.5 + crypto-random-string: 5.0.0 + js-base64: 3.7.7 + randomatic: 3.1.1 + strip-indent: 4.0.0 + url: 0.11.4 + + '@push.rocks/smarttime@4.0.8': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.0.4 + croner: 7.0.8 + dayjs: 1.11.13 + is-nan: 1.3.2 + pretty-ms: 8.0.0 + + '@push.rocks/smartunique@3.0.9': + dependencies: + '@types/uuid': 9.0.8 + nanoid: 4.0.2 + uuid: 9.0.1 + + '@push.rocks/smarturl@3.0.7': {} + + '@push.rocks/smartxml@1.0.8': + dependencies: + fast-xml-parser: 4.5.0 + + '@push.rocks/smartyaml@2.0.5': + dependencies: + '@types/js-yaml': 3.12.10 + js-yaml: 3.14.1 + + '@push.rocks/taskbuffer@3.1.7': + dependencies: + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smarttime': 4.0.8 + '@push.rocks/smartunique': 3.0.9 + + '@push.rocks/webjwt@1.0.9': + dependencies: + '@push.rocks/smartstring': 4.0.15 + + '@push.rocks/webrequest@3.0.37': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/webstore': 2.0.20 + + '@push.rocks/websetup@3.0.19': + dependencies: + '@pushrocks/smartdelay': 3.0.1 + '@pushrocks/smartpromise': 4.0.2 + '@tsclass/tsclass': 4.1.2 + + '@push.rocks/webstore@2.0.20': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/lik': 6.0.15 + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartrx': 3.0.7 + '@tempfix/idb': 8.0.3 + fake-indexeddb: 5.0.2 + + '@push.rocks/webstream@1.0.10': + dependencies: + '@push.rocks/smartenv': 5.0.12 + + '@pushrocks/isohash@2.0.1': + dependencies: + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smarthash': 3.0.2 + + '@pushrocks/isounique@1.0.5': {} + + '@pushrocks/lik@3.0.19': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 2.0.27 + '@pushrocks/smarttime': 3.0.50 + '@pushrocks/smartunique': 3.0.3 + '@types/minimatch': 3.0.5 + minimatch: 3.1.2 + symbol-tree: 3.2.4 + + '@pushrocks/lik@5.0.7': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartmatch': 1.0.7 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 2.0.27 + '@pushrocks/smarttime': 3.0.50 + '@types/minimatch': 3.0.5 + symbol-tree: 3.2.4 + + '@pushrocks/lik@6.0.2': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartmatch': 2.0.0 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 3.0.2 + '@pushrocks/smarttime': 4.0.1 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + + '@pushrocks/smartcache@1.0.16': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smarterror': 2.0.1 + '@pushrocks/smarthash': 3.0.2 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smarttime': 4.0.1 + + '@pushrocks/smartchok@1.0.23': + dependencies: + '@pushrocks/lik': 3.0.19 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 2.0.27 + '@types/chokidar': 2.1.3 + chokidar: 3.6.0 + + '@pushrocks/smartdelay@2.0.13': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + + '@pushrocks/smartdelay@3.0.1': + dependencies: + '@pushrocks/smartpromise': 4.0.2 + + '@pushrocks/smartenv@5.0.5': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + + '@pushrocks/smarterror@2.0.1': + dependencies: + clean-stack: 1.3.0 + make-error-cause: 2.3.0 + + '@pushrocks/smartexpress@4.0.35': + dependencies: + '@apiglobal/typedrequest': 2.0.12 + '@apiglobal/typedsocket': 2.0.24 + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smartfeed': 1.0.11 + '@pushrocks/smartfile': 10.0.26 + '@pushrocks/smartmanifest': 1.0.8 + '@pushrocks/smartmime': 1.0.5 + '@pushrocks/smartpath': 5.0.5 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrequest': 2.0.15 + '@pushrocks/smartsitemap': 2.0.1 + '@pushrocks/smarttime': 4.0.1 + '@tsclass/tsclass': 4.1.2 + '@types/compression': 1.7.5 + '@types/cors': 2.8.17 + '@types/express': 4.17.21 + '@types/finalhandler': 1.2.3 + body-parser: 1.20.3 + cors: 2.8.5 + express: 4.21.0 + express-force-ssl: 0.3.2 + transitivePeerDependencies: + - supports-color + + '@pushrocks/smartfeed@1.0.11': + dependencies: + '@tsclass/tsclass': 3.0.48 + feed: 4.2.2 + rss-parser: 3.13.0 + + '@pushrocks/smartfile-interfaces@1.0.7': {} + + '@pushrocks/smartfile@10.0.26': + dependencies: + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartdelay': 3.0.1 + '@pushrocks/smartfile-interfaces': 1.0.7 + '@pushrocks/smarthash': 3.0.2 + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartmime': 1.0.5 + '@pushrocks/smartpath': 5.0.5 + '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/smartrequest': 2.0.15 + '@pushrocks/smartstream': 2.0.3 + '@pushrocks/streamfunction': 4.0.4 + '@types/fs-extra': 11.0.4 + '@types/glob': 8.1.0 + '@types/js-yaml': 4.0.9 + fs-extra: 11.2.0 + glob: 10.4.5 + js-yaml: 4.1.0 + + '@pushrocks/smartfile@9.0.6': + dependencies: + '@pushrocks/lik': 5.0.7 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartfile-interfaces': 1.0.7 + '@pushrocks/smarthash': 2.1.10 + '@pushrocks/smartjson': 4.0.6 + '@pushrocks/smartmime': 1.0.5 + '@pushrocks/smartpath': 4.0.3 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrequest': 1.1.56 + '@types/fs-extra': 9.0.13 + '@types/glob': 7.2.0 + '@types/js-yaml': 4.0.9 + fs-extra: 10.1.0 + glob: 7.2.3 + js-yaml: 4.1.0 + + '@pushrocks/smarthash@2.1.10': + dependencies: + '@pushrocks/smartjson': 4.0.6 + '@pushrocks/smartpromise': 3.1.10 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@pushrocks/smarthash@3.0.2': + dependencies: + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartpromise': 3.1.10 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@pushrocks/smartjson@4.0.6': + dependencies: + '@types/buffer-json': 2.0.3 + '@types/fast-json-stable-stringify': 2.1.0 + buffer-json: 2.0.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + + '@pushrocks/smartjson@5.0.6': + dependencies: + '@pushrocks/smartstring': 4.0.7 + '@types/buffer-json': 2.0.3 + buffer-json: 2.0.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + + '@pushrocks/smartlog-destination-devtools@1.0.10': + dependencies: + '@pushrocks/smartlog-interfaces': 2.0.23 + + '@pushrocks/smartlog-interfaces@2.0.23': + dependencies: + '@apiglobal/typedrequest-interfaces': 1.0.20 + + '@pushrocks/smartlog-interfaces@3.0.0': + dependencies: + '@apiglobal/typedrequest-interfaces': 2.0.1 + + '@pushrocks/smartlog@3.0.2': + dependencies: + '@pushrocks/isounique': 1.0.5 + '@pushrocks/smartlog-interfaces': 3.0.0 + + '@pushrocks/smartmanifest@1.0.8': {} + + '@pushrocks/smartmanifest@2.0.2': {} + + '@pushrocks/smartmatch@1.0.7': + dependencies: + matcher: 3.0.0 + + '@pushrocks/smartmatch@2.0.0': + dependencies: + matcher: 5.0.0 + + '@pushrocks/smartmime@1.0.5': + dependencies: + '@types/mime-types': 2.1.4 + mime-types: 2.1.35 + + '@pushrocks/smartopen@2.0.0': + dependencies: + open: 8.4.2 + + '@pushrocks/smartpath@4.0.3': {} + + '@pushrocks/smartpath@5.0.5': {} + + '@pushrocks/smartpromise@3.1.10': {} + + '@pushrocks/smartpromise@4.0.2': {} + + '@pushrocks/smartrequest@1.1.56': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smarturl': 2.0.1 + agentkeepalive: 4.5.0 + form-data: 4.0.0 + + '@pushrocks/smartrequest@2.0.15': + dependencies: + '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/smarturl': 3.0.6 + agentkeepalive: 4.5.0 + form-data: 4.0.0 + + '@pushrocks/smartrouter@1.0.16': + dependencies: + path-to-regexp: 6.3.0 + + '@pushrocks/smartrx@2.0.27': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + rxjs: 7.8.1 + + '@pushrocks/smartrx@3.0.2': + dependencies: + '@pushrocks/smartpromise': 4.0.2 + rxjs: 7.8.1 + + '@pushrocks/smartsitemap@2.0.1': + dependencies: + '@pushrocks/smartcache': 1.0.16 + '@pushrocks/smartfeed': 1.0.11 + '@pushrocks/smartxml': 1.0.6 + '@pushrocks/smartyaml': 2.0.5 + '@pushrocks/webrequest': 3.0.28 + '@tsclass/tsclass': 3.0.48 + transitivePeerDependencies: + - supports-color + + '@pushrocks/smartsocket@2.0.19': + dependencies: + '@apiglobal/typedrequest-interfaces': 2.0.1 + '@pushrocks/isohash': 2.0.1 + '@pushrocks/isounique': 1.0.5 + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smartexpress': 4.0.35 + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartlog': 3.0.2 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 3.0.2 + '@pushrocks/smarttime': 4.0.1 + engine.io: 6.3.1 + socket.io: 4.5.4 + socket.io-client: 4.5.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@pushrocks/smartstate@2.0.6': + dependencies: + '@pushrocks/isohash': 2.0.1 + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/smartrx': 3.0.2 + + '@pushrocks/smartstream@2.0.3': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 2.0.27 + '@types/from2': 2.3.5 + '@types/through2': 2.0.41 + from2: 2.3.0 + through2: 4.0.2 + + '@pushrocks/smartstring@4.0.7': + dependencies: + '@pushrocks/isounique': 1.0.5 + '@pushrocks/smartenv': 5.0.5 + '@types/randomatic': 3.1.5 + buffer: 6.0.3 + crypto-random-string: 5.0.0 + js-base64: 3.7.7 + normalize-newline: 4.1.0 + randomatic: 3.1.1 + strip-indent: 4.0.0 + url: 0.11.4 + + '@pushrocks/smarttime@3.0.50': + dependencies: + '@pushrocks/lik': 5.0.7 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartpromise': 3.1.10 + croner: 4.4.1 + dayjs: 1.11.13 + is-nan: 1.3.2 + pretty-ms: 7.0.1 + + '@pushrocks/smarttime@4.0.1': + dependencies: + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartpromise': 3.1.10 + croner: 5.7.0 + dayjs: 1.11.13 + is-nan: 1.3.2 + pretty-ms: 8.0.0 + + '@pushrocks/smartunique@3.0.3': + dependencies: + '@types/shortid': 0.0.29 + '@types/uuid': 7.0.8 + shortid: 2.2.16 + uuid: 7.0.3 + + '@pushrocks/smarturl@2.0.1': {} + + '@pushrocks/smarturl@3.0.6': {} + + '@pushrocks/smartxml@1.0.6': + dependencies: + fast-xml-parser: 3.21.1 + + '@pushrocks/smartyaml@2.0.5': + dependencies: + '@types/js-yaml': 3.12.10 + js-yaml: 3.14.1 + + '@pushrocks/streamfunction@4.0.4': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 2.0.27 + '@types/from2': 2.3.5 + '@types/through2': 2.0.41 + from2: 2.3.0 + through2: 4.0.2 + + '@pushrocks/webrequest@3.0.28': + dependencies: + '@adobe/fetch': 4.1.9 + '@apiglobal/typedserver': 2.0.65 + '@pushrocks/smartdelay': 3.0.1 + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/webstore': 2.0.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@pushrocks/websetup@3.0.19': + dependencies: + '@pushrocks/smartdelay': 3.0.1 + '@pushrocks/smartpromise': 4.0.2 + '@tsclass/tsclass': 4.1.2 + + '@pushrocks/webstore@2.0.8': + dependencies: + '@apiglobal/typedrequest-interfaces': 2.0.1 + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/smartrx': 3.0.2 + fake-indexeddb: 4.0.2 + idb: 7.1.1 + + '@sec-ant/readable-stream@0.4.1': {} + + '@serve.zone/interfaces@1.0.81': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/smartlog-interfaces': 3.0.2 + '@tsclass/tsclass': 4.1.2 + + '@serve.zone/platformclient@1.0.6': + dependencies: + '@api.global/typedrequest': 3.0.32 + '@api.global/typedserver': 3.0.51 + '@api.global/typedsocket': 3.0.1 + '@push.rocks/qenv': 6.0.5 + '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartntml': 2.0.4 + '@serve.zone/interfaces': 1.0.81 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@smithy/abort-controller@3.1.4': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/config-resolver@3.0.8': + dependencies: + '@smithy/node-config-provider': 3.1.7 + '@smithy/types': 3.4.2 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.6 + tslib: 2.7.0 + optional: true + + '@smithy/core@2.4.6': + dependencies: + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + optional: true + + '@smithy/credential-provider-imds@3.2.3': + dependencies: + '@smithy/node-config-provider': 3.1.7 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + tslib: 2.7.0 + optional: true + + '@smithy/fetch-http-handler@3.2.8': + dependencies: + '@smithy/protocol-http': 4.1.3 + '@smithy/querystring-builder': 3.0.6 + '@smithy/types': 3.4.2 + '@smithy/util-base64': 3.0.0 + tslib: 2.7.0 + optional: true + + '@smithy/hash-node@3.0.6': + dependencies: + '@smithy/types': 3.4.2 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + optional: true + + '@smithy/invalid-dependency@3.0.6': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@smithy/is-array-buffer@3.0.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@smithy/middleware-content-length@3.0.8': + dependencies: + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/middleware-endpoint@3.1.3': + dependencies: + '@smithy/middleware-serde': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-middleware': 3.0.6 + tslib: 2.7.0 + optional: true + + '@smithy/middleware-retry@3.0.21': + dependencies: + '@smithy/node-config-provider': 3.1.7 + '@smithy/protocol-http': 4.1.3 + '@smithy/service-error-classification': 3.0.6 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + tslib: 2.7.0 + uuid: 9.0.1 + optional: true + + '@smithy/middleware-serde@3.0.6': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/middleware-stack@3.0.6': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/node-config-provider@3.1.7': + dependencies: + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/node-http-handler@3.2.3': + dependencies: + '@smithy/abort-controller': 3.1.4 + '@smithy/protocol-http': 4.1.3 + '@smithy/querystring-builder': 3.0.6 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/property-provider@3.1.6': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/protocol-http@4.1.3': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/querystring-builder@3.0.6': + dependencies: + '@smithy/types': 3.4.2 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.7.0 + optional: true + + '@smithy/querystring-parser@3.0.6': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/service-error-classification@3.0.6': + dependencies: + '@smithy/types': 3.4.2 + optional: true + + '@smithy/shared-ini-file-loader@3.1.7': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/signature-v4@4.1.4': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + optional: true + + '@smithy/smithy-client@3.3.5': + dependencies: + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-stack': 3.0.6 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + '@smithy/util-stream': 3.1.8 + tslib: 2.7.0 + optional: true + + '@smithy/types@3.4.2': + dependencies: + tslib: 2.7.0 + optional: true + + '@smithy/url-parser@3.0.6': + dependencies: + '@smithy/querystring-parser': 3.0.6 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/util-base64@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + optional: true + + '@smithy/util-body-length-browser@3.0.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@smithy/util-body-length-node@3.0.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.7.0 + optional: true + + '@smithy/util-buffer-from@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + tslib: 2.7.0 + optional: true + + '@smithy/util-config-provider@3.0.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@smithy/util-defaults-mode-browser@3.0.21': + dependencies: + '@smithy/property-provider': 3.1.6 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + bowser: 2.11.0 + tslib: 2.7.0 + optional: true + + '@smithy/util-defaults-mode-node@3.0.21': + dependencies: + '@smithy/config-resolver': 3.0.8 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/node-config-provider': 3.1.7 + '@smithy/property-provider': 3.1.6 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/util-endpoints@2.1.2': + dependencies: + '@smithy/node-config-provider': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/util-hex-encoding@3.0.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@smithy/util-middleware@3.0.6': + dependencies: + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/util-retry@3.0.6': + dependencies: + '@smithy/service-error-classification': 3.0.6 + '@smithy/types': 3.4.2 + tslib: 2.7.0 + optional: true + + '@smithy/util-stream@3.1.8': + dependencies: + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/node-http-handler': 3.2.3 + '@smithy/types': 3.4.2 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.7.0 + optional: true + + '@smithy/util-uri-escape@3.0.0': + dependencies: + tslib: 2.7.0 + optional: true + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.7.0 + optional: true + + '@smithy/util-utf8@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + tslib: 2.7.0 + optional: true + + '@socket.io/component-emitter@3.1.2': {} + + '@tempfix/idb@8.0.3': {} + + '@tempfix/watcher@2.3.0': + dependencies: + stubborn-fs: 1.2.5 + + '@tokenizer/token@0.3.0': {} + + '@tsclass/tsclass@3.0.48': + dependencies: + type-fest: 2.19.0 + + '@tsclass/tsclass@4.1.2': + dependencies: + type-fest: 4.26.1 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.7.2 + + '@types/buffer-json@2.0.3': {} + + '@types/chokidar@2.1.3': + dependencies: + chokidar: 3.6.0 + + '@types/clean-css@4.2.11': + dependencies: + '@types/node': 22.7.2 + source-map: 0.6.1 + + '@types/compression@1.7.5': + dependencies: + '@types/express': 4.17.21 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.7.2 + + '@types/cookie@0.4.1': {} + + '@types/cors@2.8.17': + dependencies: + '@types/node': 22.7.2 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/express-serve-static-core@4.19.5': + dependencies: + '@types/node': 22.7.2 + '@types/qs': 6.9.16 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.16 + '@types/serve-static': 1.15.7 + + '@types/fast-json-stable-stringify@2.1.0': + dependencies: + fast-json-stable-stringify: 2.1.0 + + '@types/finalhandler@1.2.3': + dependencies: + '@types/node': 22.7.2 + + '@types/from2@2.3.5': + dependencies: + '@types/node': 22.7.2 + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.7.2 + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 22.7.2 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 22.7.2 + + '@types/glob@8.1.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 22.7.2 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/html-minifier@4.0.5': + dependencies: + '@types/clean-css': 4.2.11 + '@types/relateurl': 0.2.33 + '@types/uglify-js': 3.17.5 + + '@types/http-errors@2.0.4': {} + + '@types/js-yaml@3.12.10': {} + + '@types/js-yaml@4.0.9': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.7.2 + + '@types/jsonwebtoken@9.0.7': + dependencies: + '@types/node': 22.7.2 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mime-types@2.1.4': {} + + '@types/mime@1.3.5': {} + + '@types/minimatch@3.0.5': {} + + '@types/minimatch@5.1.2': {} + + '@types/ms@0.7.34': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.7.2 + + '@types/node@22.7.2': + dependencies: + undici-types: 6.19.8 + + '@types/qs@6.9.16': {} + + '@types/randomatic@3.1.5': {} + + '@types/range-parser@1.2.7': {} + + '@types/relateurl@0.2.33': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.7.2 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.7.2 + '@types/send': 0.17.4 + + '@types/shortid@0.0.29': {} + + '@types/symbol-tree@3.2.5': {} + + '@types/through2@2.0.41': + dependencies: + '@types/node': 22.7.2 + + '@types/trusted-types@2.0.7': {} + + '@types/turndown@5.0.5': {} + + '@types/uglify-js@3.17.5': + dependencies: + source-map: 0.6.1 + + '@types/unist@3.0.3': {} + + '@types/uuid@7.0.8': {} + + '@types/uuid@9.0.8': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@11.0.5': + dependencies: + '@types/webidl-conversions': 7.0.3 + + '@types/whatwg-url@8.2.2': + dependencies: + '@types/node': 22.7.2 + '@types/webidl-conversions': 7.0.3 + + '@types/which@3.0.4': {} + + '@ungap/structured-clone@1.2.0': {} + + '@webcontainer/api@1.3.0': {} + + '@yr/monotone-cubic-spline@1.0.3': {} + + abbrev@1.1.1: + optional: true + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + agentkeepalive@4.5.0: + dependencies: + humanize-ms: 1.2.1 + + ansi-256-colors@1.1.0: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + apexcharts@3.53.0: + dependencies: + '@yr/monotone-cubic-spline': 1.0.3 + svg.draggable.js: 2.2.2 + svg.easing.js: 2.0.0 + svg.filter.js: 2.0.2 + svg.pathmorphing.js: 0.1.3 + svg.resize.js: 1.4.3 + svg.select.js: 3.0.1 + + aproba@2.0.0: + optional: true + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + async-mutex@0.3.2: + dependencies: + tslib: 2.7.0 + + asynckit@0.4.0: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base64-arraybuffer-es6@0.7.0: {} + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + big-integer@1.6.52: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bowser@2.11.0: + optional: true + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + broadcast-channel@3.7.0: + dependencies: + '@babel/runtime': 7.25.6 + detect-node: 2.1.0 + js-sha3: 0.8.0 + microseconds: 0.2.0 + nano-time: 1.0.0 + oblivious-set: 1.0.0 + rimraf: 3.0.2 + unload: 2.2.0 + + broadcast-channel@7.0.0: + dependencies: + '@babel/runtime': 7.23.4 + oblivious-set: 1.4.0 + p-queue: 6.6.2 + unload: 2.4.1 + + bson@4.7.2: + dependencies: + buffer: 5.7.1 + + bson@6.8.0: {} + + buffer-crc32@0.2.13: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer-json@2.0.0: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camel-case@3.0.0: + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + + camelcase@6.3.0: {} + + canvas@2.11.2: + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + nan: 2.20.0 + simple-get: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: + optional: true + + clean-css@4.2.4: + dependencies: + source-map: 0.6.1 + + clean-stack@1.3.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: + optional: true + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: + optional: true + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.4.2: {} + + cookie@0.6.0: {} + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + create-require@1.1.1: {} + + croner@4.4.1: {} + + croner@5.7.0: {} + + croner@7.0.8: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@5.0.0: + dependencies: + type-fest: 2.19.0 + + css.escape@1.5.1: {} + + dayjs@1.11.13: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + decompress-response@4.2.1: + dependencies: + mimic-response: 2.1.0 + optional: true + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + delegates@1.0.0: + optional: true + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-libc@2.0.3: + optional: true + + detect-node@2.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@4.0.2: {} + + dns2@2.1.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + dommatrix@1.0.3: {} + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-client@6.2.3: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.0.7 + ws: 8.2.3 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-client@6.5.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.0.7: {} + + engine.io-parser@5.2.3: {} + + engine.io@6.2.1: + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 22.7.2 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.0.7 + ws: 8.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io@6.3.1: + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 22.7.2 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.0.7 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io@6.5.4: + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 22.7.2 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + entities@2.2.0: {} + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + esm@3.2.25: {} + + esprima@4.0.1: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + express-force-ssl@0.3.2: + dependencies: + lodash.assign: 3.2.0 + + express@4.21.0: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.10 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + fake-indexeddb@4.0.2: + dependencies: + realistic-structured-clone: 3.0.0 + + fake-indexeddb@5.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-xml-parser@3.21.1: + dependencies: + strnum: 1.0.5 + + fast-xml-parser@4.4.1: + dependencies: + strnum: 1.0.5 + optional: true + + fast-xml-parser@4.5.0: + dependencies: + strnum: 1.0.5 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + feed@4.2.2: + dependencies: + xml-js: 1.6.11 + + file-type@19.5.0: + dependencies: + get-stream: 9.0.1 + strtok3: 8.1.0 + token-types: 6.0.0 + uint8array-extras: 1.4.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + follow-redirects@1.15.9(debug@4.3.7): + optionalDependencies: + debug: 4.3.7 + + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + optional: true + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gauge@3.0.2: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-port@5.1.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + happy-dom@8.9.0: + dependencies: + css.escape: 1.5.1 + he: 1.2.0 + iconv-lite: 0.6.3 + node-fetch: 2.7.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + transitivePeerDependencies: + - encoding + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-unicode@2.0.1: + optional: true + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-sanitize@5.0.1: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + he@1.2.0: {} + + highlight.js@11.10.0: {} + + highlight.js@11.7.0: {} + + html-minifier@4.0.0: + dependencies: + camel-case: 3.0.0 + clean-css: 4.2.4 + commander: 2.20.3 + he: 1.2.0 + param-case: 2.1.1 + relateurl: 0.2.7 + uglify-js: 3.19.3 + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.1.1: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + ibantools@4.5.1: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + idb@7.1.1: {} + + ieee754@1.2.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + ipaddr.js@1.9.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + is-number@4.0.0: {} + + is-number@7.0.0: {} + + is-observable@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-stream@4.0.1: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-base64@3.7.7: {} + + js-sha3@0.8.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.6.3 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + kind-of@6.0.3: {} + + lit-element@3.3.3: + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.1 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + + lit-element@4.1.0: + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.1 + '@lit/reactive-element': 2.0.4 + lit-html: 3.2.0 + + lit-html@2.8.0: + dependencies: + '@types/trusted-types': 2.0.7 + + lit-html@3.2.0: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@2.8.0: + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + + lit@3.2.0: + dependencies: + '@lit/reactive-element': 2.0.4 + lit-element: 4.1.0 + lit-html: 3.2.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash._baseassign@3.2.0: + dependencies: + lodash._basecopy: 3.0.1 + lodash.keys: 3.1.2 + + lodash._basecopy@3.0.1: {} + + lodash._bindcallback@3.0.1: {} + + lodash._createassigner@3.1.1: + dependencies: + lodash._bindcallback: 3.0.1 + lodash._isiterateecall: 3.0.9 + lodash.restparam: 3.6.1 + + lodash._getnative@3.9.1: {} + + lodash._isiterateecall@3.0.9: {} + + lodash.assign@3.2.0: + dependencies: + lodash._baseassign: 3.2.0 + lodash._createassigner: 3.1.1 + lodash.keys: 3.1.2 + + lodash.clonedeep@4.5.0: {} + + lodash.includes@4.3.0: {} + + lodash.isarguments@3.1.0: {} + + lodash.isarray@3.0.4: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.keys@3.1.2: + dependencies: + lodash._getnative: 3.9.1 + lodash.isarguments: 3.1.0 + lodash.isarray: 3.0.4 + + lodash.once@4.1.1: {} + + lodash.restparam@3.6.1: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + lower-case@1.1.4: {} + + lru-cache@10.4.3: {} + + lru-cache@7.18.3: {} + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-error-cause@2.3.0: + dependencies: + make-error: 1.3.6 + + make-error@1.3.6: {} + + markdown-table@3.0.3: {} + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + + matcher@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + math-random@1.0.4: {} + + md5-file@5.0.0: {} + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.1 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-typer@0.3.0: {} + + memory-pager@1.5.0: {} + + merge-descriptors@1.0.3: {} + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + microseconds@0.2.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@4.0.4: {} + + mimic-response@2.1.0: + optional: true + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + optional: true + + minipass@5.0.0: + optional: true + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + optional: true + + mkdirp@1.0.4: + optional: true + + monaco-editor@0.51.0: {} + + mongodb-connection-string-url@2.6.0: + dependencies: + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 + + mongodb-connection-string-url@3.0.1: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 13.0.0 + + mongodb-memory-server-core@8.16.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)): + dependencies: + async-mutex: 0.3.2 + camelcase: 6.3.0 + debug: 4.3.7 + find-cache-dir: 3.3.2 + follow-redirects: 1.15.9(debug@4.3.7) + get-port: 5.1.1 + https-proxy-agent: 5.0.1 + md5-file: 5.0.0 + mongodb: 4.17.2(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + new-find-package-json: 2.0.0 + semver: 7.6.3 + tar-stream: 2.2.0 + tslib: 2.7.0 + uuid: 9.0.1 + yauzl: 2.10.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - supports-color + + mongodb-memory-server@8.16.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)): + dependencies: + mongodb-memory-server-core: 8.16.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + tslib: 2.7.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - supports-color + + mongodb@4.17.2(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)): + dependencies: + bson: 4.7.2 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.3 + optionalDependencies: + '@aws-sdk/credential-providers': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@mongodb-js/saslprep': 1.1.9 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + mongodb@6.9.0(@aws-sdk/credential-providers@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)))(socks@2.8.3): + dependencies: + '@mongodb-js/saslprep': 1.1.9 + bson: 6.8.0 + mongodb-connection-string-url: 3.0.1 + optionalDependencies: + '@aws-sdk/credential-providers': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + socks: 2.8.3 + + ms@2.0.0: {} + + ms@2.1.3: {} + + nan@2.20.0: + optional: true + + nano-time@1.0.0: + dependencies: + big-integer: 1.6.52 + + nanoid@2.1.11: {} + + nanoid@4.0.2: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + new-find-package-json@2.0.0: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + no-case@2.3.2: + dependencies: + lower-case: 1.1.4 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.3.1: {} + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + optional: true + + normalize-newline@4.1.0: + dependencies: + replace-buffer: 1.2.1 + + normalize-path@3.0.0: {} + + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + optional: true + + object-assign@4.1.1: {} + + object-inspect@1.13.2: {} + + object-keys@1.1.1: {} + + oblivious-set@1.0.0: {} + + oblivious-set@1.4.0: {} + + observable-fns@0.6.1: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.0: {} + + param-case@2.1.1: + dependencies: + no-case: 2.3.2 + + parse-ms@2.1.0: {} + + parse-ms@3.0.0: {} + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.10: {} + + path-to-regexp@6.3.0: {} + + path2d@0.2.1: + optional: true + + pdfjs-dist@2.16.105: + dependencies: + dommatrix: 1.0.3 + web-streams-polyfill: 3.3.3 + + pdfjs-dist@4.6.82: + optionalDependencies: + canvas: 2.11.2 + path2d: 0.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + peek-readable@5.2.0: {} + + pend@1.2.0: {} + + picomatch@2.3.1: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + + process-nextick-args@2.0.1: {} + + property-information@6.5.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + randomatic@3.1.1: + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + realistic-structured-clone@3.0.0: + dependencies: + domexception: 1.0.1 + typeson: 6.1.0 + typeson-registry: 1.0.0-alpha.39 + + regenerator-runtime@0.14.1: {} + + relateurl@0.2.7: {} + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-html@16.0.1: + dependencies: + '@types/mdast': 4.0.4 + hast-util-sanitize: 5.0.1 + hast-util-to-html: 9.0.3 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + micromark-util-types: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.5 + + replace-buffer@1.2.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rss-parser@3.13.0: + dependencies: + entities: 2.2.0 + xml2js: 0.5.0 + + rxjs@7.8.1: + dependencies: + tslib: 2.7.0 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: + optional: true + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shortid@2.2.16: + dependencies: + nanoid: 2.1.11 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: + optional: true + + simple-get@3.1.1: + dependencies: + decompress-response: 4.2.1 + once: 1.4.0 + simple-concat: 1.0.1 + optional: true + + smart-buffer@4.2.0: {} + + socket.io-adapter@2.4.0: {} + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-client@4.5.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.2.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-client@4.7.5: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.5.4 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.5.4: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + debug: 4.3.7 + engine.io: 6.2.1 + socket.io-adapter: 2.4.0 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io@4.7.5: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.5.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + sprintf-js@1.0.3: {} + + sprintf-js@1.1.3: {} + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + + strnum@1.0.5: {} + + strtok3@8.1.0: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.2.0 + + stubborn-fs@1.2.5: {} + + svg.draggable.js@2.2.2: + dependencies: + svg.js: 2.7.1 + + svg.easing.js@2.0.0: + dependencies: + svg.js: 2.7.1 + + svg.filter.js@2.0.2: + dependencies: + svg.js: 2.7.1 + + svg.js@2.7.1: {} + + svg.pathmorphing.js@0.1.3: + dependencies: + svg.js: 2.7.1 + + svg.resize.js@1.4.3: + dependencies: + svg.js: 2.7.1 + svg.select.js: 2.1.2 + + svg.select.js@2.1.2: + dependencies: + svg.js: 2.7.1 + + svg.select.js@3.0.1: + dependencies: + svg.js: 2.7.1 + + sweet-scroll@4.0.0: {} + + symbol-tree@3.2.4: {} + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + optional: true + + threads@1.7.0: + dependencies: + callsites: 3.1.0 + debug: 4.3.7 + is-observable: 2.1.0 + observable-fns: 0.6.1 + optionalDependencies: + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + tiny-worker@2.3.0: + dependencies: + esm: 3.2.25 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + token-types@6.0.0: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tr46@0.0.3: {} + + tr46@2.1.0: + dependencies: + punycode: 2.3.1 + + tr46@3.0.0: + dependencies: + punycode: 2.3.1 + + tr46@4.1.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-node@10.9.2(@types/node@22.7.2)(typescript@5.5.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.7.2 + acorn: 8.12.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.2(@types/node@22.7.2)(typescript@5.6.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.7.2 + acorn: 8.12.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@2.7.0: {} + + turndown-plugin-gfm@1.0.2: {} + + turndown@7.2.0: + dependencies: + '@mixmark-io/domino': 2.2.0 + + type-fest@2.19.0: {} + + type-fest@4.26.1: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typescript@5.3.3: {} + + typescript@5.5.2: {} + + typescript@5.6.2: {} + + typeson-registry@1.0.0-alpha.39: + dependencies: + base64-arraybuffer-es6: 0.7.0 + typeson: 6.1.0 + whatwg-url: 8.7.0 + + typeson@6.1.0: {} + + uglify-js@3.19.3: {} + + uint8array-extras@1.4.0: {} + + undici-types@6.19.8: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + unload@2.2.0: + dependencies: + '@babel/runtime': 7.25.6 + detect-node: 2.1.0 + + unload@2.4.1: {} + + unpipe@1.0.0: {} + + upper-case@1.1.3: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.13.0 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@7.0.3: {} + + uuid@9.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + + vary@1.1.2: {} + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@4.0.2: {} + + webidl-conversions@6.1.0: {} + + webidl-conversions@7.0.0: {} + + whatwg-encoding@2.0.0: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@3.0.0: {} + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@13.0.0: + dependencies: + tr46: 4.1.1 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + whatwg-url@8.7.0: + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.1 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + optional: true + + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.11.0: {} + + ws@8.17.1: {} + + ws@8.2.3: {} + + xml-js@1.6.11: + dependencies: + sax: 1.4.1 + + xml2js@0.5.0: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + xmlhttprequest-ssl@2.0.0: {} + + xterm-addon-fit@0.8.0(xterm@5.3.0): + dependencies: + xterm: 5.3.0 + + xterm@5.3.0: {} + + yallist@4.0.0: + optional: true + + yargs-parser@21.1.1: {} + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yn@3.1.1: {} + + zwitch@2.0.4: {} diff --git a/qenv.yml b/qenv.yml new file mode 100644 index 0000000..9168a5f --- /dev/null +++ b/qenv.yml @@ -0,0 +1 @@ +required: diff --git a/readme.hints.md b/readme.hints.md new file mode 100644 index 0000000..93e4a7a --- /dev/null +++ b/readme.hints.md @@ -0,0 +1,3 @@ +# Project Readme Hints + +This is the initial readme hints file. \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..69b9db6 --- /dev/null +++ b/readme.md @@ -0,0 +1 @@ +## Usage diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts new file mode 100644 index 0000000..109ff42 --- /dev/null +++ b/ts/00_commitinfo_data.ts @@ -0,0 +1,8 @@ +/** + * autocreated commitinfo by @pushrocks/commitinfo + */ +export const commitinfo = { + name: '@idp.global/idp.global', + version: 'x.x.x', + description: 'website for lossless.com' +} diff --git a/ts/ffb.paths.ts b/ts/ffb.paths.ts new file mode 100644 index 0000000..5fa6bf1 --- /dev/null +++ b/ts/ffb.paths.ts @@ -0,0 +1,7 @@ +import * as plugins from './ffb.plugins.js'; + +export const packageDir = plugins.path.join( + plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), + '../', +); +export const distWebDir = plugins.path.join(packageDir, 'dist_serve/'); diff --git a/ts/ffb.plugins.ts b/ts/ffb.plugins.ts new file mode 100644 index 0000000..8021a26 --- /dev/null +++ b/ts/ffb.plugins.ts @@ -0,0 +1,14 @@ +// native scope +import * as path from 'path'; +export { path }; + +// @api.global scope +import * as typedserver from '@api.global/typedserver'; + +export { typedserver }; + +// @pushrocks scope +import * as qenv from '@push.rocks/qenv'; +import * as smartpath from '@push.rocks/smartpath'; + +export { qenv, smartpath }; diff --git a/ts/index.ts b/ts/index.ts new file mode 100644 index 0000000..d8a67b0 --- /dev/null +++ b/ts/index.ts @@ -0,0 +1,12 @@ +import * as plugins from './ffb.plugins.js'; +import * as paths from './ffb.paths.js'; + +export const runCli = async () => { + const serviceQenv = new plugins.qenv.Qenv('./', './.nogit', false); + const websiteServer = new plugins.typedserver.utilityservers.UtilityWebsiteServer({ + feedMetadata: null, + domain: 'idp.global', + serveDir: paths.distWebDir, + }); + await websiteServer.start(); +}; diff --git a/ts/reception/classes.apitoken.ts b/ts/reception/classes.apitoken.ts new file mode 100644 index 0000000..5bc2bd1 --- /dev/null +++ b/ts/reception/classes.apitoken.ts @@ -0,0 +1,34 @@ +import { ApiTokenManager } from './classes.apitokenmanager.js'; +import * as plugins from './plugins.js'; + +@plugins.smartdata.Manager(() => { + return (this as any).manager; +}) +export class ApiToken extends plugins.smartdata.SmartDataDbDoc< + ApiToken, + ApiToken, + ApiTokenManager +> { + static clearOldApiTokens() {} + + static clearApiTokensForUserId(userId: string) {} + + @plugins.smartdata.unI() + public id: string; + + @plugins.smartdata.unI() + public ownerEntityId: string; + + @plugins.smartdata.svDb() + data: { + token: string; + scopes: string[]; + } = { + token: null, + scopes: null, + }; + + constructor() { + super(); + } +} diff --git a/ts/reception/classes.apitokenmanager.ts b/ts/reception/classes.apitokenmanager.ts new file mode 100644 index 0000000..4be22ef --- /dev/null +++ b/ts/reception/classes.apitokenmanager.ts @@ -0,0 +1,12 @@ +import { Reception } from './classes.reception.js'; +import * as plugins from './plugins.js'; + +export class ApiTokenManager { + public receptionRef: Reception; + public get db() { + return this.receptionRef.db.smartdataDb; + } + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + } +} diff --git a/ts/reception/classes.billingplan.ts b/ts/reception/classes.billingplan.ts new file mode 100644 index 0000000..bf50cc1 --- /dev/null +++ b/ts/reception/classes.billingplan.ts @@ -0,0 +1,36 @@ +import * as plugins from './plugins.js'; +import { BillingPlanManager } from './classes.billingplanmanager.js'; +import { User } from './classes.user.js'; + +/** + * a billing plan belongs to a user which can then attribute the billing plan to a organization + */ +@plugins.smartdata.Manager() +export class BillingPlan extends plugins.smartdata.SmartDataDbDoc< + BillingPlan, + plugins.lointReception.data.IBillingPlan, + BillingPlanManager +> { + // STATIC + public static syncForUser(userArg: User) { + // TODO sync this for user + } + + @plugins.smartdata.svDb() + public id: string; + + @plugins.smartdata.svDb() + public data: plugins.lointReception.data.IBillingPlan['data'] = { + type: null, + organizationId: null, + lastProcessed: null, + seats: null, + status: null, + billingEvents: [], + communications: [], + nextBilling: null, + proEnabled: false, + alternativePaymentData: null, + paddleData: null, + }; +} diff --git a/ts/reception/classes.billingplanmanager.ts b/ts/reception/classes.billingplanmanager.ts new file mode 100644 index 0000000..5084770 --- /dev/null +++ b/ts/reception/classes.billingplanmanager.ts @@ -0,0 +1,64 @@ +import { Reception } from './classes.reception.js'; +import { BillingPlan } from './classes.billingplan.js'; +import * as plugins from './plugins.js'; + +export class BillingPlanManager { + public receptionRef: Reception; + public get db() { + return this.receptionRef.db.smartdataDb; + } + public typedrouter = new plugins.typedrequest.TypedRouter(); + + public CBillingPlan = plugins.smartdata.setDefaultManagerForDoc(this, BillingPlan); + + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + this.receptionRef.typedrouter.addTypedRouter(this.typedrouter); + this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updatePaymentMethod', async reqDataArg => { + const user = await this.receptionRef.userManager.getUserByJwt(reqDataArg.jwtString); + const organization = await this.receptionRef.organizationmanager.COrganization.getInstance({ + id: reqDataArg.orgId, + }); + const userIsAdmin = await organization.checkIfUserIsAdmin(user); + if (!userIsAdmin) { + throw new plugins.typedrequest.TypedResponseError('user is not an admin for the organization that the billing plan is for'); + } + // ok user is admin + const newBillingPlan = new this.CBillingPlan(); + newBillingPlan.id = plugins.smartunique.shortId(); + newBillingPlan.data = { + type: 'Paddle', + proEnabled: false, + organizationId: reqDataArg.orgId, + status: 'active', + seats: 0, + alternativePaymentData: null, + billingEvents: [], + communications: [], + lastProcessed: Date.now(), + nextBilling: { + items: [], + method: 'paddle', + ontrack: true, + selectedBillingDate: Date.now(), + }, + paddleData: { + checkoutId: reqDataArg.paddle?.checkoutId + } + } + await newBillingPlan.save(); + return { + billingPlan: { + id: newBillingPlan.id, + data: { + type: newBillingPlan.data.type, + organizationId: newBillingPlan.data.organizationId, + proEnabled: newBillingPlan.data.proEnabled, + nextBilling: newBillingPlan.data.nextBilling, + billingEvents: newBillingPlan.data.billingEvents, + } + } + } + })) + } +} diff --git a/ts/reception/classes.housekeeping.ts b/ts/reception/classes.housekeeping.ts new file mode 100644 index 0000000..918d0e4 --- /dev/null +++ b/ts/reception/classes.housekeeping.ts @@ -0,0 +1,45 @@ +import * as plugins from './plugins.js'; +import { Reception } from './classes.reception.js'; +import { logger } from './logging.js'; + +export class ReceptionHousekeeping { + public receptionRef: Reception; + public taskmanager = new plugins.taskbuffer.TaskManager(); + + constructor(receptionArg: Reception) { + this.receptionRef = receptionArg; + + // lets care about old loginsessions + this.taskmanager.addAndScheduleTask( + new plugins.taskbuffer.Task({ + name: 'oldLoginSessions', + taskFunction: async () => { + logger.log('info', 'running login sessions cleaning task'); + const oneWeekBeforeTimestamp = + Date.now() - plugins.smarttime.getMilliSecondsFromUnits({ weeks: 1 }); + const oldLoginSessions = + await this.receptionRef.loginSessionManager.CLoginSession.getInstances({ + data: { + validUntil: { + $lt: oneWeekBeforeTimestamp, + } as any, + }, + }); + for (const loginSession of oldLoginSessions) { + await loginSession.delete(); + } + logger.log('info', `Completed deletion of ${oldLoginSessions.length} old loginSessions`); + }, + }), + '2 * * * * *' + ); + + this.taskmanager.start(); + logger.log('info', 'housekeeping started'); + } + + public async stop() { + this.taskmanager.stop(); + logger.log('info', 'housekeeping stopped'); + } +} diff --git a/ts/reception/classes.jwt.ts b/ts/reception/classes.jwt.ts new file mode 100644 index 0000000..6e4f1a0 --- /dev/null +++ b/ts/reception/classes.jwt.ts @@ -0,0 +1,78 @@ +import * as plugins from './plugins.js'; +import { JwtManager } from './classes.jwtmanager.js'; + +/** + * a User is identified by its username or email. + * Both need to be unique and both can be changed. + */ +@plugins.smartdata.Manager() +export class Jwt extends plugins.smartdata.SmartDataDbDoc { + // STATIC + public static async createJwtForRefreshToken( + jwtManagerInstance: JwtManager, + refreshTokenArg: string + ) { + const loginSession = + await jwtManagerInstance.receptionRef.loginSessionManager.CLoginSession.getLoginSessionByRefreshToken( + refreshTokenArg + ); + if (!loginSession) { + return null; + } + const refreshTokenValid = await loginSession.validateRefreshToken(refreshTokenArg); + if (!refreshTokenValid) { + return null; + } + const user = await jwtManagerInstance.receptionRef.userManager.CUser.getInstance({ + id: loginSession.data.userId, + }); + const validUntil = plugins.smarttime.ExtendedDate.fromMillis( + Date.now() + plugins.smarttime.getMilliSecondsFromUnits({ days: 1 }) + ); + const jwt = new Jwt(); + jwt.id = plugins.smartunique.shortId(); + jwt.data = { + userId: user.id, + validUntil: validUntil.getTime(), + refreshEvery: 1000000, + refreshFrom: Date.now() + plugins.smarttime.getMilliSecondsFromUnits({ days: 0.5 }), + refreshToken: await loginSession.getRefreshToken(), // TODO: handle multiple refresh tokens + justForLooks: { + validUntilIsoString: validUntil.toISOString(), + } + }; + + await jwt.save(); + + const jwtString = await jwtManagerInstance.smartjwtInstance.createJWT({ + id: jwt.id, + blocked: null, + data: jwt.data, + } as plugins.lointReception.data.IJwt); + return jwtString; + } + + // INSTANCE + @plugins.smartdata.unI() + public id: string; + + @plugins.smartdata.svDb() + public blocked: boolean = false; + + @plugins.smartdata.svDb() + public data: plugins.lointReception.data.IJwt['data']; + + public async block() { + this.blocked = true; + await this.save(); + } + + public async getLoginSession() { + const loginSession = await this.manager.receptionRef.loginSessionManager.CLoginSession.getInstance({ + data: { + refreshToken: this.data.refreshToken, + } + }); + return loginSession; + } +} diff --git a/ts/reception/classes.jwtmanager.ts b/ts/reception/classes.jwtmanager.ts new file mode 100644 index 0000000..226072c --- /dev/null +++ b/ts/reception/classes.jwtmanager.ts @@ -0,0 +1,141 @@ +import * as plugins from './plugins.js'; +import { Reception } from './classes.reception.js'; +import { Jwt } from './classes.jwt.js'; + +export class JwtManager { + public receptionRef: Reception; + public get db() { + return this.receptionRef.db.smartdataDb; + } + + public smartjwtInstance = new plugins.smartjwt.SmartJwt(); + public jwtManagerEasyStore: plugins.smartdata.EasyStore<{ + jwtJsonKeypair: plugins.tsclass.network.IJwtKeypair; + }>; + public blockedJwtIdList: string[] = []; + + public typedrouter = new plugins.typedrequest.TypedRouter(); + + public CJwt = plugins.smartdata.setDefaultManagerForDoc(this, Jwt); + + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + this.receptionRef.typedrouter.addTypedRouter(this.typedrouter); + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'refreshJwt', + async (requestArg) => { + const resultJwt = await Jwt.createJwtForRefreshToken(this, requestArg.refreshToken); + return { + status: 'loggedIn', + jwt: resultJwt, + }; + } + ) + ); + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getPublicKeyForValidation', + async (requestArg) => { + // TODO control backend token + return { + publicKeyPem: this.smartjwtInstance.getKeyPairAsJson().publicPem, + }; + } + ) + ); + + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'pushOrGetJwtIdBlocklist', + async (requestArg) => { + // TODO control backend token + return { + blockedJwtIds: this.blockedJwtIdList + }; + } + ) + ); + } + + public async pushPublicKeyToClients() { + const targetConnections = + await this.receptionRef.serviceServer.typedsocket.findAllTargetConnectionsByTag( + 'lole-reception', + { + backendToken: '', + } + ); + for (const targetConnection of targetConnections) { + const pushPublicKeyTr = + this.receptionRef.serviceServer.typedsocket.createTypedRequest( + 'pushPublicKeyForValidation', + targetConnection + ); + await pushPublicKeyTr.fire({ + publicKeyPem: this.smartjwtInstance.getKeyPairAsJson().publicPem, + }); + } + } + + public async pushBlockedJwtIdListToClients() { + const targetConnections = + await this.receptionRef.serviceServer.typedsocket.findAllTargetConnectionsByTag( + 'lole-reception', + { + backendToken: '', + } + ); + for (const targetConnection of targetConnections) { + const pushPublicKeyTr = + this.receptionRef.serviceServer.typedsocket.createTypedRequest( + 'pushOrGetJwtIdBlocklist', + targetConnection + ); + await pushPublicKeyTr.fire({ + blockedJwtIds: this.blockedJwtIdList + }); + } + } + + public async start() { + this.jwtManagerEasyStore = await this.receptionRef.db.smartdataDb.createEasyStore( + 'jwtManagerEasyStore' + ); + await this.smartjwtInstance.init(); + let existingKeyPair = await this.jwtManagerEasyStore.readKey('jwtJsonKeypair'); + if (!existingKeyPair) { + await this.rotateKeyPair(); + } + existingKeyPair = await this.jwtManagerEasyStore.readKey('jwtJsonKeypair'); + this.smartjwtInstance.setKeyPairAsJson(existingKeyPair); + } + + public async rotateKeyPair() { + await this.smartjwtInstance.createNewKeyPair(); + await this.jwtManagerEasyStore.writeKey( + 'jwtJsonKeypair', + this.smartjwtInstance.getKeyPairAsJson() + ); + await this.pushPublicKeyToClients(); + } + + public async verifyJWTAndGetData(jwtArg: string): Promise { + const jwtData: plugins.lointReception.data.IJwt = await this.smartjwtInstance.verifyJWTAndGetData(jwtArg); + const jwt = await Jwt.getInstance({ + id: jwtData.id, + }); + if (jwt.blocked) { + return null; + } + if (jwt) { + const loginSession = await jwt.getLoginSession(); + if (!loginSession) { + await jwt.block(); + this.blockedJwtIdList.push(jwt.id); + return null; + } + } + return jwt; + } +} diff --git a/ts/reception/classes.loginsession.ts b/ts/reception/classes.loginsession.ts new file mode 100644 index 0000000..a856548 --- /dev/null +++ b/ts/reception/classes.loginsession.ts @@ -0,0 +1,114 @@ +import * as plugins from './plugins.js'; +import { LoginSessionManager } from './classes.loginsessionmanager.js'; +import { User } from './classes.user.js'; + +/** + * a LoginSession keeps track of a login over the whole time of the user being loggedin + */ +@plugins.smartdata.Manager() +export class LoginSession extends plugins.smartdata.SmartDataDbDoc< + LoginSession, + plugins.lointReception.data.ILoginSession, + LoginSessionManager +> { + // ====== + // static + // ====== + public static async createLoginSessionForUser(userArg: User, deleteOtherSessions = false) { + const loginSession = new LoginSession(); + loginSession.id = plugins.smartunique.shortId(); + loginSession.data.userId = userArg.id; + await loginSession.save(); + return loginSession; + } + + public static async clearLoginSessionsForUser(userArg: User) { + // lets find existing sessions + const existingSessions = await LoginSession.getInstances({ + id: userArg.id, + }); + + for (const existingSession of existingSessions) { + await existingSession.delete(); + } + } + + public static async getLoginSessionBySessionId(sessionIdArg: string) { + return await LoginSession.getInstance({ + id: sessionIdArg, + }); + } + + public static async getLoginSessionByRefreshToken(refreshTokenArg: string) { + const loginSession = await LoginSession.getInstance({ + data: { + refreshToken: refreshTokenArg, + }, + }); + return loginSession; + } + + // ======== + // INSTANCE + // ======== + @plugins.smartdata.unI() + public id: string; + + @plugins.smartdata.svDb() + public data: plugins.lointReception.data.ILoginSession['data'] = { + userId: null, + validUntil: Date.now() + plugins.smarttime.getMilliSecondsFromUnits({ weeks: 1 }), + invalidated: false, + refreshToken: null, + deviceId: null + }; + + public transferToken: string; + + constructor() { + super(); + } + + /** + * invalidates a session + */ + public async invalidate() { + this.data.invalidated = true; + await this.save(); + } + + /** + * a refresh token is unique to a login session and ONLY created once per login session + * @returns + */ + public async getRefreshToken() { + if (this.data.invalidated) { + console.log('login session is invalidated. no refresh token can be generated.'); + return null; + } + if (!this.data.refreshToken) { + this.data.refreshToken = plugins.smartunique.uni('refresh_'); + } + await this.save(); + return this.data.refreshToken; + } + + public async getTransferToken() { + this.transferToken = plugins.smartunique.uni('transfer_'); + return this.transferToken; + } + + public async validateRefreshToken(refreshTokenArg: string) { + return this.data.refreshToken === refreshTokenArg; + } + + public async validateTransferToken(transferTokenArg: string) { + const result = this.transferToken === transferTokenArg; + + // a transfer token can only be used once, so we invalidate it here + if (result) { + this.transferToken = null; + } + return result; + } +} diff --git a/ts/reception/classes.loginsessionmanager.ts b/ts/reception/classes.loginsessionmanager.ts new file mode 100644 index 0000000..ee43745 --- /dev/null +++ b/ts/reception/classes.loginsessionmanager.ts @@ -0,0 +1,259 @@ +import * as plugins from './plugins.js'; +import { LoginSession } from './classes.loginsession.js'; +import { Reception } from './classes.reception.js'; + +export class LoginSessionManager { + // refs + public receptionRef: Reception; + public get db() { + return this.receptionRef.db.smartdataDb; + } + + public CLoginSession = plugins.smartdata.setDefaultManagerForDoc(this, LoginSession); + + public loginSessions = new plugins.lik.ObjectMap(); + + public typedRouter = new plugins.typedrequest.TypedRouter(); + + public emailTokenMap = new plugins.lik.ObjectMap<{ + email: string; + token: string; + action: 'emailLogin' | 'passwordReset'; + }>(); + + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + this.receptionRef.typedrouter.addTypedRouter(this.typedRouter); + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'loginWithEmailOrUsernameAndPassword', + async (requestData) => { + let user = await this.receptionRef.userManager.CUser.getInstance({ + data: { + username: requestData.username, + passwordHash: await this.receptionRef.userManager.CUser.hashPassword( + requestData.password + ), + }, + }); + + if (!user && requestData.username.includes('@')) { + user = await this.receptionRef.userManager.CUser.getInstance({ + data: { + email: requestData.username, + passwordHash: await this.receptionRef.userManager.CUser.hashPassword( + requestData.password + ), + }, + }); + } + + if (user) { + // lets recheck + if ( + (user.data.username !== requestData.username && + user.data.email !== requestData.username) || + user.data.passwordHash !== + (await this.receptionRef.userManager.CUser.hashPassword(requestData.password)) + ) { + throw new Error( + 'database returned a user that does not match wanted criterea. CRITICAL!' + ); + } + + const loginSession = await LoginSession.createLoginSessionForUser(user); + this.loginSessions.add(loginSession); + const refreshToken = await loginSession.getRefreshToken(); + + return { + status: 'ok', + refreshToken: refreshToken, + twoFaNeeded: false, + }; + } else { + throw new plugins.typedrequest.TypedResponseError('User not found!'); + } + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'loginWithEmail', + async (requestDataArg) => { + const existingUser = await this.receptionRef.userManager.CUser.getInstance({ + data: { + email: requestDataArg.email, + }, + }); + if (existingUser) { + this.emailTokenMap.findOneAndRemoveSync( + (itemArg) => itemArg.email === existingUser.data.email + ); + const loginEmailToken = plugins.smartunique.uuid4(); + this.emailTokenMap.add({ + email: existingUser.data.email, + token: loginEmailToken, + action: 'emailLogin', + }); + // lets make sure its only valid for 10 minutes + plugins.smartdelay.delayFor(600000, null, true).then(() => { + this.emailTokenMap.findOneAndRemoveSync( + (itemArg) => itemArg.token === loginEmailToken + ); + }); + this.receptionRef.receptionMailer.sendLoginWithEMailMail(existingUser, loginEmailToken); + } + return { + status: 'ok', + testOnlyToken: process.env.TEST_MODE + ? this.emailTokenMap.findSync((itemArg) => itemArg.email === existingUser.data.email) + .token + : null, + }; + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'loginWithEmailAfterEmailTokenAquired', + async (requestArg) => { + const tokenObject = this.emailTokenMap.findSync((itemArg) => { + return itemArg.email === requestArg.email && itemArg.token === requestArg.token; + }); + if (tokenObject) { + const user = await this.receptionRef.userManager.CUser.getInstance({ + data: { + email: requestArg.email, + }, + }); + const loginSession = await LoginSession.createLoginSessionForUser(user); + this.loginSessions.add(loginSession); + return { + refreshToken: await loginSession.getRefreshToken(), + }; + } else { + throw new plugins.typedrequest.TypedResponseError('Validation Token not found'); + } + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler('logout', async (requestDataArg) => { + const loginSession = await this.CLoginSession.getLoginSessionByRefreshToken(requestDataArg.refreshToken); + await loginSession.invalidate(); + return {} + }) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'exchangeRefreshTokenAndTransferToken', + async (requestDataArg) => { + switch (true) { + case !!requestDataArg.refreshToken: + const loginSession = await this.loginSessions.find(async (loginSessionArg) => { + return loginSessionArg.validateRefreshToken(requestDataArg.refreshToken); + }); + if (!loginSession) { + throw new plugins.typedrequest.TypedResponseError('your refresh token is invalid'); + } + return { + transferToken: await loginSession.getTransferToken(), + }; + break; + case !!requestDataArg.transferToken: + let transferToken: string; + const loginSession2 = await this.loginSessions.find(async (loginSessionArg) => { + return loginSessionArg.validateTransferToken(requestDataArg.transferToken); + }); + if (!loginSession2) { + throw new plugins.typedrequest.TypedResponseError( + 'Your transfer token is not valid.' + ); + } + return { + refreshToken: await loginSession2.getRefreshToken(), + }; + break; + } + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'resetPassword', + async (requestDataArg) => { + const emailOfPasswordToReset = requestDataArg.email; + const existingUser = await this.receptionRef.userManager.CUser.getInstance({ + data: { + email: emailOfPasswordToReset, + }, + }); + if (existingUser) { + this.emailTokenMap.findOneAndRemoveSync( + (itemArg) => itemArg.email === existingUser.data.email + ); + this.emailTokenMap.add({ + email: existingUser.data.email, + token: plugins.smartunique.shortId(), + action: 'passwordReset', + }); + plugins.smartdelay.delayFor(600000, null, true).then(() => { + this.emailTokenMap.findOneAndRemoveSync( + (itemArg) => itemArg.email === existingUser.data.email + ); + }); + this.receptionRef.receptionMailer.sendPasswordResetMail( + existingUser, + this.emailTokenMap.findSync((itemArg) => itemArg.email === existingUser.data.email) + .token + ); + } + // note: we always return ok here, since we don't want to give any indication as to wether a user is already registered with us. + return { + status: 'ok', + }; + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'setNewPassword', + async (requestData) => { + return { + status: 'ok', + }; + } + ) + ); + + /** + * returns a device id by simply returning a uuid4 + */ + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler('obtainDeviceId', async (reqData) => { + reqData; + return { + deviceId: { + id: plugins.smartunique.uuid4() + } + } + }) + ) + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler('attachDeviceId', async (reqData) => { + // TODO: Blocked by proper JWT handling + reqData.jwt; + return { + ok: false + } + }) + ) + } +} diff --git a/ts/reception/classes.organization.ts b/ts/reception/classes.organization.ts new file mode 100644 index 0000000..98a519b --- /dev/null +++ b/ts/reception/classes.organization.ts @@ -0,0 +1,40 @@ +import * as plugins from './plugins.js'; +import { OrganizationManager } from './classes.organizationmanager.js'; +import { User } from './classes.user.js'; + +@plugins.smartdata.Manager() +export class Organization extends plugins.smartdata.SmartDataDbDoc< + Organization, + plugins.lointReception.data.IOrganization, + OrganizationManager +> { + public static async createNewOrganizationForUser( + organizationManagerArg: OrganizationManager, + userIdArg: string, + orgNameArg: string, + slugNameArg: string, + ) { + const newOrg = new Organization(); + newOrg.id = plugins.smartunique.shortId(); + newOrg.data = { + name: orgNameArg, + slug: slugNameArg, + billingPlanId: null, + roleIds: [], + } + await newOrg.save(); + return newOrg; + } + + // INSTANCE + @plugins.smartdata.unI() + id: plugins.lointReception.data.IOrganization['id']; + + @plugins.smartdata.svDb() + data: plugins.lointReception.data.IOrganization['data']; + + public async checkIfUserIsAdmin(userArg: User) { + const role = await this.manager.receptionRef.roleManager.getRoleForUserAndOrg(userArg, this); + return role.data.role === 'admin'; + } +} diff --git a/ts/reception/classes.organizationmanager.ts b/ts/reception/classes.organizationmanager.ts new file mode 100644 index 0000000..d3e4cec --- /dev/null +++ b/ts/reception/classes.organizationmanager.ts @@ -0,0 +1,115 @@ +import * as plugins from './plugins.js'; +import { Reception } from './classes.reception.js'; +import { Organization } from './classes.organization.js'; +import { User } from './classes.user.js'; + +export class OrganizationManager { + public receptionRef: Reception; + public get db() { + return this.receptionRef.db.smartdataDb; + } + public typedrouter = new plugins.typedrequest.TypedRouter(); + + public COrganization = plugins.smartdata.setDefaultManagerForDoc(this, Organization); + + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + this.receptionRef.typedrouter.addTypedRouter(this.typedrouter); + + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'createOrganization', + async (requestArg) => { + const nameIsAvailable = async () => { + const existingOrg = await this.COrganization.getInstance({ + data: { + slug: requestArg.organizationSlug, + }, + }); + const nameAvailable = !existingOrg; + return nameAvailable; + }; + switch (requestArg.action) { + case 'checkAvailability': + return { + nameAvailable: await nameIsAvailable(), + }; + break; + case 'manifest': + const nameCheckedOk = await nameIsAvailable(); + const userData = await this.receptionRef.userManager.getUserByJwtValidation( + requestArg.jwt + ); + const newOrg = await this.COrganization.createNewOrganizationForUser( + this, + userData.id, + requestArg.organizationName, + requestArg.organizationSlug + ); + const role = await this.receptionRef.roleManager.modifyRoleForUserAtOrg({ + action: 'create', + organizationId: newOrg.id, + userId: userData.id, + role: 'admin', + }); + newOrg.data.roleIds.push(role.id); + await newOrg.save(); + return { + nameAvailable: true, + resultingOrganization: await newOrg.createSavableObject() + } + break; + } + } + ) + ); + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getOrganizationById', + async (requestArg) => { + const verifiedJwt = await this.receptionRef.jwtManager.verifyJWTAndGetData( + requestArg.jwt + ); + const user = await this.receptionRef.userManager.CUser.getInstance({ + id: verifiedJwt.data.userId, + }); + const organization = await this.COrganization.getInstance({ + id: requestArg.id + }); + const role = await this.receptionRef.roleManager.CRole.getInstance({ + data: { + organizationId: organization.id, + userId: user.id, + } + }); + + if (!role) { + throw new plugins.typedrequest.TypedResponseError('User not authorized for the requested organization.'); + } + return { + organization: await organization.createSavableObject() + }; + } + ) + ); + } + + public async getAllOrganizationsForUser( + userArg: User, + ) { + + const organizations: Organization[] = []; + const userRoles = await this.receptionRef.roleManager.getAllRolesForUser(userArg); + + for (const role of userRoles) { + const organization = await this.receptionRef.organizationmanager.COrganization.getInstance({ + id: role.data.organizationId + }); + if (!organizations.find(orgArg => orgArg.id === organization.id)) { + organizations.push(organization); + } + } + + return organizations; + } +} diff --git a/ts/reception/classes.reception.ts b/ts/reception/classes.reception.ts new file mode 100644 index 0000000..d11c2f2 --- /dev/null +++ b/ts/reception/classes.reception.ts @@ -0,0 +1,61 @@ +import * as plugins from './plugins.js'; +import * as paths from './paths.js'; +import { logger } from './logging.js'; + +import { JwtManager } from './classes.jwtmanager.js'; +import { LoginSessionManager } from './classes.loginsessionmanager.js'; +import { RegistrationSessionManager } from './classes.registrationsessionmanager.js'; +import { ReceptionServer } from './classes.receptionserver.js'; +import { ReceptionDb } from './classes.receptiondb.js'; +import { ReceptionMailer } from './classes.receptionmailer.js'; +import { UserManager } from './classes.usermanager.js'; +import { ApiTokenManager } from './classes.apitokenmanager.js'; +import { ReceptionHousekeeping } from './classes.housekeeping.js'; +import { OrganizationManager } from './classes.organizationmanager.js'; +import { RoleManager } from './classes.rolemanager.js'; +import { BillingPlanManager } from './classes.billingplanmanager.js'; + +export class Reception { + public projectinfoNpm = new plugins.projectinfo.ProjectinfoNpm(paths.packageDir); + public typedrouter = new plugins.typedrequest.TypedRouter(); + public serviceQenv = new plugins.qenv.Qenv('./', './.nogit'); + public szPlatformClient = new plugins.szPlatformClient.SzPlatformClient(); + public db = new ReceptionDb(this); + + // server + public serviceServer = new ReceptionServer(this); + + // managers + public jwtManager = new JwtManager(this); + public loginSessionManager = new LoginSessionManager(this); + public registrationSessionManager = new RegistrationSessionManager(this); + public apitokenManager = new ApiTokenManager(this); + public receptionMailer = new ReceptionMailer(this); + public userManager = new UserManager(this); + public organizationmanager = new OrganizationManager(this); + public roleManager = new RoleManager(this); + public billingPlanManager = new BillingPlanManager(this); + housekeeping = new ReceptionHousekeeping(this); + + constructor(public databaseName?: string) {} + + /** + * starts the reception instance + */ + public async start() { + logger.log('info', 'starting reception'); + await this.db.start(this.databaseName); + await this.jwtManager.start(); + await this.serviceServer.start(); + } + + /** + * stops the reception instance + */ + public async stop() { + await this.housekeeping.stop(); + await this.serviceServer.stop(); + console.log('stopped serviceserver!'); + await this.db.stop(); + } +} diff --git a/ts/reception/classes.receptiondb.ts b/ts/reception/classes.receptiondb.ts new file mode 100644 index 0000000..c731b55 --- /dev/null +++ b/ts/reception/classes.receptiondb.ts @@ -0,0 +1,25 @@ +import * as plugins from './plugins.js'; +import { Reception } from './classes.reception.js'; + +export class ReceptionDb { + public smartdataDb: plugins.smartdata.SmartdataDb; + public receptionRef: Reception; + + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + } + + public async start(databaseNameArg?: string) { + this.smartdataDb = new plugins.smartdata.SmartdataDb({ + mongoDbUser: await this.receptionRef.serviceQenv.getEnvVarOnDemand('MONGO_DB_USER'), + mongoDbName: databaseNameArg || await this.receptionRef.serviceQenv.getEnvVarOnDemand('MONGO_DB_NAME'), + mongoDbPass: await this.receptionRef.serviceQenv.getEnvVarOnDemand('MONGO_DB_PASS'), + mongoDbUrl: await this.receptionRef.serviceQenv.getEnvVarOnDemand('MONGO_DB_URL'), + }); + await this.smartdataDb.init(); + } + + public async stop() { + await this.smartdataDb.close(); + } +} diff --git a/ts/reception/classes.receptionmailer.ts b/ts/reception/classes.receptionmailer.ts new file mode 100644 index 0000000..ffbfd59 --- /dev/null +++ b/ts/reception/classes.receptionmailer.ts @@ -0,0 +1,270 @@ +import { Reception } from './classes.reception.js'; +import { RegistrationSession } from './classes.registrationsession.js'; +import { User } from './classes.user.js'; +import * as plugins from './plugins.js'; + +export class ReceptionMailer { + public receptionRef: Reception; + + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + } + + private createBodyString = (textArg) => ` + + + + + + + +
+ +
+
+
+ +
+
+ + ${textArg} + +
+
+ +
+
+ + +`; + + public sendRegistrationEmail(signupSessionArg: RegistrationSession, validationTokenArg: string) { + this.receptionRef.szPlatformClient.emailConnector.sendEmail({ + from: 'workspace.global ', + title: 'Verify your Email Address!', + to: signupSessionArg.emailAddress, + body: this.createBodyString(` +

Email Verification for
${signupSessionArg.emailAddress}

+

It looks like you requested to register an account with us. We just want to make sure it really was you.

+

In case it was you, please continue with the registration process by clicking the button below. Otherwise, please ignore this email.

+
+ continue with registration +
+

+ What do I need a workspace.global Account for?
+ The workspace.global Account is needed to log into e.g. social.io +

+ `), + }); + } + + public sendAlreadyRegisteredEmail(userArg: User) { + this.receptionRef.szPlatformClient.emailConnector.sendEmail({ + from: 'workspace.global ', + title: 'Login Instead?!', + to: userArg.data.email, + body: this.createBodyString(` +

Email is already registered:
${userArg.data.email}

+

Someone retried to reregister with the email ${userArg.data.email}

+

In case it was you, please simply log in with your existing account. Otherwise, please ignore this email.

+
+ Simply login :) +
+

+ Forgot your password?
+ Just click the password reset link when logging in. +

+ `), + }); + } + + public sendWelcomeEMail(userArg: User) { + this.receptionRef.szPlatformClient.emailConnector.sendEmail({ + from: 'workspace.global ', + title: 'Welcome and Thank You!', + to: userArg.data.email, + body: this.createBodyString(` +

Welcome And Thank You, ${userArg.data.name}

+

You now have a fully registered workspace.global Account

+ +

+ What can I use it for?
+ The workspace.global Account can be used to log into all our apps.
+ Some of them are
+ ${(() => { + const products = ['social.io', 'layer.io']; + return products.map((productArg) => `${productArg}`).join(' '); + })()} +

+ +
+ Go to my account +
+ `), + }); + } + + public sendLoginWithEMailMail(userArg: User, validationTokenArg: string) { + this.receptionRef.szPlatformClient.emailConnector.sendEmail({ + from: 'workspace.global ', + title: 'Click to login!', + to: userArg.data.email, + body: this.createBodyString(` +

EMail Login Link for
${userArg.data.email}

+

It looks like you requested to login passwordless via this email.

+

In case it was you, please continue by clicking the button below. Otherwise, please ignore this email.

+
+ Login! +
+ `), + }); + } + + public sendPasswordResetMail(userArg: User, validationTokenArg: string) { + this.receptionRef.szPlatformClient.emailConnector.sendEmail({ + from: 'workspace.global ', + title: 'Password reset?', + to: userArg.data.email, + body: this.createBodyString(` +

Password Reset for
${ + userArg.data.email + }

+

It looks like you requested to reset your password with us.

+

In case it was you, please continue by clicking the button below. Otherwise, please ignore this email.

+
+ Reset Password +
+ `), + }); + } +} diff --git a/ts/reception/classes.receptionserver.ts b/ts/reception/classes.receptionserver.ts new file mode 100644 index 0000000..54e647d --- /dev/null +++ b/ts/reception/classes.receptionserver.ts @@ -0,0 +1,35 @@ +import * as plugins from './plugins.js'; +import { Reception } from './classes.reception.js'; + +export class ReceptionServer { + public receptionRef: Reception; + public serviceServer: plugins.loleServiceServer.ServiceServer; + public typedsocket: plugins.typedsocket.TypedSocket; + + constructor(receptionRef: Reception) { + this.receptionRef = receptionRef; + this.serviceServer = new plugins.loleServiceServer.ServiceServer({ + serviceDomain: 'reception.lossless.one', + serviceName: 'reception', + serviceVersion: this.receptionRef.projectinfoNpm.version, + port: parseInt(this.receptionRef.serviceQenv.getEnvVarOnDemand('TEST_PORT')) || 3000, + addCustomRoutes: async (serverArg) => { + serverArg.addRoute( + '/typedrequest', + new plugins.loleServiceServer.HandlerTypedRouter(this.receptionRef.typedrouter) + ); + }, + }); + } + + async start() { + await this.serviceServer.start(); + this.typedsocket = this.serviceServer.typedServer.typedsocket; + this.serviceServer.typedServer.typedrouter.addTypedRouter(this.receptionRef.typedrouter); + } + + async stop() { + await this.typedsocket.stop(); + await this.serviceServer.stop(); + } +} diff --git a/ts/reception/classes.receptionstorage.ts b/ts/reception/classes.receptionstorage.ts new file mode 100644 index 0000000..534c583 --- /dev/null +++ b/ts/reception/classes.receptionstorage.ts @@ -0,0 +1,9 @@ +import * as plugins from './plugins.js'; + +/** + * can be used to store binary data for users and organizations + */ +@plugins.smartdata.Collection(() => { + return null; +}) +export class ReceptionStorage {} diff --git a/ts/reception/classes.registrationsession.ts b/ts/reception/classes.registrationsession.ts new file mode 100644 index 0000000..67a7f20 --- /dev/null +++ b/ts/reception/classes.registrationsession.ts @@ -0,0 +1,200 @@ +import * as plugins from './plugins.js'; + +import { RegistrationSessionManager } from './classes.registrationsessionmanager.js'; +import { logger } from './logging.js'; +import { User } from './classes.user.js'; + +/** + * a RegistrationSession is a in memory session for signing up + */ +export class RegistrationSession { + // ====== + // STATIC + // ====== + public static async createRegistrationSessionForEmail( + registrationSessionManageremailArg: RegistrationSessionManager, + emailArg: string + ) { + const newRegistrationSession = new RegistrationSession( + registrationSessionManageremailArg, + emailArg + ); + const emailValidationResult = await newRegistrationSession + .validateEMailAddress() + .catch((error) => { + throw new plugins.typedrequest.TypedResponseError( + 'Error occured during email provider & dns validation' + ); + }); + if (!emailValidationResult?.valid) { + newRegistrationSession.destroy(); + throw new plugins.typedrequest.TypedResponseError( + 'Email Address is not valid. Please use a correctly formated email address' + ); + } + if (emailValidationResult.disposable) { + newRegistrationSession.destroy(); + throw new plugins.typedrequest.TypedResponseError( + 'Email is disposable. Please use a non disposable email address.' + ); + } + console.log( + `${newRegistrationSession.emailAddress} is valid. Continuing registration process!` + ); + await newRegistrationSession.sendTokenValidationEmail(); + console.log(`Successfully sent email validation email`); + return newRegistrationSession; + } + + // ======== + // INSTANCE + // ======== + public registrationSessionManagerRef: RegistrationSessionManager; + + public emailAddress: string; + + /** + * only used during testing + */ + public unhashedEmailToken?: string; + public hashedEmailToken: string; + private smsvalidationCounter = 0; + public smsCode: string; + + /** + * the status of the registration. should progress in a linear fashion. + */ + public status: 'announced' | 'emailValidated' | 'mobileVerified' | 'registered' | 'failed' = + 'announced'; + + public collectedData: { + userData: plugins.lointReception.data.IUser['data']; + } = { + userData: { + username: null, + connectedOrgs: [], + email: null, + name: null, + status: null, + mobileNumber: null, + password: null, + passwordHash: null, + }, + }; + + constructor( + registrationSessionManagerRefArg: RegistrationSessionManager, + emailAddressArg: string + ) { + this.registrationSessionManagerRef = registrationSessionManagerRefArg; + this.emailAddress = emailAddressArg; + this.registrationSessionManagerRef.registrationSessions.addToMap(this.emailAddress, this); + + // lets destroy this after 10 minutes, + // works in unrefed mode so not blocking node exiting. + plugins.smartdelay.delayFor(600000, null, true).then(() => this.destroy()); + } + + /** + * validates a token by comparing its hash against the stored hashed token + * @param tokenArg + */ + public validateEmailToken(tokenArg: string): boolean { + const result = this.hashedEmailToken === plugins.smarthash.sha256FromStringSync(tokenArg); + if (result && this.status === 'announced') { + this.status = 'emailValidated'; + this.collectedData.userData.email = this.emailAddress; + } + if (!result && this.status === 'announced') { + this.status = 'failed'; + } + return result; + } + + /** validates the sms code */ + public validateSmsCode(smsCodeArg: string) { + this.smsvalidationCounter++; + const result = this.smsCode === smsCodeArg; + if (this.status === 'emailValidated' && result) { + this.status = 'mobileVerified'; + return result; + } else { + if (this.smsvalidationCounter === 5) { + this.destroy(); + throw new plugins.typedrequest.TypedResponseError( + 'Registration cancelled due to repeated wrong verification code submission' + ); + } + return false; + } + } + + /** + * validate the email address with provider and dns sanity checks + * @returns + */ + public async validateEMailAddress(): Promise { + console.log(`validating email ${this.emailAddress}`); + const result = await new plugins.smartmail.EmailAddressValidator().validate(this.emailAddress); + return result; + } + + /** + * send the validation email + */ + public async sendTokenValidationEmail() { + const uuidToSend = plugins.smartunique.uuid4(); + this.unhashedEmailToken = uuidToSend; + this.hashedEmailToken = plugins.smarthash.sha256FromStringSync(uuidToSend); + this.registrationSessionManagerRef.receptionRef.receptionMailer.sendRegistrationEmail( + this, + uuidToSend + ); + logger.log('info', `sent a validation email with a verification code to ${this.emailAddress}`); + } + + /** + * validate the mobile number of someone + */ + public async sendValidationSms() { + if (!process.env.TEST_MODE) { + this.smsCode = + await this.registrationSessionManagerRef.receptionRef.loleSmsClientInstance.sendSmsVerifcation( + { + fromName: 'w...global', + toNumber: parseInt(this.collectedData.userData.mobileNumber), + } + ); + } else { + console.log('Not sending SMS in automated test mode'); + this.smsCode = '123456'; + } + } + + /** + * this method can be called when this registrationsession is validated + * and all data has been set + */ + public async manifestUserWithAccountData(): Promise { + if (this.status !== 'mobileVerified') { + throw new plugins.typedrequest.TypedResponseError( + 'You can only manifest user that have a validated email Address and Mobile Number' + ); + } + if (!this.collectedData) { + throw new Error('You have to set the accountdata first'); + } + const manifestedUser = + await this.registrationSessionManagerRef.receptionRef.userManager.CUser.createNewUserForUserData( + this.collectedData.userData + ); + return manifestedUser; + } + + /** + * destroys the registrationsession + */ + public destroy() { + this.registrationSessionManagerRef.registrationSessions.removeFromMap(this.emailAddress); + } +} diff --git a/ts/reception/classes.registrationsessionmanager.ts b/ts/reception/classes.registrationsessionmanager.ts new file mode 100644 index 0000000..e869c2f --- /dev/null +++ b/ts/reception/classes.registrationsessionmanager.ts @@ -0,0 +1,189 @@ +import * as plugins from './plugins.js'; +import { RegistrationSession } from './classes.registrationsession.js'; +import { Reception } from './classes.reception.js'; +import { logger } from './logging.js'; + +export class RegistrationSessionManager { + public receptionRef: Reception; + + public registrationSessions = new plugins.lik.FastMap(); + public typedRouter = new plugins.typedrequest.TypedRouter(); + + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + this.receptionRef.typedrouter.addTypedRouter(this.typedRouter); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'firstRegistrationRequest', + async (requestData) => { + // check for exiting User + const existingUser = await this.receptionRef.userManager.CUser.getInstance({ + data: { + email: requestData.email, + }, + }); + if (existingUser) { + this.receptionRef.receptionMailer.sendAlreadyRegisteredEmail(existingUser); + throw new plugins.typedrequest.TypedResponseError( + `We sent you an Email with more information.` + ); + } + // check for exiting SignupSession + const existingSession = this.registrationSessions.getByKey(requestData.email); + if (existingSession) { + logger.log('warn', `destroyed old signupSession for ${requestData.email}`); + existingSession.destroy(); + } + + // lets check the email before we create a signup session + + const newSignupSession = await RegistrationSession.createRegistrationSessionForEmail( + this, + requestData.email + ).catch((e: plugins.typedrequest.TypedResponseError) => { + console.log(e.errorText); + throw e; + }); + + if (newSignupSession) { + logger.log('info', `created signupSession for ${requestData.email}`); + return { + status: 'ok', + testOnlyToken: process.env.TEST_MODE ? newSignupSession.unhashedEmailToken : null, + }; + } else { + return { status: 'not ok' }; + } + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'afterRegistrationEmailClicked', + async (requestData) => { + const signupSession = await this.registrationSessions.find(async (itemArg) => + itemArg.validateEmailToken(requestData.token) + ); + if (signupSession) { + return { + email: signupSession.emailAddress, + status: 'ok', + }; + } else { + return { + email: null, + status: 'not ok', + }; + } + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'setDataForRegistration', + async (requestData) => { + const registrationSession = await this.registrationSessions.find(async (itemArg) => + itemArg.validateEmailToken(requestData.token) + ); + if (!registrationSession) { + throw new plugins.typedrequest.TypedResponseError( + 'could not find a matching signupsession' + ); + } + + if (requestData.userData.name) { + registrationSession.collectedData.userData.name = requestData.userData.name; + } + + if (requestData.userData.password) { + registrationSession.collectedData.userData.password = requestData.userData.password; + } + + return { + status: 'ok', + }; + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'mobileVerificationForRegistration', + async (requestData) => { + const registrationSession = await this.registrationSessions.find(async (itemArg) => + itemArg.validateEmailToken(requestData.token) + ); + if (!registrationSession) { + throw new plugins.typedrequest.TypedResponseError( + 'could not find a matching signupsession' + ); + } + + // check prerequisites + if (registrationSession.status === 'announced') { + throw new plugins.typedrequest.TypedResponseError( + 'You must validate the email address first' + ); + } + + if (requestData.mobileNumber) { + registrationSession.status = 'emailValidated'; + registrationSession.collectedData.userData.mobileNumber = requestData.mobileNumber; + await registrationSession.sendValidationSms(); + return { + messageSent: true, + testOnlySmsCode: process.env.TEST_MODE ? registrationSession.smsCode : null, + }; + } + + if (requestData.verificationCode) { + const validationResult = registrationSession.validateSmsCode( + requestData.verificationCode + ); + return { + verficationCodeOk: validationResult, + }; + } + + throw new plugins.typedrequest.TypedResponseError( + 'you misused the purpose of this TypedHandler' + ); + } + ) + ); + + this.typedRouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'finishRegistration', + async (requestData) => { + const registrationSession = await this.registrationSessions.find(async (itemArg) => + itemArg.validateEmailToken(requestData.token) + ); + if (!registrationSession) { + throw new plugins.typedrequest.TypedResponseError( + 'could not find a matching signupsession' + ); + } + + const resultingUser = await registrationSession.manifestUserWithAccountData(); + registrationSession.destroy(); + this.receptionRef.receptionMailer.sendWelcomeEMail(resultingUser); + return { + accountData: { + id: resultingUser.id, + data: { + email: resultingUser.data.email, + name: resultingUser.data.name, + username: resultingUser.data.username, + }, + }, + status: 'ok', + }; + } + ) + ); + } +} diff --git a/ts/reception/classes.role.ts b/ts/reception/classes.role.ts new file mode 100644 index 0000000..c84c262 --- /dev/null +++ b/ts/reception/classes.role.ts @@ -0,0 +1,14 @@ +import * as plugins from './plugins.js'; + +@plugins.smartdata.Manager() +export class Role extends plugins.smartdata.SmartDataDbDoc< + Role, + plugins.lointReception.data.IRole +> { + @plugins.smartdata.unI() + id: string; + + @plugins.smartdata.svDb() + data: plugins.lointReception.data.IRole['data']; + +} \ No newline at end of file diff --git a/ts/reception/classes.rolemanager.ts b/ts/reception/classes.rolemanager.ts new file mode 100644 index 0000000..1993da0 --- /dev/null +++ b/ts/reception/classes.rolemanager.ts @@ -0,0 +1,57 @@ +import { Organization } from './classes.organization.js'; +import { Reception } from './classes.reception.js'; +import { Role } from './classes.role.js'; +import { User } from './classes.user.js'; +import * as plugins from './plugins.js'; + +export class RoleManager { + // INSTANCE + public receptionRef: Reception; + public get db() { + return this.receptionRef.db.smartdataDb; + } + public CRole = plugins.smartdata.setDefaultManagerForDoc(this, Role); + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + } + + public async modifyRoleForUserAtOrg(optionsArg: { + action: 'create' | 'change' | 'delete'; + userId: string; + organizationId: string; + role: plugins.lointReception.data.IRole['data']['role']; + }) { + let returnRole: Role; + switch (optionsArg.action) { + case 'create': + returnRole = new this.CRole(); + returnRole.id = plugins.smartunique.shortId(); + returnRole.data = { + userId: optionsArg.userId, + organizationId: optionsArg.organizationId, + role: optionsArg.role, + }; + await returnRole.save(); + } + return returnRole; + } + + public async getRoleForUserAndOrg(userArg: User, orgArg: Organization) { + const role = await this.CRole.getInstance({ + data: { + userId: userArg.id, + organizationId: orgArg.id, + } + }) + return role; + } + + public async getAllRolesForUser(userArg: User) { + const roles = await this.CRole.getInstances({ + data: { + userId: userArg.id + } + }); + return roles; + } +} diff --git a/ts/reception/classes.user.ts b/ts/reception/classes.user.ts new file mode 100644 index 0000000..579765c --- /dev/null +++ b/ts/reception/classes.user.ts @@ -0,0 +1,50 @@ +import * as plugins from './plugins.js'; +import { UserManager } from './classes.usermanager.js'; + +/** + * a User is identified by its username or email. + * Both need to be unique and both can be changed. + */ +@plugins.smartdata.Manager() +export class User extends plugins.smartdata.SmartDataDbDoc< + User, + plugins.lointReception.data.IUser +> { + // STATIC + public static async createNewUserForUserData( + userDataArg: plugins.lointReception.data.IUser['data'] + ): Promise { + const newUser = new User(); + newUser.id = plugins.smartunique.shortId(); + newUser.data = { + connectedOrgs: null, + status: 'new', + name: userDataArg.name, + username: userDataArg.username, + email: userDataArg.email, + passwordHash: userDataArg.passwordHash, + }; + if (!newUser.data.passwordHash && userDataArg.password) { + newUser.data.passwordHash = await User.hashPassword(userDataArg.password); + } + await newUser.save(); + return newUser; + } + + public static hashPassword(passwordArg: string) { + return plugins.smarthash.sha256FromString(passwordArg); + } + + // INSTANCE + @plugins.smartdata.unI() + id: string; + + @plugins.smartdata.svDb() + public data: plugins.lointReception.data.IUser['data']; + + constructor() { + super(); + } + + public setLegalData() {} +} diff --git a/ts/reception/classes.usermanager.ts b/ts/reception/classes.usermanager.ts new file mode 100644 index 0000000..029ae17 --- /dev/null +++ b/ts/reception/classes.usermanager.ts @@ -0,0 +1,60 @@ +import { Reception } from './classes.reception.js'; +import { User } from './classes.user.js'; +import * as plugins from './plugins.js'; + +/** + * a user manager + */ +export class UserManager { + // refs + public receptionRef: Reception; + public typedrouter = new plugins.typedrequest.TypedRouter(); + public get db() { + return this.receptionRef.db.smartdataDb; + } + + // classes + public CUser = plugins.smartdata.setDefaultManagerForDoc(this, User); + + constructor(receptionRefArg: Reception) { + this.receptionRef = receptionRefArg; + this.receptionRef.typedrouter.addTypedRouter(this.typedrouter); + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler('getRolesAndOrganizationsForUserId', async reqArg => { + const user = await this.getUserByJwtValidation(reqArg.jwt); + const organizations = await this.receptionRef.organizationmanager.getAllOrganizationsForUser( + user + ); + const roles = await this.receptionRef.roleManager.getAllRolesForUser(user); + return { + organizations, + roles + } + }) + ) + } + + /** + * gets the user by validating a JWT + */ + public async getUserByJwt(jwtString: string) { + const jwtInstance = await this.receptionRef.jwtManager.verifyJWTAndGetData(jwtString); + const user = await this.CUser.getInstance({ + id: jwtInstance.data.userId + }); + return user; + } + + /** + * just validate jwt + * faster than the "getUserByJwt" + */ + public async getUserByJwtValidation(jwtStringArg: string) { + const jwtDataArg: plugins.lointReception.data.IJwt = await this.receptionRef.jwtManager.smartjwtInstance.verifyJWTAndGetData(jwtStringArg); + const resultingUser = await this.CUser.getInstance({ + id: jwtDataArg.data.userId + }); + return resultingUser; + } + +} diff --git a/ts/reception/index.ts b/ts/reception/index.ts new file mode 100644 index 0000000..5a11aeb --- /dev/null +++ b/ts/reception/index.ts @@ -0,0 +1,15 @@ +// general exports for testing +export * from './classes.reception.js'; + +// running it in production +import { Reception } from './classes.reception.js'; + +let reception: Reception; +export const runCli = async () => { + reception = new Reception(); + await reception.start(); +}; + +export const stop = async () => { + await reception.stop(); +}; diff --git a/ts/reception/logging.ts b/ts/reception/logging.ts new file mode 100644 index 0000000..9bfae0d --- /dev/null +++ b/ts/reception/logging.ts @@ -0,0 +1,13 @@ +import * as plugins from './plugins.js'; +import * as paths from './paths.js'; + +const projectinfoNpm = new plugins.projectinfo.ProjectinfoNpm(paths.packageDir); + +export const logger = plugins.loleLog.createLoleLogger({ + companyUnit: 'Lossless Cloud', + containerName: 'reception', + containerVersion: projectinfoNpm.version, + sentryAppName: 'reception', + sentryDsn: 'https://fd929bdcad0a41c0b7853cdea04f9c96@o169278.ingest.sentry.io/5272722', + zone: 'servezone', +}); diff --git a/ts/reception/paths.ts b/ts/reception/paths.ts new file mode 100644 index 0000000..6ff3309 --- /dev/null +++ b/ts/reception/paths.ts @@ -0,0 +1,3 @@ +import * as plugins from './plugins.js'; + +export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../'); diff --git a/ts/reception/plugins.ts b/ts/reception/plugins.ts new file mode 100644 index 0000000..6986d4e --- /dev/null +++ b/ts/reception/plugins.ts @@ -0,0 +1,57 @@ +// node native +import * as path from 'path'; + +export { path }; + +// project scope +import * as lointReception from '../../dist_ts_interfaces/index.js'; + +export { lointReception, }; + +// @apiglobal scope +import * as typedrequest from '@api.global/typedrequest'; +import * as typedsocket from '@api.global/typedsocket'; + +export { typedrequest, typedsocket }; + +// @serve.zone scope +import * as szPlatformClient from '@serve.zone/platformclient'; + +export { szPlatformClient }; + + +// @pushrocks scope +import * as lik from '@push.rocks/lik'; +import * as projectinfo from '@push.rocks/projectinfo'; +import * as qenv from '@push.rocks/qenv'; +import * as smartdata from '@push.rocks/smartdata'; +import * as smartdelay from '@push.rocks/smartdelay'; +import * as smartmail from '@push.rocks/smartmail'; +import * as smarthash from '@push.rocks/smarthash'; +import * as smartjwt from '@push.rocks/smartjwt'; +import * as smartpath from '@push.rocks/smartpath'; +import * as smartpromise from '@push.rocks/smartpromise'; +import * as smarttime from '@push.rocks/smarttime'; +import * as smartunique from '@push.rocks/smartunique'; +import * as taskbuffer from '@push.rocks/taskbuffer'; + +export { + lik, + projectinfo, + qenv, + smartdata, + smartdelay, + smartmail, + smarthash, + smartjwt, + smartpath, + smartpromise, + smarttime, + smartunique, + taskbuffer, +}; + +// @tsclass scope +import * as tsclass from '@tsclass/tsclass'; + +export { tsclass }; diff --git a/ts_idpclient/classes.idpclient.ts b/ts_idpclient/classes.idpclient.ts new file mode 100644 index 0000000..a4ce04e --- /dev/null +++ b/ts_idpclient/classes.idpclient.ts @@ -0,0 +1,362 @@ +import { IdpRequests } from './classes.idprequests.js'; +import * as plugins from './plugins.js'; + +export class IdpClient { + // INSTANCE PRIVATE + private helpers = { + async extractDataFromJwtString(jwtString: string): Promise { + return plugins.webjwt.getDataFromJwtString(jwtString); + }, + }; + + // INSTANCE PUBLIC + + public appData: plugins.lointReception.data.IApp; + public rolesReplaySubject = new plugins.smartrx.rxjs.ReplaySubject(1); + public organizationsReplaySubject = new plugins.smartrx.rxjs.ReplaySubject(1); + + public receptionTrUrl: string; + constructor(receptionBaseUrlArg: string, appDataArg?: plugins.lointReception.data.IApp) { + this.receptionTrUrl = receptionBaseUrlArg + if (this.receptionTrUrl.endsWith('/')) { + this.receptionTrUrl = this.receptionTrUrl.slice(0, -1); + } + if (!this.receptionTrUrl.endsWith('/typedrequest')) { + this.receptionTrUrl = `${this.receptionTrUrl}/typedrequest`; + } + console.log(`reception client connecting to ${this.receptionTrUrl}`); + if (!appDataArg) { + appDataArg = { + id: '', // TODO + appUrl: `https://${window.location.host}/`, + description: null, + logoUrl: null, + name: null, + }; + } + this.appData = appDataArg; + } + + public requests = new IdpRequests(this); + + /** + * app data can be transferred when redirecting to the sso domain using query params + * this message retrieves the app data when on the sso domain + */ + public async getAppDataOnSsoDomain() { + if (!window.location.href.startsWith('https://sso.workspace.global/')) { + console.error('You are trying to access SSO appData on a non sso domain.'); + return null; + } + const appDataString = plugins.smarturl.Smarturl.createFromUrl(window.location.href).searchParams + .appdata; + if (!appDataString) { + console.error('no appdata query arg detected'); + return null; + } + const appData = plugins.smartjson.parseBase64(appDataString); + return appData; + } + + public async setJwt(jwtStringArg: string) { + await this.storeJwt(jwtStringArg); + } + + /** + * a typedsocket for going reactive + */ + public typedsocket: plugins.typedsocket.TypedSocket; + + /** + * a typed router to go reactive + */ + public typedrouter = new plugins.typedrequest.TypedRouter(); + + public statusObservable = + new plugins.smartrx.rxjs.Subject(); + + public ssoStore = new plugins.webstore.WebStore({ + storeName: 'wgsso', + dbName: 'wgsso', + }); + + public async storeJwt(jwtString: string) { + await this.ssoStore.set('wgJwt', jwtString); + } + + public async getJwt(): Promise { + return await this.ssoStore.get('wgJwt'); + } + public async getJwtData(): Promise { + return this.helpers.extractDataFromJwtString(await this.getJwt()); + } + + public async deleteJwt() { + await this.ssoStore.delete('wgJwt'); + console.log('removed jwt'); + } + + /** + * performs jwt housekeeping + * only call if jwt is present + * @returns + */ + public async performJwtHousekeeping() { + let jwt = await this.getJwt(); + if (!jwt) { + return null; + } + const extractedJwt = await this.helpers.extractDataFromJwtString(jwt); + if (extractedJwt.data.refreshFrom < Date.now() && Date.now() < extractedJwt.data.validUntil) { + jwt = await this.refreshJwt(); + } else if (Date.now() > extractedJwt.data.validUntil) { + this.deleteJwt(); + } + return jwt; + } + + public async refreshJwt(refreshTokenArg?: string): Promise { + let extractedJwt: plugins.lointReception.data.IJwt; + + if (!refreshTokenArg) { + extractedJwt = await this.helpers.extractDataFromJwtString(await this.getJwt()); + } + const refreshJwtReq = + new plugins.typedrequest.TypedRequest( + `${this.receptionTrUrl}/typedrequest`, + 'refreshJwt' + ); + const response = await refreshJwtReq.fire({ + refreshToken: refreshTokenArg || extractedJwt.data.refreshToken, + }); + if (response.jwt) { + await this.storeJwt(response.jwt); + } else { + await this.deleteJwt(); + } + this.statusObservable.next(response.status); + return await this.getJwt(); + } + + /** + * can be used to switch between pages + */ + public async getTransferToken(appDataArg?: plugins.lointReception.data.IApp): Promise { + const jwt = await this.performJwtHousekeeping(); + const extractedJwt = await this.helpers.extractDataFromJwtString(jwt); + const getTransferToken = + new plugins.typedrequest.TypedRequest( + `${this.receptionTrUrl}/typedrequest`, + 'exchangeRefreshTokenAndTransferToken' + ); + const response = await getTransferToken.fire({ + refreshToken: extractedJwt.data.refreshToken, + appData: appDataArg || this.appData, + }); + return response.transferToken; + } + + /** + * gets a transfer token and switches to a location + */ + public async getTransferTokenAndSwitchToLocation(newLocationArg: string): Promise { + const transferToken = await this.getTransferToken(); + if (!transferToken) { + alert('failed to get transfer token!'); + } + const urlInstance = plugins.smarturl.Smarturl.createFromUrl(newLocationArg, { + searchParams: { + transfertoken: transferToken, + }, + }); + const transferUrl = urlInstance.toString(); + window.location.href = transferUrl; + return; + } + + /** + * processes a transfer token + */ + public async processTransferToken(): Promise { + const href = window.location.href; + const url = plugins.smarturl.Smarturl.createFromUrl(href); + const transferToken = url.searchParams['transfertoken']; + if (transferToken) { + const getTransferToken = + new plugins.typedrequest.TypedRequest( + `${this.receptionTrUrl}/typedrequest`, + 'exchangeRefreshTokenAndTransferToken' + ); + const response = await getTransferToken.fire({ + transferToken, + appData: this.appData, + }); + if (response.refreshToken) { + await this.refreshJwt(response.refreshToken); + } else { + globalThis.alert?.('transfer token invalid'); + return false; + } + return true; + } else { + return false; + } + } + + // Login Status stuff + public async checkJwtPresent() { + const jwt = await this.performJwtHousekeeping(); + if (jwt) { + return true; + } else { + return false; + } + } + + /** + * forces the current user to login + * @param requireLoginArg + * @returns + */ + public async determineLoginStatus(requireLoginArg: boolean = false): Promise { + const jwtPresent = await this.checkJwtPresent(); + if (jwtPresent) { + const jwt = await this.performJwtHousekeeping(); + return !!jwt; + } else { + const transferTokenResult = await this.processTransferToken(); + if (transferTokenResult) { + // we are in the clear + return true; + } else { + if (requireLoginArg) { + const urlInstance = plugins.smarturl.Smarturl.createFromUrl( + 'https://sso.workspace.global/', + { + searchParams: { + appdata: plugins.smartjson.stringifyBase64(this.appData), + action: 'login', + }, + } + ); + if (!globalThis.location.href.startsWith('https://sso.workspace.global/')) { + globalThis.location.href = urlInstance.toString(); + } + } + return false; + } + } + } + + /** + * logs out the current user + */ + public async logout() { + const urlInstance = plugins.smarturl.Smarturl.createFromUrl('https://sso.workspace.global/', { + searchParams: { + appdata: plugins.smartjson.stringifyBase64(this.appData), + action: 'logout', + }, + }); + if (!globalThis.location.href.startsWith('https://sso.workspace.global/')) { + // we are somewhere in an app + await this.deleteJwt(); + globalThis.location.href = urlInstance.toString(); + } else { + // we are in the sso page + await this.enableTypedSocket(); + console.log(`logging out against ${this.receptionTrUrl}`) + const logoutTr = + this.typedsocket.createTypedRequest( + 'logout' + ); + await logoutTr.fire({ + refreshToken: (await this.getJwtData()).data.refreshToken, + }); + await this.deleteJwt(); + const appData = await this.getAppDataOnSsoDomain(); + if (appData) { + console.log(`redirecting to app after logout: ${appData.appUrl}`); + window.location.href = appData.appUrl; + } else { + console.error('no appData provided. Not redirecting after logout.'); + } + } + } + + public typedsocketDeferred = plugins.smartpromise.defer(); + public async enableTypedSocket() { + if (this.typedsocketDeferred.claimed) { + return this.typedsocketDeferred.promise; + } + this.typedsocketDeferred.claim(); + this.typedsocket = await plugins.typedsocket.TypedSocket.createClient( + this.typedrouter, + `${this.receptionTrUrl}/` + ); + this.typedsocketDeferred.resolve(this.typedsocket); + return this.typedsocketDeferred.promise; + } + + public async stop() { + await this.typedsocket?.stop(); + } + + // ================================== + // Organization and Settings stuff + // ================================== + public async createOrganization( + orgNameArg: string, + orgSlugArg: string, + modeArg: 'checkAvailability' | 'manifest' + ) { + await this.typedsocketDeferred.promise; + const validateOrg = + this.typedsocket.createTypedRequest( + 'createOrganization' + ); + const response = await validateOrg.fire({ + jwt: await this.getJwt(), + action: modeArg, + organizationName: orgNameArg, + organizationSlug: orgSlugArg, + userId: (await this.getJwtData()).id, + }); + return response; + } + + /** + * gets the current OrganizationRoles + */ + public async getRolesAndOrganizations() { + await this.typedsocketDeferred.promise; + const rolesAndOrganizationsForUserId = + this.typedsocket.createTypedRequest( + 'getRolesAndOrganizationsForUserId' + ); + const response = await rolesAndOrganizationsForUserId.fire({ + jwt: await this.getJwt(), + userId: (await this.getJwtData()).id, + }); + return response; + } + + /** + * updates the PaddleCheckoutId for an organization. + */ + public async updatePaddleCheckoutId(orgIdArg: string, checkoutIdArg: string) { + await this.typedsocketDeferred.promise; + const updateBillingPlan = + this.typedsocket.createTypedRequest( + 'updatePaymentMethod' + ); + const response = await updateBillingPlan.fire({ + jwtString: await this.getJwt(), + orgId: orgIdArg, + paddle: { + checkoutId: checkoutIdArg, + }, + }); + return response; + } +} diff --git a/ts_idpclient/classes.idprequests.ts b/ts_idpclient/classes.idprequests.ts new file mode 100644 index 0000000..f544583 --- /dev/null +++ b/ts_idpclient/classes.idprequests.ts @@ -0,0 +1,62 @@ +import * as plugins from './plugins.js'; +import type { IdpClient } from "./classes.idpclient.js"; + +/** + * this class bundles all the typed requests that are used by the idp + */ +export class IdpRequests { + idpClientArg: IdpClient; + constructor(idpClientArg: IdpClient) { + this.idpClientArg = idpClientArg; + } + + public get afterRegistrationEmailClicked () { + return new plugins.typedrequest.TypedRequest( + this.idpClientArg.receptionTrUrl, + 'afterRegistrationEmailClicked' + ); + } + + public get setData() { + return new plugins.typedrequest.TypedRequest( + this.idpClientArg.receptionTrUrl, + 'setDataForRegistration' + ); + } + + public get mobileNumberVerification () { + return new plugins.typedrequest.TypedRequest( + this.idpClientArg.receptionTrUrl, + 'mobileVerificationForRegistration' + ); + } + + + public get finishRegistration() { + return new plugins.typedrequest.TypedRequest( + this.idpClientArg.receptionTrUrl, + 'finishRegistration' + ); + } + + public get loginWithUserNameAndPassword () { + return new plugins.typedrequest.TypedRequest( + this.idpClientArg.receptionTrUrl, + 'loginWithEmailOrUsernameAndPassword' + ); + } + + public get obtainJwt () { + return new plugins.typedrequest.TypedRequest( + this.idpClientArg.receptionTrUrl, + 'refreshJwt' + ); + } + + public get obtainOneTimeToken () { + return new plugins.typedrequest.TypedRequest( + this.idpClientArg.receptionTrUrl, + 'exchangeRefreshTokenAndTransferToken' + ); + } +} \ No newline at end of file diff --git a/ts_idpclient/index.ts b/ts_idpclient/index.ts new file mode 100644 index 0000000..6185668 --- /dev/null +++ b/ts_idpclient/index.ts @@ -0,0 +1 @@ +export * from './classes.idpclient.js'; diff --git a/ts_idpclient/plugins.ts b/ts_idpclient/plugins.ts new file mode 100644 index 0000000..eabc0e8 --- /dev/null +++ b/ts_idpclient/plugins.ts @@ -0,0 +1,26 @@ +// losslessone_private scope +import * as lointReception from '../dist_ts_interfaces/index.js'; + +export { lointReception }; + +// apiglobal scope +import * as typedrequest from '@api.global/typedrequest'; +import * as typedsocket from '@api.global/typedsocket'; + +export { typedrequest, typedsocket }; + +// pushrocks scope +import * as smartjson from '@push.rocks/smartjson'; +import * as smartpromise from '@push.rocks/smartpromise'; +import * as smartrx from '@push.rocks/smartrx'; +import * as smarttime from '@push.rocks/smarttime'; +import * as smarturl from '@push.rocks/smarturl'; +import * as webjwt from '@push.rocks/webjwt'; +import * as webstore from '@push.rocks/webstore'; + +export { smartjson, smartpromise, smartrx, smarttime, smarturl, webjwt, webstore }; + +// @tsclass scope +import * as tsclass from '@tsclass/tsclass'; + +export { tsclass }; diff --git a/ts_interfaces/00_commitinfo_data.ts b/ts_interfaces/00_commitinfo_data.ts new file mode 100644 index 0000000..dbdda08 --- /dev/null +++ b/ts_interfaces/00_commitinfo_data.ts @@ -0,0 +1,8 @@ +/** + * autocreated commitinfo by @push.rocks/commitinfo + */ +export const commitinfo = { + name: '@losslessone_private/loint-reception', + version: '1.0.122', + description: 'an interface package for the reception service at Lossless' +} diff --git a/ts_interfaces/data/index.ts b/ts_interfaces/data/index.ts new file mode 100644 index 0000000..051bd20 --- /dev/null +++ b/ts_interfaces/data/index.ts @@ -0,0 +1,9 @@ +export * from './loint-reception.app.js'; +export * from './loint-reception.billingplan.js'; +export * from './loint-reception.device.js'; +export * from './loint-reception.jwt.js'; +export * from './loint-reception.loginsession.js'; +export * from './loint-reception.organization.js'; +export * from './loint-reception.paddlecheckoutdata.js'; +export * from './loint-reception.role.js'; +export * from './loint-reception.user.js'; diff --git a/ts_interfaces/data/loint-reception.app.ts b/ts_interfaces/data/loint-reception.app.ts new file mode 100644 index 0000000..d439d86 --- /dev/null +++ b/ts_interfaces/data/loint-reception.app.ts @@ -0,0 +1,13 @@ +export interface IApp { + /** + * must be unique + */ + id: string; + /** + * should be unique + */ + name: string; + description: string; + logoUrl: string; + appUrl: string; +} diff --git a/ts_interfaces/data/loint-reception.billingplan.ts b/ts_interfaces/data/loint-reception.billingplan.ts new file mode 100644 index 0000000..56b3e04 --- /dev/null +++ b/ts_interfaces/data/loint-reception.billingplan.ts @@ -0,0 +1,47 @@ +import * as plugins from '../loint-reception.plugins.js'; + +export type TSupportedCurrency = 'EUR'; + +export interface IBillableItem { + name: string; + monthlyPrice: number; + currency: TSupportedCurrency; + from: number; + to: number; + factoredOn30DayMonth: number; + quantity: number; +} + +export interface IBillingPlan { + id: string; + data: { + type: 'Paddle' | 'AppSumo' | 'FairUsageFree' | 'Enterprise' | 'Internal' | 'Testing'; + proEnabled: boolean; + organizationId: string; + lastProcessed: number; + seats: number; + status: 'active' | 'activeOverdue' | 'pausedOverdue' | 'inactive' | 'suspended'; + paddleData?: { + checkoutId: string; + }; + alternativePaymentData?: { + enterprise: boolean; + appSumoCode: string; + }; + nextBilling: { + items: Array; + method: 'paddle'; + ontrack: boolean; + errorText?: string; + selectedBillingDate: number; + }; + billingEvents: Array<{ + timestamp: number; + amount: number; + currency: TSupportedCurrency; + billedItems: Array; + checkoutLink?: string; + }>; + communications: Array; + }; +} diff --git a/ts_interfaces/data/loint-reception.device.ts b/ts_interfaces/data/loint-reception.device.ts new file mode 100644 index 0000000..c23b5a5 --- /dev/null +++ b/ts_interfaces/data/loint-reception.device.ts @@ -0,0 +1,3 @@ +import * as plugins from '../loint-reception.plugins.js'; + +export interface IDevice extends plugins.tsclass.network.IDevice {} diff --git a/ts_interfaces/data/loint-reception.jwt.ts b/ts_interfaces/data/loint-reception.jwt.ts new file mode 100644 index 0000000..cffce50 --- /dev/null +++ b/ts_interfaces/data/loint-reception.jwt.ts @@ -0,0 +1,38 @@ +export type TLoginStatus = 'loggedIn' | 'loggedOut' | 'invalidated' | 'not found' | 'transfer'; +export type TLoginAction = 'login' | 'logout' | 'manage'; + +export interface IJwt { + id: string; + blocked: boolean; + data: { + /** + * the user id of the jwt + */ + userId: string; + + /** + * the latest point of + */ + validUntil: number; + /** + * hold off from refreshing before + */ + refreshFrom: number; + /** + * an interval in millis to recheck token invalidation + */ + refreshEvery: number; + + /** + * the refresh token to obtain a new jwt for a session + */ + refreshToken: string; + + /** + * just for looks/debugging + */ + justForLooks: { + validUntilIsoString: string; + }; + }; +} diff --git a/ts_interfaces/data/loint-reception.loginsession.ts b/ts_interfaces/data/loint-reception.loginsession.ts new file mode 100644 index 0000000..12029a0 --- /dev/null +++ b/ts_interfaces/data/loint-reception.loginsession.ts @@ -0,0 +1,14 @@ +export interface ILoginSession { + id: string; + data: { + userId: string; + validUntil: number; + invalidated: boolean; + refreshToken: string; + /** + * a device id that can be used to share the login session + * in different contexts on the same device + */ + deviceId: string; + }; +} diff --git a/ts_interfaces/data/loint-reception.organization.ts b/ts_interfaces/data/loint-reception.organization.ts new file mode 100644 index 0000000..6fb65e8 --- /dev/null +++ b/ts_interfaces/data/loint-reception.organization.ts @@ -0,0 +1,13 @@ +import * as plugins from '../loint-reception.plugins.js'; +import { type IBillingPlan } from './loint-reception.billingplan.js'; +import { type IRole } from './loint-reception.role.js'; + +export interface IOrganization { + id: string; + data: { + name: string; + slug: string; + billingPlanId: string; + roleIds: string[]; + }; +} diff --git a/ts_interfaces/data/loint-reception.paddlecheckoutdata.ts b/ts_interfaces/data/loint-reception.paddlecheckoutdata.ts new file mode 100644 index 0000000..0388e38 --- /dev/null +++ b/ts_interfaces/data/loint-reception.paddlecheckoutdata.ts @@ -0,0 +1,316 @@ +export interface IPaddleCheckoutData { + checkout: { + created_at: string; + completed: boolean; + id: string; + coupon: { + coupon_code?: string; + }; + passthrough?: TPassthrough; + prices: { + customer: { + currency: string; + unit: string; + unit_tax: string; + total: string; + total_tax: string; + items: Array<{ + checkout_product_id: number; + product_id: number; + name: string; + custom_message: string; + quantity: number; + allow_quantity: false; + icon_url: string; + min_quantity: number; + max_quantity: number; + currency: string; + unit_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + line_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + discounts: []; + /** + * factorised, not percentage, so looks like 0.19 for Germany. + */ + tax_rate: number; + recurring: { + period: string; + interval: number; + trial_days: number; + currency: string; + unit_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + line_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + discounts: []; + tax_rate: number; + }; + }>; + }; + vendor: { + currency: string; + unit: string; + unit_tax: string; + total: string; + total_tax: string; + items: [ + { + checkout_product_id: number; + product_id: number; + name: string; + custom_message: string; + quantity: number; + allow_quantity: false; + icon_url: string; + min_quantity: number; + max_quantity: number; + currency: string; + unit_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + line_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + discounts: []; + tax_rate: number; + recurring: { + period: string; + interval: number; + trial_days: number; + currency: string; + unit_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + line_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + discounts: []; + tax_rate: number; + }; + } + ]; + }; + }; + redirect_url: null; + test_variant: 'newCheckout'; + recurring_prices: { + customer: { + currency: string; + unit: string; + unit_tax: string; + total: string; + total_tax: string; + items: [ + { + checkout_product_id: number; + product_id: number; + name: string; + custom_message: string; + quantity: number; + allow_quantity: false; + icon_url: string; + min_quantity: number; + max_quantity: number; + currency: string; + unit_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + line_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + discounts: []; + tax_rate: number; + recurring: { + period: string; + interval: number; + trial_days: number; + currency: string; + unit_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + line_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + discounts: []; + tax_rate: number; + }; + } + ]; + }; + interval: { + length: number; + type: string; + }; + vendor: { + currency: string; + unit: string; + unit_tax: string; + total: string; + total_tax: string; + items: [ + { + checkout_product_id: number; + product_id: number; + name: string; + custom_message: string; + quantity: number; + allow_quantity: false; + icon_url: string; + min_quantity: number; + max_quantity: number; + currency: string; + unit_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + line_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + discounts: []; + tax_rate: number; + recurring: { + period: string; + interval: number; + trial_days: number; + currency: string; + unit_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + line_price: { + net: number; + gross: number; + net_discount: number; + gross_discount: number; + net_after_discount: number; + gross_after_discount: number; + tax: number; + tax_after_discount: number; + }; + discounts: []; + tax_rate: number; + }; + } + ]; + }; + }; + }; + product: { + quantity: number; + id: number; + name: string; + }; + user: { + id: string; + email: string; + country: string; + }; +} diff --git a/ts_interfaces/data/loint-reception.property.ts b/ts_interfaces/data/loint-reception.property.ts new file mode 100644 index 0000000..106fbdd --- /dev/null +++ b/ts_interfaces/data/loint-reception.property.ts @@ -0,0 +1,12 @@ +import * as plugins from '../loint-reception.plugins.js'; +import { type IRole } from './loint-reception.role.js'; + +export interface ISubOrgProperty { + name: string; + domain: string; + roles: IRole[]; + /** + * contains the ids of all the apps that show the property + */ + attributedAppIds: string[]; +} diff --git a/ts_interfaces/data/loint-reception.role.ts b/ts_interfaces/data/loint-reception.role.ts new file mode 100644 index 0000000..a422ea9 --- /dev/null +++ b/ts_interfaces/data/loint-reception.role.ts @@ -0,0 +1,13 @@ +import * as plugins from '../loint-reception.plugins.js'; + +/** + * a role describes a + */ +export interface IRole { + id: string; + data: { + userId: string; + organizationId: string; + role: 'owner' | 'admin' | 'editor' | 'guest' | 'viewer' | 'outlaw'; + }; +} diff --git a/ts_interfaces/data/loint-reception.user.ts b/ts_interfaces/data/loint-reception.user.ts new file mode 100644 index 0000000..80339e3 --- /dev/null +++ b/ts_interfaces/data/loint-reception.user.ts @@ -0,0 +1,30 @@ +import * as plugins from '../loint-reception.plugins.js'; +import { type IRole } from './loint-reception.role.js'; + +export interface IUser { + id: string; + data: { + name: string; + username: string; + email: string; + + /** + * mobile number used for verification + */ + mobileNumber?: string; + /** + * only used during initial password setting + */ + password?: string; + /** + * used for validation of passwords + */ + passwordHash?: string; + status: 'new' | 'active' | 'deleted' | 'suspended'; + /** + * a quick ref for which organizations might have roles for this user + * speeds up lookup + */ + connectedOrgs: string[]; + }; +} diff --git a/ts_interfaces/index.ts b/ts_interfaces/index.ts new file mode 100644 index 0000000..3313690 --- /dev/null +++ b/ts_interfaces/index.ts @@ -0,0 +1,6 @@ +// requests +import * as request from './request/index.js'; +import * as data from './data/index.js'; +import * as tags from './tags/index.js'; + +export { request, data, tags }; diff --git a/ts_interfaces/loint-reception.plugins.ts b/ts_interfaces/loint-reception.plugins.ts new file mode 100644 index 0000000..928ee90 --- /dev/null +++ b/ts_interfaces/loint-reception.plugins.ts @@ -0,0 +1,9 @@ +// @apiglobal scope +import * as typedRequestInterfaces from '@api.global/typedrequest-interfaces'; + +export { typedRequestInterfaces }; + +// @tsclass scope +import * as tsclass from '@tsclass/tsclass'; + +export { tsclass }; diff --git a/ts_interfaces/request/index.ts b/ts_interfaces/request/index.ts new file mode 100644 index 0000000..a9cbe78 --- /dev/null +++ b/ts_interfaces/request/index.ts @@ -0,0 +1,9 @@ +export * from './loint-reception.apitoken.js'; +export * from './loint-reception.authorization.js'; +export * from './loint-reception.billingplan.js'; +export * from './loint-reception.jwt.js'; +export * from './loint-reception.login.js'; +export * from './loint-reception.organization.js'; +export * from './loint-reception.plan.js'; +export * from './loint-reception.registration.js'; +export * from './loint-reception.user.js'; diff --git a/ts_interfaces/request/loint-reception.apitoken.ts b/ts_interfaces/request/loint-reception.apitoken.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/ts_interfaces/request/loint-reception.apitoken.ts @@ -0,0 +1 @@ +export {}; diff --git a/ts_interfaces/request/loint-reception.authorization.ts b/ts_interfaces/request/loint-reception.authorization.ts new file mode 100644 index 0000000..e566ca1 --- /dev/null +++ b/ts_interfaces/request/loint-reception.authorization.ts @@ -0,0 +1,19 @@ +import * as plugins from '../loint-reception.plugins.js'; +import { type IUser, type IRole } from '../data/index.js'; + +export interface IReq_InternalAuthorization + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_InternalAuthorization + > { + method: ''; + request: { + accountData: IUser; + jwt: string; + }; + response: { + accountData: IUser; + jwt: string; + relevantRoles: IRole[]; + }; +} diff --git a/ts_interfaces/request/loint-reception.billingplan.ts b/ts_interfaces/request/loint-reception.billingplan.ts new file mode 100644 index 0000000..bf8d55d --- /dev/null +++ b/ts_interfaces/request/loint-reception.billingplan.ts @@ -0,0 +1,39 @@ +import * as plugins from '../loint-reception.plugins.js'; +import * as data from '../data/index.js'; + +export interface IReq_UpdatePaymentMethod + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_UpdatePaymentMethod + > { + method: 'updatePaymentMethod'; + request: { + jwtString: string; + orgId: string; + paddle?: { + checkoutId: string; + }; + }; + response: { + billingPlan: plugins.tsclass.typeFest.PartialDeep; + }; +} + +/** + * allows getting the billing plan for a user + */ +export interface IReq_GetBillingPlan + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_GetBillingPlan + > { + method: 'getBillingPlan'; + request: { + jwtString: string; + orgId: string; + billingPlanId: string; + }; + response: { + billingPlan: data.IBillingPlan; + }; +} diff --git a/ts_interfaces/request/loint-reception.jwt.ts b/ts_interfaces/request/loint-reception.jwt.ts new file mode 100644 index 0000000..ba5aeee --- /dev/null +++ b/ts_interfaces/request/loint-reception.jwt.ts @@ -0,0 +1,45 @@ +import * as data from '../data/index.js'; +import * as plugins from '../loint-reception.plugins.js'; + +export interface IReq_GetPublicKeyForValidation + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_GetPublicKeyForValidation + > { + method: 'getPublicKeyForValidation'; + request: { + backendToken: string; + }; + response: { + publicKeyPem: string; + }; +} + +export interface IReq_PushPublicKeyForValidation + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_PushPublicKeyForValidation + > { + method: 'pushPublicKeyForValidation'; + request: { + publicKeyPem: string; + }; + response: {}; +} + +/** + * allows getting or pushing a blocklist of jwt ids + */ +export interface IReq_PushOrGetJwtIdBlocklist + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_PushOrGetJwtIdBlocklist + > { + method: 'pushOrGetJwtIdBlocklist'; + request: { + blockedJwtIds?: string[]; + }; + response: { + blockedJwtIds?: string[]; + }; +} diff --git a/ts_interfaces/request/loint-reception.login.ts b/ts_interfaces/request/loint-reception.login.ts new file mode 100644 index 0000000..7d52f3c --- /dev/null +++ b/ts_interfaces/request/loint-reception.login.ts @@ -0,0 +1,180 @@ +import * as plugins from '../loint-reception.plugins.js'; +import * as data from '../data/index.js'; + +export interface IReq_LoginWithEmailOrUsernameAndPassword + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_LoginWithEmailOrUsernameAndPassword + > { + method: 'loginWithEmailOrUsernameAndPassword'; + request: { + username: string; + password: string; + }; + response: { + refreshToken?: string; + twoFaNeeded: boolean; + }; +} + +export interface IReq_LoginWithEmail + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_LoginWithEmailOrUsernameAndPassword + > { + method: 'loginWithEmail'; + request: { + email: string; + }; + response: { + status: 'ok' | 'not ok'; + testOnlyToken?: string; + }; +} + +export interface IReq_LoginWithEmailAfterEmailTokenAquired + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_LoginWithEmailOrUsernameAndPassword + > { + method: 'loginWithEmailAfterEmailTokenAquired'; + request: { + email: string; + token: string; + }; + response: { + refreshToken: string; + }; +} + +/** + * in case you authenticate with a long lived api token + */ +export interface IReq_LoginWithApiToken + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_LoginWithApiToken + > { + method: 'loginWithApiToken'; + request: { + apiToken: string; + }; + response: { + jwt?: string; + }; +} + +export interface ILogoutRequest + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + ILogoutRequest + > { + method: 'logout'; + request: { + refreshToken: string; + }; + response: {}; +} + +export interface IReq_RefreshJwt + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_RefreshJwt + > { + method: 'refreshJwt'; + request: { + refreshToken: string; + }; + response: { + status: data.TLoginStatus; + jwt: string; + }; +} + +/** + * allows the exchange between refreshToken and transferTokens + */ +export interface IReq_ExchangeRefreshTokenAndTransferToken + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_ExchangeRefreshTokenAndTransferToken + > { + method: 'exchangeRefreshTokenAndTransferToken'; + request: { + transferToken?: string; + refreshToken?: string; + appData: data.IApp; + }; + response: { + refreshToken?: string; + transferToken?: string; + }; +} + +/** + * in case you authenticate with a long lived api token + */ +export interface IReq_ResetPassword + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_ResetPassword + > { + method: 'resetPassword'; + request: { + email: string; + }; + response: { + status: 'ok' | 'not ok'; + }; +} + +/** + * in cse you authenticate with a long lived api token + */ +export interface IReq_SetNewPassword + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_SetNewPassword + > { + method: 'setNewPassword'; + request: { + email: string; + oldPassword?: string; + tokenArg?: string; + newPassword: string; + }; + response: { + status: 'ok' | 'not ok'; + }; +} + +export interface IReq_ObtainDeviceId + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_ObtainDeviceId + > { + method: 'obtainDeviceId'; + request: {}; + response: { + deviceId: data.IDevice; + }; +} + +/** + * allows attaching a device id to a login session + * to share a login session across contexts + */ +export interface IReq_AttachDeviceId + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_AttachDeviceId + > { + method: 'attachDeviceId'; + request: { + jwt: string; + deviceId: string; + }; + response: { + ok: boolean; + }; +} diff --git a/ts_interfaces/request/loint-reception.organization.ts b/ts_interfaces/request/loint-reception.organization.ts new file mode 100644 index 0000000..65737fc --- /dev/null +++ b/ts_interfaces/request/loint-reception.organization.ts @@ -0,0 +1,51 @@ +import * as data from '../data/index.js'; +import * as plugins from '../loint-reception.plugins.js'; + +export interface IReq_GetOrganizationById + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_GetOrganizationById + > { + method: 'getOrganizationById'; + request: { + jwt: string; + id: string; + }; + response: { + organization: data.IOrganization; + }; +} + +export interface IReq_CreateOrganization + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_CreateOrganization + > { + method: 'createOrganization'; + request: { + jwt: string; + userId: string; + organizationName: string; + organizationSlug: string; + action: 'checkAvailability' | 'manifest'; + }; + response: { + nameAvailable: boolean; + resultingOrganization?: data.IOrganization; + role?: data.IRole; + }; +} + +export interface IReq_UpdateOrganization + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_UpdateOrganization + > { + method: 'updateOrganization'; + request: { + organization: data.IOrganization; + }; + response: { + organization: data.IOrganization; + }; +} diff --git a/ts_interfaces/request/loint-reception.plan.ts b/ts_interfaces/request/loint-reception.plan.ts new file mode 100644 index 0000000..a8da97b --- /dev/null +++ b/ts_interfaces/request/loint-reception.plan.ts @@ -0,0 +1,17 @@ +import * as data from '../data/index.js'; +import * as plugins from '../loint-reception.plugins.js'; + +export interface IReq_GetPlansForOrganizationId + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_GetPlansForOrganizationId + > { + method: 'getBillingPlansForOrganizationId'; + request: { + jwt: string; + organizationId: string; + }; + response: { + billingPlans: data.IBillingPlan[]; + }; +} diff --git a/ts_interfaces/request/loint-reception.registration.ts b/ts_interfaces/request/loint-reception.registration.ts new file mode 100644 index 0000000..fb17c03 --- /dev/null +++ b/ts_interfaces/request/loint-reception.registration.ts @@ -0,0 +1,90 @@ +import * as plugins from '../loint-reception.plugins.js'; +import { type IUser } from '../data/index.js'; + +export interface IReq_FirstRegistration + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_FirstRegistration + > { + method: 'firstRegistrationRequest'; + request: { + email: string; + productSlugOfInterest: string; + }; + response: { + status: 'ok' | 'not ok'; + testOnlyToken?: string; + }; +} + +export interface IReq_AfterRegistrationEmailClicked + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_AfterRegistrationEmailClicked + > { + method: 'afterRegistrationEmailClicked'; + request: { + /** + * the token that has been sent with the registation email to verify access + */ + token: string; + }; + response: { + status: 'ok' | 'not ok'; + /** + * the email thats associated with the given request token + */ + email: string; + }; +} + +export interface IReq_SetDataForRegistration + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_SetDataForRegistration + > { + method: 'setDataForRegistration'; + request: { + token: string; + userData: IUser['data']; + }; + response: { + status: 'ok' | 'not ok'; + }; +} + +/** + * Should be used to verify a mobile number for an verifcation + */ +export interface IReq_MobileVerificationForRegistration + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_MobileVerificationForRegistration + > { + method: 'mobileVerificationForRegistration'; + request: { + token: string; + mobileNumber?: string; + verificationCode?: string; + }; + response: { + messageSent?: boolean; + verficationCodeOk?: boolean; + testOnlySmsCode?: string; + }; +} + +export interface IReq_FinishRegistration + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_FinishRegistration + > { + method: 'finishRegistration'; + request: { + token: string; + }; + response: { + status: 'ok' | 'not ok'; + userData?: IUser['data']; + }; +} diff --git a/ts_interfaces/request/loint-reception.user.ts b/ts_interfaces/request/loint-reception.user.ts new file mode 100644 index 0000000..eb49fea --- /dev/null +++ b/ts_interfaces/request/loint-reception.user.ts @@ -0,0 +1,76 @@ +import * as data from '../data/index.js'; +import * as plugins from '../loint-reception.plugins.js'; + +export interface IReq_GetUserData + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_GetUserData + > { + method: 'getUserData'; + request: { + refreshToken: string; + }; + response: { + jwt: string; + }; +} + +export interface IReq_SetUserData + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_SetUserData + > { + method: 'setUserData'; + request: { + refreshToken: string; + }; + response: { + oneTimeTransferCode: string; + }; +} + +export interface IReq_SuspendUser + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_SuspendUser + > { + method: 'suspendUser'; + request: { + jwt: string; + userId: string; + }; + response: { + publicKeyPem: string; + }; +} + +export interface IDeleteSuspendedUser + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IDeleteSuspendedUser + > { + method: 'deleteSuspendedUser'; + request: { + backendToken: string; + }; + response: { + ok: boolean; + errorText?: string; + }; +} + +export interface IReq_GetRolesAndOrganizationsForUserId + extends plugins.typedRequestInterfaces.implementsTR< + plugins.typedRequestInterfaces.ITypedRequest, + IReq_GetRolesAndOrganizationsForUserId + > { + method: 'getRolesAndOrganizationsForUserId'; + request: { + jwt: string; + userId: string; + }; + response: { + roles: data.IRole[]; + organizations: data.IOrganization[]; + }; +} diff --git a/ts_interfaces/tags/index.ts b/ts_interfaces/tags/index.ts new file mode 100644 index 0000000..4e8f114 --- /dev/null +++ b/ts_interfaces/tags/index.ts @@ -0,0 +1,12 @@ +import * as plugins from '../loint-reception.plugins.js'; + +export interface ITag_LolePubapi + extends plugins.typedRequestInterfaces.implementsTag< + plugins.typedRequestInterfaces.ITag, + ITag_LolePubapi + > { + name: 'lole-reception'; + payload: { + backendToken: string; + }; +} diff --git a/ts_web/elements/classes.idp-registration-stepper.ts b/ts_web/elements/classes.idp-registration-stepper.ts new file mode 100644 index 0000000..173f02b --- /dev/null +++ b/ts_web/elements/classes.idp-registration-stepper.ts @@ -0,0 +1,296 @@ +import { IdpState } from '../idp.state.js'; +import * as plugins from '../plugins.js'; +import { + customElement, + DeesElement, + property, + state, + html, + cssManager, + unsafeCSS, + css, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('idp-registration-stepper') +export class IdpRegistrationStepper extends DeesElement { + public idpState = IdpState.getSingletonInstance(); + + @state() + private usedSubTemplate: TemplateResult; + + @state() + private storedData = { + validationTokenUrlParam: 'string', + email: '', + refreshToken: '', + jwt: '', + oneTimeTransferToken: '', + }; + + constructor() { + super(); + } + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + height: 100px; + color: ${cssManager.bdTheme('#333', '#fff')}; + } + + .main { + position: absolute; + top: 0px; + right: 0px; + left: 0px; + bottom: 0px; + display: flex; + justify-content: center; + align-items: center; + } + `, + ]; + + public render(): TemplateResult { + return html` + +
+ ${this.usedSubTemplate + ? this.usedSubTemplate + : html``} +
+ `; + } + + public async firstUpdated() { + await this.domtoolsPromise; + this.domtools.router.on(`/finishregistration`, async (routeArg) => { + this.storedData.validationTokenUrlParam = routeArg.queryParams.validationtoken; + if (!this.storedData.validationTokenUrlParam) { + this.usedSubTemplate = html` + You need a validation token, but we couldn't find one. Please contact workspace.global support. + `; + await this.domtools.convenience.smartdelay.delayFor(5000); + this.usedSubTemplate = html` Redirecting you to workspace.global support... `; + await this.domtools.convenience.smartdelay.delayFor(2000); + window.location.href = 'https://support.workspace.global'; + return; + } + // lets verify the info; + let tokenErrorMessage: string; + const resAfterRegEmailClicked = + await this.idpState.idpClient.requests.afterRegistrationEmailClicked + .fire({ + token: this.storedData.validationTokenUrlParam, + }) + .catch( + ( + err: typeof DeesElement['prototype']['domtools']['convenience']['typedrequest']['TypedResponseError']['prototype'] + ) => { + tokenErrorMessage = err.errorText; + return; + } + ); + + if (!resAfterRegEmailClicked || !resAfterRegEmailClicked.email) { + this.usedSubTemplate = html` + the supplied validation token does not match any registration sessions.
+ ${tokenErrorMessage ? html`Reason: ${tokenErrorMessage}` : null} + `; + await this.domtools.convenience.smartdelay.delayFor(5000); + this.usedSubTemplate = html`redirecting you for further support... `; + await this.domtools.convenience.smartdelay.delayFor(1000); + window.location.href = 'https://support.workspace.global'; + return; + } else { + this.storedData.email = resAfterRegEmailClicked.email; + } + + // lets continue with UI + this.usedSubTemplate = html` + + + + Next + + `, + validationFunc: async (stepperArg, elementArg) => { + const deesForm: plugins.deesCatalog.DeesForm = elementArg.querySelector('dees-form'); + deesForm.addEventListener('formData', async (eventArg: CustomEvent) => { + const response = await this.idpState.idpClient.requests.setData + .fire({ + token: this.storedData.validationTokenUrlParam, + userData: { + name: `${eventArg.detail.data.firstName} ${eventArg.detail.data.lastName}`, + connectedOrgs: null, + email: null, + status: null, + username: null, + }, + }) + .catch( + ( + errArg: typeof DeesElement['prototype']['domtools']['convenience']['typedrequest']['TypedResponseError']['prototype'] + ) => { + deesForm.setStatus('error', errArg.errorText); + } + ); + deesForm.setStatus('success', 'ok!'); + stepperArg.goNext(); + }); + }, + onReturnToStepFunc: async (stepperArg, stepElementArg) => { + const deesForm = stepElementArg.querySelector('dees-form'); + deesForm.setStatus('normal', 'Edit and Next'); + }, + }, + { + title: 'What is your mobile number?', + content: html` + + + Next + + `, + validationFunc: async (stepperArg, elementArg) => { + const deesForm: plugins.deesCatalog.DeesForm = elementArg.querySelector('dees-form'); + deesForm.addEventListener('formData', async (eventArg: CustomEvent) => { + const response = await this.idpState.idpClient.requests.mobileNumberVerification + .fire({ + token: this.storedData.validationTokenUrlParam, + mobileNumber: eventArg.detail.data.mobileNumber, + }) + .catch( + ( + errArg: typeof DeesElement['prototype']['domtools']['convenience']['typedrequest']['TypedResponseError']['prototype'] + ) => { + deesForm.setStatus('error', errArg.errorText); + } + ); + deesForm.setStatus('success', 'ok!'); + stepperArg.goNext(); + }); + }, + onReturnToStepFunc: async (stepperArg, stepElementArg) => { + const deesForm = stepElementArg.querySelector('dees-form'); + deesForm.setStatus('normal', 'Edit and Next'); + }, + }, + { + title: 'What is the Verification Code?', + content: html` + + + Next + + `, + validationFunc: async (stepperArg, elementArg) => { + const deesForm: plugins.deesCatalog.DeesForm = elementArg.querySelector('dees-form'); + deesForm.addEventListener('formData', async (eventArg: CustomEvent) => { + const response = await this.idpState.idpClient.requests.mobileNumberVerification.fire({ + token: this.storedData.validationTokenUrlParam, + verificationCode: eventArg.detail.data.verificationCode, + }); + + if (response.verficationCodeOk) { + deesForm.setStatus('success', 'ok!'); + stepperArg.goNext(); + } else { + deesForm.setStatus('error', 'wrong code!'); + await this.domtools.convenience.smartdelay.delayFor(3000); + deesForm.setStatus('normal', 'Retry And Next!'); + } + }); + }, + onReturnToStepFunc: async (stepperArg, stepElementArg) => { + stepperArg.goBack(); + const deesForm = stepElementArg.querySelector('dees-form'); + deesForm.setStatus('normal', 'Next'); + }, + }, + { + title: 'Create a secure password:', + content: html` + + + Next + + `, + validationFunc: async (stepperArg, elementArg) => { + const deesForm: plugins.deesCatalog.DeesForm = elementArg.querySelector('dees-form'); + deesForm.addEventListener('formData', async (eventArg: CustomEvent) => { + const response = await this.idpState.idpClient.requests.setData.fire({ + token: this.storedData.validationTokenUrlParam, + userData: { + username: null, + email: null, + name: null, + connectedOrgs: null, + status: null, + password: eventArg.detail.data.password, + }, + }); + const finishRegistrationResponse = + await this.idpState.idpClient.requests.finishRegistration.fire({ + token: this.storedData.validationTokenUrlParam, + }); + deesForm.setStatus('pending', 'User created!'); + await this.domtools.convenience.smartdelay.delayFor(500); + deesForm.setStatus('pending', 'Obtaining Refresh Token...'); + const loginResponse = await this.idpState.idpClient.requests.loginWithUserNameAndPassword.fire( + { + username: this.storedData.email, + password: eventArg.detail.data.password, + } + ); + this.storedData.refreshToken = loginResponse.refreshToken; + + deesForm.setStatus('pending', 'Obtaining JWT...'); + const jwtResponse = await this.idpState.idpClient.requests.obtainJwt.fire({ + refreshToken: this.storedData.refreshToken, + }); + + deesForm.setStatus('pending', 'Obtaining Transfer Token...'); + await this.idpState.idpClient.setJwt(jwtResponse.jwt); + await this.idpState.idpClient.getTransferTokenAndSwitchToLocation('https://sso.workspace.global/afterregistration'); + }); + }, + }, + ] as plugins.deesCatalog.IStep[]} + >`; + await this.domtools.convenience.smartdelay.delayFor(100); + }); + this.domtools.router.on('/', async () => { + this.usedSubTemplate = html`Hm, this is app is not meant for what you are trying to do :) `; + await this.domtools.convenience.smartdelay.delayFor(2000); + this.usedSubTemplate = html`Redirecting you now...`; + window.location.href = `https://workspace.global`; + }); + this.domtools.router._handleRouteState(); + } +} diff --git a/ts_web/elements/idp-logincontainer.ts b/ts_web/elements/idp-logincontainer.ts new file mode 100644 index 0000000..6518856 --- /dev/null +++ b/ts_web/elements/idp-logincontainer.ts @@ -0,0 +1,264 @@ +import * as plugins from '../plugins.js'; + +import { + customElement, + DeesElement, + property, + html, + type TemplateResult, + css, + cssManager, + query, +} from '@design.estate/dees-element'; + +import { commitinfo } from '../../dist_ts/00_commitinfo_data.js'; + +declare global { + interface HTMLElementTagNameMap { + 'wg-logincontainer': IdpLogincontainer; + } +} + +@customElement('idp-logincontainer') +export class IdpLogincontainer extends DeesElement { + public static demo = () => html``; + + @query('.loginPromptContainer') + loginPromptContainer: HTMLDivElement; + + @query('.loginManagerContainer') + loginManagerContainer: HTMLDivElement + + @query('.transferManagerContainer') + transferManagerContainer: HTMLDivElement + + public receptionClient = new plugins.idpClient.IdpClient('https://reception.lossless.one:443', { + appUrl: 'https://sso.workspace.global/', + description: 'the central sso app for workspace.global', + logoUrl: 'https://assetbroker.lossless.one/some', + name: 'sso.workspace.global', + id: null, + }); + + constructor() { + super(); + } + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + position: absolute; + width: 100%; + height: 100%; + } + + .mainContainer { + position: absolute; + top: 0px; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + opacity: 0; + transition: all 0.2s; + transition-delay: 0.2s; + transform: translate3d(0px, 20px, 0px); + pointer-events: none; + } + + .loginPromptContainer.show { + opacity: 1; + pointer-events: all; + transform: translate3d(0px, 0px, 0px); + } + + .loginManagerContainer.show { + opacity: 1; + pointer-events: all; + transform: translate3d(0px, 0px, 0px); + } + + .transferManagerContainer.show { + opacity: 1; + pointer-events: all; + transform: translate3d(0px, 0px, 0px); + } + + .loginblock { + max-width: 520px; + flex-grow: 1; + transform: translate3d(0px, 0px, 0px); + transition: all 0.2s; + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); + background: ${cssManager.bdTheme('#ffffff', '#181818')}; + border-top: 1px solid ${cssManager.bdTheme('#ffffff', '#333333')}; + border-radius: 16px; + overflow: hidden; + } + + img { + width: 130px; + min-height: 34.9px; + display: block; + margin: auto; + margin-top: 16px; + margin-bottom: 25px; + filter: ${cssManager.bdTheme('invert(1)', '')}; + } + + .legalinfo { + text-align: center; + margin: auto; + margin-top: 10px; + color: ${cssManager.bdTheme('#666', '#ccc')}; + font-size: 12px; + line-height: 100%; + padding: 8px; + background: ${cssManager.bdTheme('#f5f5f5', '#111')}; + border-top: 1px solid ${cssManager.bdTheme('#ccc', '#222222')}; + font-family: 'Hubot Sans'; + color: ${cssManager.bdTheme('#666', '#888')}; + } + + .legalinfo a { + color: ${cssManager.bdTheme('#666', '#ccc')}; + text-decoration: none; + } + `, + ]; + + render() { + return html` +
+
+ + +
+ Legal Info + | Company Website + | Support + | SSO v${commitinfo.version} +
+
+
+ +
+
+ +
+ Legal Info + | Company Website + | Support + | SSO v${commitinfo.version} +
+
+
+ +
+
+ + +
+ Legal Info + | Company Website + | Support + | SSO v${commitinfo.version} +
+
+
+ `; + } + + public async showComponent(componentNameArg: 'loginPrompt' | 'loginManager' | 'transferManager') { + const domtoolsInstance = await this.domtoolsPromise; + const containerItems: HTMLDivElement[] = [ + this.loginPromptContainer, + this.loginManagerContainer, + this.transferManagerContainer, + ]; + const show = async (itemArg: HTMLDivElement) => { + for (const containerItem of containerItems) { + if (containerItem !== itemArg) { + containerItem.classList.remove('show'); + } + } + await domtoolsInstance.convenience.smartdelay.delayFor(200); + itemArg.classList.add('show'); + await domtoolsInstance.convenience.smartdelay.delayFor(200); + }; + switch (componentNameArg) { + case 'loginPrompt': + await show(this.loginPromptContainer); + break; + case 'loginManager': + await show(this.loginManagerContainer); + break; + case 'transferManager': + await show(this.transferManagerContainer); + break; + } + } + + public async determineNextAction() { + const domtoolsInstance = await this.domtoolsPromise; + let action: plugins.idpInterfaces.data.TLoginAction; + if (domtoolsInstance.router.queryParams.getQueryParam('action')) { + action = domtoolsInstance.router.queryParams.getQueryParam('action'); + } + + if (window.location.pathname === '/afterregistration') { + await this.domtools.convenience.smartdelay.delayFor(1000); + await this.receptionClient.determineLoginStatus(); + await this.receptionClient.getTransferTokenAndSwitchToLocation('https://account.workspace.global') + } else if (!(await this.receptionClient.determineLoginStatus()) && action === 'login') { + this.showComponent('loginPrompt'); + } else if ((await this.receptionClient.determineLoginStatus()) && action === 'login') { + await this.showComponent('transferManager'); + const wgTransferManager = this.shadowRoot.querySelector('wg-transfermanager'); + await wgTransferManager.handleTransfer(); + } else if ((await this.receptionClient.determineLoginStatus()) && action === 'manage') { + this.showComponent('loginManager'); + } else if (action === 'logout') { + console.log('logging out, since requested action is "logout"'); + await this.receptionClient.logout(); + } else { + this.showComponent('loginPrompt'); + } + } + + public async firstUpdated() { + const domtoolsInstance = await this.domtoolsPromise; + await domtoolsInstance.convenience.smartdelay.delayFor(0); + console.log(`your are loggedin: ${await await this.receptionClient.determineLoginStatus()}`); + let appData: plugins.idpInterfaces.data.IApp; + + if (domtoolsInstance.router.queryParams.getQueryParam('appdata')) { + appData = domtoolsInstance.convenience.smartjson.parseBase64( + domtoolsInstance.router.queryParams.getQueryParam('appdata') + ); + } + + const wgLogin = this.shadowRoot.querySelector('wg-loginprompt'); + const wgTransferManager = this.shadowRoot.querySelector('wg-transfermanager'); + wgLogin.appData = appData; + wgTransferManager.appData = appData; + + await this.determineNextAction(); + wgLogin.jwtObserable.subscribe({ + next: async (jwtArg) => { + console.log('loggedIn'); + await this.receptionClient.storeJwt(jwtArg); + await this.determineNextAction(); + }, + }); + wgLogin.dispatchJwt(); + } +} diff --git a/ts_web/elements/idp-loginprompt.ts b/ts_web/elements/idp-loginprompt.ts new file mode 100644 index 0000000..fa48639 --- /dev/null +++ b/ts_web/elements/idp-loginprompt.ts @@ -0,0 +1,298 @@ +import * as plugins from '../plugins.js'; + +import { + customElement, + DeesElement, + property, + html, + type TemplateResult, + css, + cssManager, + state, + domtools, +} from '@design.estate/dees-element'; + +// third party catalogs +import '@uptimelink/webwidget'; + +import '@design.estate/dees-catalog'; +import { DeesForm, DeesFormSubmit, DeesInputText } from '@design.estate/dees-catalog'; + +declare global { + interface HTMLElementTagNameMap { + 'wg-loginprompt': WgLogin; + } +} + +@customElement('wg-loginprompt') +export class WgLogin extends DeesElement { + public static demo = () => html``; + public static receptionUrl = 'https://reception.lossless.one/typedrequest'; + + @property() + public activePane: 'login' | 'register' = 'login'; + + @property() + public productOfInterest: string; + + @property() + jwt: string; + + @property({ + reflect: true, + }) + appData: plugins.idpInterfaces.data.IApp; + + public jwtObserable = new domtools.plugins.smartrx.rxjs.Subject(); + + constructor() { + super(); + domtools.elementBasic.setup(); + } + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + color: ${cssManager.bdTheme('#333333', '#ffffff')}; + } + + .box { + opacity: 0; + cursor: pointer; + overflow: hidden; + transition: all 0.2s ease; + height: 0px; + } + + .box.active { + opacity: 1 !important; + height: 360px; + cursor: auto; + } + + .loginbox { + } + + .registerbox { + } + + .boxcontent { + margin: 0px 20px; + } + + .info { + text-align: center; + padding: 32px; + line-height: 1.5em; + font-size: 12px; + font-weight: 600; + color: #999; + } + + .registerButton { + display: block; + transition: all 0.2s ease; + will-change: transform; + cursor: pointer; + } + + .registerButton:hover { + color: #fff; + transform: scale(1.02); + } + `, + ]; + + public render(): TemplateResult { + return html` +
+
+ + + + +
+ You'll go here: ${this.appData ? html`${this.appData.appUrl}` : html``} +

{this.activePane = 'register'}}>You can also register for a new account.

+
+
+
+
+
+
+ + + + Send Verification Email +
+ Already have an account? +

{this.activePane = 'login'}}>Login instead.

+
+
+
+
+ `; + } + + public async firstUpdated() { + const domtoolsInstance = await this.domtoolsPromise; + const loginForm: DeesForm = this.shadowRoot.querySelector('#loginForm'); + const loginPasswordInput: DeesInputText = loginForm.querySelector('#loginPasswordInput'); + const loginSubmitButton: DeesFormSubmit = loginForm.querySelector('#loginSubmitButton'); + const setButtonText = async () => { + if (loginPasswordInput.value) { + console.log('updating text of loginprompt.') + loginSubmitButton.text = 'Login'; + } else { + loginSubmitButton.text = 'Send magic link (or enter password)'; + } + }; + loginForm.changeSubject.subscribe(() => { + console.log(`checking button text ${loginPasswordInput.value}`); + setButtonText(); + }); + setButtonText(); + } + + private login = async (valueArg: { emailAddress: string; passwordArg: string }) => { + // lets define the needed requests + const loginForm: DeesForm = this.shadowRoot.querySelector('#loginForm'); + const loginRequestWithUsernameAndPassword = + new domtools.TypedRequest( + WgLogin.receptionUrl, + 'loginWithEmailOrUsernameAndPassword' + ); + const loginRequestWithEmail = + new domtools.TypedRequest( + WgLogin.receptionUrl, + 'loginWithEmail' + ); + + // lets do the actual logging in + if (valueArg.emailAddress && valueArg.passwordArg) { + loginForm.setStatus('pending', 'logging in...'); + const response = await loginRequestWithUsernameAndPassword + .fire({ + username: valueArg.emailAddress, // TODO: rename to emailAddress + password: valueArg.passwordArg, + }) + .catch(() => { + loginForm.setStatus('error', 'could not log you in. Try Again!'); + return; + }); + if (!response) { + return; + } + if (response.refreshToken) { + loginForm.setStatus('pending', 'obtained refreshToken...'); + const jwt = await this.handleRefreshToken(response.refreshToken, 0); + if (jwt) { + loginForm.setStatus('success', 'obtained jwt.'); + } else { + loginForm.setStatus('error', 'something went wrong'); + } + } else { + } + } else if (valueArg.emailAddress && !valueArg.passwordArg) { + loginForm.setStatus('pending', 'sending magic link...'); + const response = await loginRequestWithEmail.fire({ + email: valueArg.emailAddress, + }); + if (response.status === 'ok') { + loginForm.setStatus('success', 'Please check your email!'); + } + console.log(response); + } + }; + + private register = async (valueArg: { emailAddress: string }) => { + const registrationForm: DeesForm = this.shadowRoot.querySelector('#registrationForm'); + registrationForm.setStatus('pending', 'registering...'); + const firstSignupRequest = + new domtools.TypedRequest( + WgLogin.receptionUrl, + 'firstRegistrationRequest' + ); + const response = await firstSignupRequest + .fire({ + email: valueArg.emailAddress, + productSlugOfInterest: this.productOfInterest, + }) + .catch((err) => { + registrationForm.setStatus('error', err.message); + return null; + }); + if (response.status === 'ok') { + registrationForm.setStatus('success', 'Please check your email!'); + } + console.log(response); + }; + + public async dispatchJwt(jwtArg?: string) { + if (jwtArg !== undefined) { + console.log(`dispatching jwt from loginprompt.`); + this.jwt = jwtArg; + await domtools.plugins.smartdelay.delayFor(200); + this.dispatchEvent( + new CustomEvent('leleLoginGotJwt', { + detail: { + jwt: this.jwt, + }, + }) + ); + this.jwtObserable.next(this.jwt); + } + } + + public async handleRefreshToken(refreshTokenArg: string, delayDispatchMillisArg = 0) { + // a refreshToken binds dierctly to a session. + // the refresh token is used on a continuous basis to get fresh and short-lived jwts + const refreshJwt = new domtools.TypedRequest( + WgLogin.receptionUrl, + 'refreshJwt' + ); + const responseJwt = await refreshJwt.fire({ + refreshToken: refreshTokenArg, + }); + + if (responseJwt.jwt) { + this.domtools.convenience.smartdelay.delayFor(delayDispatchMillisArg).then(() => { + this.dispatchJwt(responseJwt.jwt); + }); + return responseJwt.jwt; + } else { + return null; + } + } +} diff --git a/ts_web/elements/idp-transfermanager.ts b/ts_web/elements/idp-transfermanager.ts new file mode 100644 index 0000000..011c16b --- /dev/null +++ b/ts_web/elements/idp-transfermanager.ts @@ -0,0 +1,76 @@ +import * as plugins from '../plugins.js'; + +import { + customElement, + DeesElement, + property, + html, + type TemplateResult, + css, + cssManager, + state, + domtools, +} from '@design.estate/dees-element'; + +declare global { + interface HTMLElementTagNameMap { + 'wg-transfermanager': WgTransfermanager; + } +} + +@customElement('wg-transfermanager') +export class WgTransfermanager extends DeesElement { + + public appData: plugins.idpInterfaces.data.IApp; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + max-width: 520px; + margin-left: auto; + margin-right: auto; + color: ${cssManager.bdTheme('#333333', '#ffffff')}; + } + + .box { + cursor: pointer; + overflow: hidden; + transition: all 0.2s ease; + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); + border-radius: 3px; + margin-bottom: 20px; + height: 56px; + background: ${cssManager.bdTheme('#ffffff', '#181818')}; + border-top: 1px solid ${cssManager.bdTheme('#ffffff', '#333333')}; + text-align: center; + padding: 20px; + } + `, + ]; + + public render() { + return html` +
+ transfering +
+ `; + } + + public async handleTransfer() { + const domtoolsInstance = await this.domtoolsPromise; + const box = this.shadowRoot.querySelector('.box'); + const receptionClient = new plugins.idpClient.IdpClient(`https://reception.lossless.one:443`, this.appData); + const transferToken = await receptionClient.getTransferToken(); + box.textContent = 'got transfer token...'; + console.log(this.appData.appUrl); + const redirectUrl = domtoolsInstance.convenience.smarturl.Smarturl.createFromUrl(this.appData.appUrl, { + searchParams: { + 'transfertoken': transferToken, + } + }); + box.textContent = `redirecting to app...`; + window.location.href = redirectUrl.toString(); + } +} diff --git a/ts_web/elements/idp-welcome.ts b/ts_web/elements/idp-welcome.ts new file mode 100644 index 0000000..c39fa7e --- /dev/null +++ b/ts_web/elements/idp-welcome.ts @@ -0,0 +1,73 @@ +import * as plugins from '../plugins.js'; + +import { + customElement, + DeesElement, + property, + html, + cssManager, + unsafeCSS, + css, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('idp-welcome') +export class IdpWelcome extends DeesElement { + @property() + public someProperty = 'someProperty'; + + constructor() { + super(); + } + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + height: 100px; + color: #fff; + font-family: 'Geist Sans'; + } + :host([hidden]) { + font-family: 'Cal Sans'; + display: none; + } + + h1 { + text-align: center; + letter-spacing:0.0125em; + } + + .textbox { + margin: 24px auto; + width: 500px; + background: #111111; + border-radius: 8px; + padding: 24px; + } + + .textbox dees-button { + margin-top: 16px; + } + `, + ]; + + public render(): TemplateResult { + return html` + +

idp.global

+
+ idp.global is a Open Source identity provider for the world wide web. You can get the code if you want to improve it. + { + window.location.href = 'https://code.foss.global/idp.global/idp.global'; + }}>Get the code +
+
+ Do you want to sign in or register? + {}}>Sign In + {}}>Register +
+ `; + } +} diff --git a/ts_web/idp.state.ts b/ts_web/idp.state.ts new file mode 100644 index 0000000..3ef81f7 --- /dev/null +++ b/ts_web/idp.state.ts @@ -0,0 +1,17 @@ +import * as plugins from './plugins.js'; + +export class IdpState { + // STATIC + public static getSingletonInstance() { + if (!this.instance) { + this.instance = new IdpState(); + } + return this.instance; + } + + private static instance: IdpState; + + // INSTANCE + public receptionUrl = 'https://reception.lossless.one/typedrequest'; + public idpClient = new plugins.idpClient.IdpClient(this.receptionUrl); +} \ No newline at end of file diff --git a/ts_web/index.ts b/ts_web/index.ts new file mode 100644 index 0000000..1b37e36 --- /dev/null +++ b/ts_web/index.ts @@ -0,0 +1,61 @@ +import * as serviceworker from '@api.global/typedserver/web_serviceworker_client'; +import * as domtools from '@design.estate/dees-domtools'; + +import { html, render } from '@design.estate/dees-element'; +import { IdpWelcome } from './elements/idp-welcome.js'; + +const run = async () => { + const domtoolsInstance = await domtools.DomTools.setupDomTools(); + domtools.elementBasic.setup(); + domtoolsInstance.setWebsiteInfo({ + metaObject: { + title: 'idp.global', + description: + 'the code that runs idp.global', + canonicalDomain: 'https://idp.global', + ldCompany: { + name: 'Task Venture Capital GmbH', + status: 'active', + contact: { + address: { + name: 'Task Venture Capital GmbH', + city: 'Grasberg', + country: 'Germany', + houseNumber: '24', + postalCode: '28879', + streetName: 'Eickedorfer Vorweide', + }, + description: 'work', + name: 'Task Venture Capital GmbH', + type: 'company', + facebookUrl: 'https://www.facebook.com/undefined variable', + twitterUrl: 'https://twitter.com/undefined variable', + website: 'https://Task Venture Capital GmbH', + phone: '+49 421 16767 548', + }, + closedDate: null, + foundedDate: { + day: 1, + month: 1, + year: 2014, + }, + }, + }, + }); + + const serviceWorker = await serviceworker.getServiceworkerClient(); + + const mainTemplate = html` + + + `; + + render(mainTemplate, document.body); +}; + +run(); diff --git a/ts_web/plugins.ts b/ts_web/plugins.ts new file mode 100644 index 0000000..e4def94 --- /dev/null +++ b/ts_web/plugins.ts @@ -0,0 +1,17 @@ +// node native + +// project native +import * as idpInterfaces from '../dist_ts_interfaces/index.js'; +import * as leleReceptionclient from '../dist_ts_idpclient/index.js'; + +export { idpInterfaces, leleReceptionclient as idpClient }; + +// @api.global scope +import * as typedrequest from '@api.global/typedrequest'; + +export { typedrequest }; + +// @design.estate scope +import * as deesCatalog from '@design.estate/dees-catalog'; + +export { deesCatalog }; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..dfe5a55 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "useDefineForClassFields": false, + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "verbatimModuleSyntax": true + }, + "exclude": [ + "dist_*/**/*.d.ts" + ] +}